Как вывести последние из комментируемых постов с последними комментариями

Пример кода, позволяющего показать последнюю активность комментаторов в блоге -- вывести последние прокомментированные посты и последние комментарии в них.
👍 Научим бесплатно правильно создавать сайты на WordPress. Подробнее →

Пользователь gelez посоветовал:

Для вашего блога есть совет. На главной, у вас выводятся последние комментарии, если в одной теме идет постоянное общение, то комментарии других тем просто скрываются. Полезнее, как мне кажется, сделать отображение одного последнего комментария для одной темы, и тогда в вашем примере, будут отображаться последние комменты с пяти тем, а сейчас там я и вы настрочили комментарии )))

Да, при выводе последних комментариев при большой активности в одном посте получается так, что комментарии из этого поста заполняют весь список последних комментариев, ограниченный определенным количеством, и у посетителей складывается впечатление, что комментируется только один пост. На самом деле могут комментироваться несколько постов, просто если в одном из них идет активное обсуждение, то оно заполняет весь список последних комментариев на главной странице. Поэтому в данном случае будет полезнее выводить не список последних комментариев, а список постов, которые были недавно прокомментированы.

Воспользовавшись советом пользователя, я переделал список последних комментариев, превратив его в показатель последней активности комментаторов в постах — теперь отображаются не просто последние комментарии, а посты, которые были недавно прокомментированы, дополненные последними комментариями из этих постов. Думаю, что такой вывод более показателен и информативен.

Как вывести последние из комментируемых постов с последними комментариями

Если вы хотите выводить такой список активности у себя в блоге, то я вам расскажу, как его сделать.

Для вывода списка нужно научиться выводить определенное количество постов, сортируя их по датам последних комментариев. Это можно сделать с помощью параметров в запроса query, которые помогут сортировать посты в порядке даты публикации последнего комментария. Чтобы не выдумывать велосипед, который уже давно катается по улицам, я воспользовался кодом, который придумал Kevin Ingersoll для плагина Filter By Comments. Плагин давний, но продолжает работать, так как не имеет привязок к каким-то версиям WordPress, а всего лишь создает несколько фильтров, с помощью которых можно сортировать посты по дате последнего комментария и количеству комментариев.

Добавьте в файл functions.php следующий код:

// construct
FilterByComments::getInstance();


class FilterByComments {
  
  static function getInstance() {
    static $instance;
    return $instance ? $instance : $instance = new self;
  }
  
  private function __clone() {}
  
  
  protected function __construct() {
    add_filter('query_vars', array(&$this, 'query_vars'));
    add_filter('posts_fields', array(&$this, 'posts_fields'));
    add_filter('posts_where', array(&$this, 'posts_where'));
    add_filter('posts_join', array(&$this, 'posts_join'));
    add_filter('posts_orderby', array(&$this, 'posts_orderby'));
  }
  
  
  function query_vars($vars) {
    $vars[] = 'comment_count';
    $vars[] = 'comment_count_compare';
    $vars[] = 'orderby_last_comment';
    $vars[] = 'orderby_last_activity';
    return $vars;
  }
  
  function posts_fields($sql) {
    global $wpdb;
    if(get_query_var('orderby_last_activity')) {
      // might be faster, but inacodeurate when post date is altered, i.e. future-publish posts
      //return $sql.', IFNULL(`last_comment`.`date`, `'.$wpdb->posts.'`.`post_date`) AS `last_activity`';
      
      return $sql.', GREATEST(`'.$wpdb->posts.'`.`post_date`, IFNULL(`last_comment`.`date`, 0)) AS `last_activity`';
    }
    return $sql;
  }
  
