WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru

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

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

# Получим последние комментарии списком

Этот код получает последние 10 комментариев в виде списка UL. Где текст комментария укорочен до 50 символов и является ссылкой на сам комментарий:

$args = array(
	'number'  => 10,
	'orderby' => 'comment_date',
	'order'   => 'DESC',
	'status'  => 'approve',
	'type'    => 'comment', // только комментарии, без пингов и т.д...
);

if( $comments = get_comments( $args ) ){
	echo '<ul>';
	foreach( $comments as $comment ){
		$comm_link = get_comment_link( $comment->comment_ID ); // может быть тяжелый запрос ...
		$comm_short_txt = mb_substr( strip_tags( $comment->comment_content ), 0, 50 ) .'...';

		echo '<li>'. $comment->comment_author .': <a rel="nofollow" href="'. $comm_link .'">'. $comm_short_txt .'</a></li>';
	}
	echo '</ul>';
}

/*
Данные в объекте $comment
stdClass Object
(
	[comment_ID] => 9727
	[comment_post_ID] => 477
	[comment_author] => Andrew
	[comment_author_email] => mail@gmail.com
	[comment_author_url] => 
	[comment_author_IP] => 178.45.177.200
	[comment_date] => 2015-22-01 00:27:04
	[comment_date_gmt] => 2015-22-28 21:27:04
	[comment_content] => текст коммента
	[comment_karma] => 0
	[comment_approved] => 1
	[comment_agent] => Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
	[comment_type] => 
	[comment_parent] => 9724
	[user_id] => 313
)
*/

Измените этот код под себя. Если по каким-то причинам такой вариант не подходит, то все что ниже как раз для вас.

Специальная функция для вывода последних комментариев

Чтобы вывести последние комментарии я пользуюсь своей функцией, которая расположена ниже. Её нужно поместить в файл functions.php вашей темы.

/**
 * Функция для вывода последних комментариев в WordPress. 
 * ver: 0.1
 */
