WordPress как на ладони
5 премиум тем, 7 плагинов, 4 лендинга и 45 дизайнерских блоков для WordPress с 96% скидкой. От TemplateMonster.com 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?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;
}
194 коммента
Полезные 8 Вопросы 2 Все
  • Олег

    сюда бы еще добавить пагинацию по страницам коментариев
    скажем у меня комментариев на сайте более 100
    на страницу вывожу по 10 штук и в низу пагинация по остальным коментариям

    Ответить3 года назад #
    • Kama6809

      Как её туда добавить? Ссылка на комментарий должна вести на конкретную страницу пагинации...

      Ответить3 года назад #
      • Олег

        так я не про ссылку на комментарий я про пагинацию
        пример -- все комменты на сайте 100 штук
        есть страница гди их все показываем но выводим на страницу по 10 штук
        а в низу пагинация по остальным комментариям (вложенные можно и не учитывать выводить с основным)

        Ответить3 года назад #
        • Олег

          я про -- Функция для вывода последних комментариев в WordPress.
          да и там вы забыли добавить теги

          Ответить3 года назад #
          • Олег

            теги

            <ul></ul>
            Ответить3 года назад #
            • Kama6809

              Теги я добавить не забыл, они добавляются при вызове, если вы обратите внимание на примеры использования, увидите что там не забыто ничего:

              <ul class='sb_comments sb_block'> 
              			<?php kama_recent_comments("limit=10&ex=30"); ?>
              		</ul>

              Нужно это, чтобы тегам можно было присвоить разные классы, в параметры функции это совать мне показалось лишним.

              Что касается пагинации, то вам нужно её сделать самостоятельно, с помощью get_comments(), а этот код не подразумевает пагинацию, то о чем вы говорите - это редкий, частный случай... И если разобраться, то эта функция вообще не нужна в WordPress, так как там есть get_comments() с очень многими настройками - можно вывести комментарии как угодно... Я эту функцию давно написал, когда еще get_comments() не был так гибок. А сейчас, я её правлю, чтобы эта запись не была совсем не нужно, сейчас бы я такой пост не писал...

              Ответить3 года назад #
              • Олег

                спасибо буду ковырять get_comments() хотя ваша фукция довольно полезная да и ваш сайт пожалуй лучший справочник по WordPress а теги извиняюсь я сам проглядел

                Ответить3 года назад #
  • Дмитрий

    Подскажите пожалуйста, как можно ли создать страницу со всеми комментариями (ну или хотя бы последние 100 комментариев), а то на сайте комментарии часто пишутся и многие пользователи не успевают их прочесть - вот и хотелось бы внизу вашего кода чтобы была ссылочка на "Последние 100 комментариев", например. Спасибо.

    Ответить3 года назад #
    • Kama6809

      Ну и вопрос... Создайте страницу в ВП, создайте для нее файл темы, вставьте туда код "последние 100 комментов". Под текущим кодом в сайдбаре вставьте ссылку на созданную страницу.

      Ответить3 года назад #
      • Дмитрий

        Я не разбираюсь в ВП, поэтому если не сложно, то опишите подробнее. Как именно создать для страницы файл темы и какой код туда именно вставить?

        Ответить3 года назад #
  • Oink cайт: wpcalc.com

    Kama, реально спасибо. Уже не первый год просматриваю сайт и учусь. smile
    А самое главное, что самому не надо ничего писать и придумывать laugh

    Ответить2.8 года назад #
  • Андрей

    Доброго времени суток. При внесении кода и соответственно запуска функционала существенно возросло количество обращений к базе данных (примерно на 20 запросов больше). Может быть имеется менее ресурсоёмкое решение?

    Ответить1.10 год назад #
    • Kama6809

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

      Ответить1.9 год назад #
  • @ elephant2 cайт: work-click.ru

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

    Ответить1.2 год назад #
    • campusboy2986 cайт: www.youtube.com/c/wpplus

      Можно, вот от чего можно оттолкнуться:
      1) Создать виджет, в методе widget использовать свои наработки.
      2) Создать шоткод на основе своих наработок и использовать его в привычном виджете "Текст".

      3
      Ответить1.2 год назад #
  • Перт Симпсон cайт: 24video.tube

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

    Ответитьгод назад #
    • в саму функцию добавляете get_the_date
      пример

      $out .= '
      <li>
      '. get_the_date( 'Y-m-d G:i:s',  $comm->comment_post_ID ) .'
      '. $grava .' <b>'. strip_tags( $comm->comment_author ) .':</b> 
      <a href="'. $com_url .'" title="к записи: '. esc_attr( $comm->post_title ) .'">'. $comtext .'</a>
      </li>';
      -1
  • prosto_kvasno

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

Здравствуйте, !     Войти . Зарегистрироваться