  function posts_where($sql) {
    global $wpdb;
    if(is_numeric($count = get_query_var('comment_count'))) {
      $compare = get_query_var('comment_count_compare');
      return ($sql !== '' ? $sql.' AND ' : '').$wpdb->prepare('`'.$wpdb->posts.'`.`comment_count` '.(in_array($compare, array('!=', '>', '>=', '<', 'comments.'` WHERE `comment_approved`="1" GROUP BY `post`) AS `last_comment`
          ON `last_comment`.`post` = `'.$wpdb->posts.'`.`ID`
      ';
    }
    return $sql;
  }
  
  function posts_orderby($sql) {
    if(get_query_var('orderby_last_comment')) {
      return '`last_comment`.`date` DESC'.($sql !== '' ? ', '.$sql : '');
    }
    elseif(get_query_var('orderby_last_activity')) {
      return '`last_activity` DESC'.($sql !== '' ? ', '.$sql : '');
    }
    return $sql;
  }
  
}

Все, теперь вы можете выводить посты в порядке их комментирования. Ну а чтобы показать не просто голый список постов, а еще и вывести к каждому посту последний комментарий, я собрал следующий код, который нужно вставить в файл, отвечающий за вывод этого списка (у меня это шаблон главной страницы):

          
            
            <div class="activity-div-item">
            <a target="_blank" rel="nofollow" href="" target="_blank" rel="nofollow"  target="_blank" rel="nofollow"  class="start-page-post-link" title="" ></a>
            ID . '&number=1');
              if ($comments) {
                foreach ($comments as $comment) {
                  $url = '<a target="_blank" rel="nofollow noopener" href="" class="last-posts-div-first-table-td2-div-table-td1-h1-post-tile-link start-page-post-link">comment_post_ID).'#comment-'.$comment->comment_ID .'" title="'.$comment->comment_date.' к записи «'.get_the_title($comment->comment_post_ID).'»">';
                  $img_w ='64';
                  echo '<div class="comments-item">';
                  echo '<table class="comments-item-table"><tbody><tr>';
                  echo '<td class="comments-item-table-td1">';
                  echo '<div>';
                  echo get_avatar( $comment->comment_author_email, $img_w);
                  echo '</a></div>';
                  echo '</td>';
                  echo '<td class="comments-item-table-td2">';
                  echo '<div class="comments-item-table-td2-author">';
                  echo $comment->comment_author;
                  echo '</div>';
                  echo $url;
                  echo '<div class="comments-item-table-td2-text">';
                  echo strip_tags(mb_substr(apply_filters('get_comment_text', $comment->comment_content), 0, 120));
                  echo '… </div> ';
                  echo '</a>';
                  echo '</td>';
                  echo '</tr></tbody></table>';
                  echo '</div>';
                }
              }
            ?>              
            </div>
            
            
          

Теперь поподробнее об этом коде. В первой строчке есть несколько параметров, которые определяют списко постов:

  • orderby_last_comment=1 — этот параметр формируется кодом, который мы вставили в файл functions.php. Он сортирует посты по дате последнего комментария.
  • posts_per_page=5 — параметр определяет, сколько нужно выводить постов. В нашем случае выводится пять недавно прокомментированных постов.
  • caller_get_posts=1 — параметр определяет, с какого по счету поста нужно начинать список. В нашем случае список выводится, начиная с первого поста.

С пятой по 32 строчку идет код, отвечающий за вывод последних комментариев из каждого поста. В нем есть несколько параметров:

  • number=1 — этот параметр в строке 6 определяет, сколько комментариев нужно выводить. В моем случае из каждого поста, прокомментированного недавно, выводится по одному последнему комментарию. Вы можете изменить эту цифру до нужного вам количества. Если вы поставите цифру большую, нежели чем реальное количество комментариев в посте, то будет выведено только то количество комментариев, которое есть в посте.
  • $img_w =’64’ — этот параметр в строке 10 указывает, какого размера аватар будет выводиться рядом с автором комментария. В моем случае аватар имеет размер 64 на 64 px.
  • Код strip_tags(mb_substr(apply_filters(‘get_comment_text’, $comment->comment_content), 0, 120)) в строке 24 чистит содержимое комментариев — удаляет html-разметку и шорткоды, и грамотно обрезает длину комментария до 120 символов.

Манипулируя вышеприведенными параметрами, а так же создав с помощью CSS оформление, вы можете получить красивый вывод последних прокомментированных постов, дополнив каждый из постов выводом последних комментариев из него.

Создай свой первый сайт на WordPress

tiaurus

Автор n-wp.ru — блога о WordPress для новичков.

Оцените автора
Добавить комментарий

  1. Лена

    Добрый день. Все скопировала. Работает, но выводит помимо постов с комментами просто последние посты. Как их убрать?

    Ответить
  2. Лена

    Вопрос снимаю, не существенно, когда колличество комментов в общем на сайте станет 5, тогда соответственно и не будет вывод пустых постов, у меня просто мало комментов было. Спасибо

    Ответить
  3. Олег

    Круто! мне бы кто помог такое осуществить )

    Ответить
×
WordPress:
прокачай свой сайт!

Скидка на премиум темы и плагины

Успей забрать скидку ⋙