function kama_recent_comments( $args = array() ){
	global $wpdb;

	$def = array(
		'limit'      => 10, // сколько комментов выводить.
		'ex'         => 45, // n символов. Обрезка текста комментария.
		'term'       => '', // id категорий/меток. Включить(5,12,35) или исключить(-5,-12,-35) категории. По дефолту - из всех категорий.
		'gravatar'   => '', // Размер иконки в px. Показывать иконку gravatar. '' - не показывать.
		'user'       => '', // id юзеров. Включить(5,12,35) или исключить(-5,-12,-35) комменты юзеров. По дефолту - все юзеры.
		'echo'       => 1,  // выводить на экран (1) или возвращать (0).
		'comm_type'  => '', // название типа комментария
		'meta_query' => '', // WP_Meta_Query
		'meta_key'   => '', // WP_Meta_Query
		'meta_value' => '', // WP_Meta_Query
		'url_patt'   => '', // оптимизация ссылки на коммент. Пр: '%s?comments#comment-%d' плейсхолдеры будут заменены на $post->guid и $comment->comment_ID
	);

	$args = wp_parse_args( $args, $def );
	extract( $args );

	$AND = '';

	// ЗАПИСИ
	if( $term ){
		$cats = explode(',', $term );
		$cats = array_map('intval', $cats );

		$CAT_IN = ( $cats[ key($cats) ] > 0 ); // из категорий или нет

		$cats = array_map('absint', $cats ); // уберем минусы
		$AND_term_id = 'AND term_id IN ('. implode(',', $cats) .')';

		$posts_sql = "SELECT object_id FROM $wpdb->term_relationships rel LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id) WHERE 1 $AND_term_id ";

		$AND .= ' AND comment_post_ID '. ($CAT_IN ? 'IN' : 'NOT IN') .' ('. $posts_sql .')';
	}

	// ЮЗЕРЫ
	if( $user ){
		$users = explode(',', $user );
		$users = array_map('intval', $users );

		$USER_IN = ( $users[ key($users) ] > 0 );

		$users = array_map('absint', $users );

		$AND .= ' AND user_id '. ($USER_IN ? 'IN' : 'NOT IN') .' ('. implode(',', $users) .')';
	}

	// WP_Meta_Query
	$META_JOIN = '';
	if( $meta_query || $meta_key || $meta_value ){
		$mq = new WP_Meta_Query( $args );
		$mq->parse_query_vars( $args );
		if( $mq->queries ){
			$mq_sql = $mq->get_sql('comment', $wpdb->comments, 'comment_ID' );
			$META_JOIN = $mq_sql['join'];
			$AND .= $mq_sql['where'];
		}
	}

	$sql = $wpdb->prepare("SELECT * FROM $wpdb->comments LEFT JOIN $wpdb->posts ON (ID = comment_post_ID ) $META_JOIN
	WHERE comment_approved = '1' AND comment_type = %s $AND ORDER BY comment_date_gmt DESC LIMIT %d", $comm_type, $limit );

	//die( $sql );  
	$results = $wpdb->get_results( $sql );

	if( ! $results ) return 'Комментариев нет.';

	// HTML
	$out = $grava = '';
	foreach ( $results as $comm ){
		if( $gravatar )
			$grava = get_avatar( $comm->comment_author_email, $gravatar );

		$comtext = strip_tags( $comm->comment_content );
		$com_url = $url_patt ? sprintf( $url_patt, $comm->guid, $comm->comment_ID ) : get_comment_link( $comm->comment_ID );

		$leight = (int) mb_strlen( $comtext );
		if( $leight > $ex )
			$comtext = mb_substr( $comtext, 0, $ex ) .' …';

		$out .= '
		<li>
			'. $grava .' <b>'. strip_tags( $comm->comment_author ) .':</b> 
			<a href="'. $com_url .'" title="к записи: '. esc_attr( $comm->post_title ) .'">'. $comtext .'</a>
		</li>';
	}

	if( $echo )
		return print $out;
	return $out;
}

Примеры использования

#1 Выводим последние комментарии

<ul>
	<?php kama_recent_comments("limit=10&ex=40"); ?>
</ul>

10 - это количество комментариев, которые будут показаны, а 40 - сколько символов из текста комментария будет выведено. Символы считаются после того, как из текста были вырезаны все HTML теги, чтобы сохранить равную длину текстов.

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

Также в функции можно включать/исключать комменты к записям из указанных рубрик/меток/произвольных таксономий. ЗА это отвечает параметр term, указывать нужно id рубрик (увидеть их можно в админке в разделе "рубрики"). Для исключение перед id ставится "-":

<ul>
	<?php kama_recent_comments("limit=10&ex=40&term=5,10,34"); ?>
</ul>

Выведет 10 комментариев, с длинной текста до 40 символов, для постов из рубрик 5,10,34. Чтобы исключить эти рубрики нужно будет вызвать функцию так:

<ul>
	<?php kama_recent_comments("limit=10&ex=40&term=-5,-10,-34"); ?>
</ul>

Выведет 10 комментариев, с длинной текста до 40 символов, для всех постов, кроме постов из рубрик 5,10,34.

Одновременно включать и исключать рубрики нельзя! Впрочем, это лишено здравого смысла smile

#3 Возвращаем результат

Если нужно возвратить результат для дальнейшей обработки в php, а не выводить на экран, то параметр echo ставим в 0:

<?php kama_recent_comments('echo=0'); ?>

#4 Аватарки

Если нужно включить показ аватарок из сервиса gravatar, то указываем параметр gravatar как размер необходимой аватарки. Например, 20 - активирует показ аватарок и выведет аву шириной и высотой в 20px.

<ul>
	<?php kama_recent_comments('gravatar=20'); ?>
<ul>

1 6 2015
Полностью переписал функцию... Доп параметры и т.д.

9 ноября 2010
Добавил аватарки от сервиса gravatar.com в вывод функции.

13 июня 2010
Обновил код функции, до этого к тексту комментария добавлялось троеточие, даже если текст был короче чем выводимая длина. Теперь, если комментарий короче заданной длинны, то троеточие не добавляется.

21 августа 2010
По просьбе Анатолия v, добавил возможность выводить комментарии для постов из определенных рубрик (включать рубрики) или исключать комментарии к постам из определенных рубрик (исключать рубрики)

Функция для вывода последних комментариев из текущей категории

Эта старая функция, если работает то используйте, если не работает, то пользуйтесь функцией выше - kama_recent_comments().

/**
 * Функция для вывода последних комментариев из текущей категории.
 * 
 * Автор: Kama
 * ver: 0.1
 * 
 * Как работает:
 * в рубрике, выводит комменты из текущей и дочерних рубрик
 * в посте, выводит комменты из рубрик к которым принадлежит пост, работает если пост из нескольких рубриках
 * в постах дочерние рубрики рубрик поста не учитываются
 * Пример: echo kama_recent_comments_from_current_cat(10, 45, $gravatar='');
 */
function kama_recent_comments_from_current_cat( $limit=10, $ex=45, $gravatar=0 ){
	global $post, $cat, $wpdb;

	$limit = (int) $limit;
	$ex    = (int) $ex;

	// для дочерних рубрик
	if( $cat && $child_terms = get_categories( array('child_of' => $cat) ) )
		foreach( $child_terms as $term )
			$cat .= ','. $term->term_id;

	// для постов
	if( !$cat && is_singular() && $terms = get_the_category( $post->ID ) )
		foreach( $terms as $term )
			$cat .= $term->term_id . ',';

	$cat = rtrim($cat, ',');

	$JOIN = $AND = '';
	if( $cat ){
		$IN   = (strpos($cat,'-')===false) ? "IN ($cat)" : "NOT IN (". str_replace('-', '', $cat) .")";
		$JOIN = "LEFT JOIN $wpdb->term_relationships rel ON (p.ID = rel.object_id) LEFT JOIN $wpdb->term_taxonomy tax ON (rel.term_taxonomy_id = tax.term_taxonomy_id)";
		$AND  = "AND tax.taxonomy = 'category' AND tax.term_id $IN";
	}

	$sql = "SELECT * FROM $wpdb->comments com
	LEFT JOIN $wpdb->posts p ON (com.comment_post_ID = p.ID) $JOIN
	WHERE comment_approved = '1' AND comment_type = '' $AND
	ORDER BY comment_date_gmt DESC LIMIT $limit"; 

	$results = $wpdb->get_results( $sql );

	$out = $grava = '';
	foreach( $results as $comm ){
		if( $gravatar )
			$grava = get_avatar( $comm->comment_author_email, $gravatar );

		$comtext = strip_tags( $comm->comment_content );
		$leight = (int) mb_strlen( $comtext );
		if( $leight > $ex )
			$comtext = mb_strlen( $comtext, 0, $ex, 'UTF-8' ) .' …';

		$out .= '
		<li>
			'. $grava .'<b>'. strip_tags($comm->comment_author) .':</b> 
			<a href="'. get_comment_link($comm->comment_ID) .'" title="к записи: '. esc_attr($comm->post_title) .'">'. $comtext .'</a>
		</li>';
	}

	return $out;
}
193 коммента
Полезные 8 Вопросы 1 Все
  • Александр

    Скажите, как можно совместить этот код и ваш же плагин, который делает миниатюры записи? То есть чтобы вместо граватарки выводилась миниатюра записи заданного размера. Куда нужно вставить kama_thumb_img()?

    Ответить2.Май.2013 20:51 #
    • Kama7746

      замените foreach часть кода на это:

      foreach ($results as $comment){
      		$image = kama_thumb_img("w=88&h=88&class=alignleft&post_id=".$comment->comment_post_ID);
      		$comtext = strip_tags($comment->comment_content);
      		$leight = (int) iconv_strlen( $comtext, 'utf-8' );
      		if($leight > $ex) $comtext =  iconv_substr($comtext,0,$ex, 'UTF-8').' …';
      		$out .= "\n<li>$image<b>".strip_tags($comment->comment_author). ": </b><a href='". get_comment_link($comment->comment_ID) ."' title='к записи: {$comment->post_title}'>{$comtext}</a></li>";
      	}
      Ответить2.Май.2013 20:55 #
  • livsi

    Здравствуйте. Подскажите как вы делите комментарии на вопросы, и комментарии

    Ответить3.Авг.2013 21:59 #
    • Kama7746

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

      Ответить4.Авг.2013 00:32 #
  • Валентин

    Привет всем! Хочу по благодарить за работу автора, часто пользуюсь вашим сайтом для работы с wordpress.
    Я воспользовался вашим скриптом для комментариев, но обнаружил одну ошибку которая не выводит граватар, то есть он выводится как квадрат с разным цветом для каждого коммента. В строке - $grava = 'comment_author_email) .'?s=$gravatar&default=" alt="" width="'. $gravatar .'" height="'. $gravatar.'" />';

    нужно изменить в формировании ссылки вывод size, короче говоря нужно написать вод так:
    $grava = 'comment_author_email) .'?size='.$gravatar.'&default=" alt="" width="'. $gravatar .'" height="'. $gravatar.'" />';

    Еще раз спасибо за вашу работу автор. good

    Ответить7.Сен.2013 14:43 #
  • Ash Grey voito.ru

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

    $grava = '<img src="http://www.gravatar.com/avatar/'. md5($comment->comment_author_email) .'?size=$gravatar&default=" alt="" width="'. $gravatar .'" height="'. $gravatar.'" />';

    на другую строчку:

    $grava = '<img src="http://www.gravatar.com/avatar/'. md5($comment->comment_author_email) .'?s='.$gravatar.'&amp;d=identicon&amp;r=G" alt="" width="'. $gravatar .'" height="'. $gravatar.'" />';
    Ответить29.Сен.2013 16:21 #
    • Ash Grey voito.ru

      Отобразилось не все символ "&" заменяем на "&amp;"

      Ответить29.Сен.2013 16:22 #
  • Роман health-bit.ru

    Огромное спасибо за код! Установил, все работает как надо! smile

    Ответить4.Окт.2013 19:47 #
  • Дима

    Спасибо, работает! smile

    Ответить6.Ноя.2013 03:49 #
  • Dimentor

    Никак не могу решить проблему вывода последних комментариев на отдельную страницу.
    Создал шаблон, вот его код:

    <div class="post-meta" id="post-">

    <?php wp_link_pages('before=&after='); ?>

    <!-- POST META END -->

    Не найдено

    Извините, но по Вашему запросу ничего не было найдено.

    ПОМОГИТЕ

    Ответить16.Июн.2014 23:36 #
  • макс158 wp-panda.com

    вывод граватара надо подредактировать, в таком виде комментарии оставленные через рекламируемый на данном сайте Cackle, граватар показывать не будут.

    надо так $grava = 'comment_author_email) ) ) .'?size=' . $gravatar . '?default=mm" alt=""/>';

    Ответить16.Июл.2014 18:15 #
    • Kama7746

      Спасибо за комментарий. Но что-то не понятно куда и как точно вставить?

      Ответить17.Июл.2014 02:34 #
  • Максим

    Уважаемый KAMA, а не подскажете, как сделать чтоб эта функция выводила картинку дефолтного аватара, который указан в настройках ВП, а не дефолтный аватар с Граватара (у Вас указан d=identicon)? Я понимаю, что дефолтные аватары совпадают и в ВП и в Граватаре, но дело в том, что у меня свой дефолтный аватар smile

    Ответить18.Авг.2014 13:28 #
    • Максим

      Сам спросил, сам отвечу smile
      После d= надо прописать путь к дефолтной картинке (как это сделать написано в мануале на Граватаре вот тут)

      Ответить18.Авг.2014 13:43 #
  • Михаил artstorm.su

    Вечер добрый, а как изменить SQL запроc, чтобы выводились комментарии только к статьям залогиненного пользователя? )

    Ответить28.Авг.2014 21:03 #
    • Михаил artstorm.su

      Сам задал сам ответил ))

      $AV = $current_user->ID;
      $sql = "SELECT comment_ID, comment_post_ID, comment_content, post_title, post_author, guid, comment_author, comment_author_email
      FROM $wpdb->comments com
      LEFT JOIN $wpdb->posts p ON (com.comment_post_ID = p.ID) {$join}
      WHERE comment_approved = '1'
      AND p.post_author = '$AV'
      AND comment_type = '' {$and}
      ORDER BY comment_date DESC
      LIMIT $limit";
      Ответить28.Авг.2014 22:11 #