WordPress как на ладони
wordpress jino

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

Начну с того, что комментарии в 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?all_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 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 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;
}
Функция для вывода последних комментариев 204 комментария
Полезные 8 Вопросы 6 Все
  • elephant1 cайт: work-click.ru @

    Вывел последние комменты с помощью первого способа(get_comments) + добавил еще вывод даты в нужном формате. Все ок! Можно ли такую задачу реализовать виджетом? Так как стандартный виджет выводит только автора и ссылку на коммент, а дату или миниатюру нет.

  • Перт Симпсон cайт: 24video.tube

    Подскажите а как добавить дату оставления комментария?

    1
    Ответить3 месяца назад #
  • prosto_kvasno

    Подскажите, функция все так же возвращает все комментарии подряд из одного статьи или можно как-то сделать так, чтобы показывался только последний комментарий из каждой статьи, где он был оставлен. Пример, 10 человек оставили по комментарию в одной статье, и теперь в "последних комментариях" выводятся все десять комментариев (они же последние). Мне нужно сделать так, чтобы выводился только последний оставленный, а остальные 9 не попадали в выборку, а освободившееся место занимали последние комментарии из других статей. Извините, как смог, так и объяснил ))

    Ответить15 дней назад #

Здравствуйте, !

Ваш комментарий