WordPress как на ладони
Недорогой хостинг для сайтов на WordPress: wordpress.jino.ru WPmentor - Ищем топовых специалистов по WordPress, чтобы помочь вам заработать

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

 С версии WordPress 2.8 функцию можно заменить смотрите параметр orderby у get_posts("orderby=comment_count")

Очередная функция о выводе постов. На этот раз функция рассчитана на вывод постов по количеству комментариев.

Решил написать эту функцию, потому что полностью удовлетворяющего мне аналога в сети найти я не смог. Впрочем, я и не искал усердно - легче свой велосипед сделать, он сердцу ближе smile.

Функции которые предлагаются в сети, то не совсем правильные, то совсем неправильные или неудобные, или это вообще плагин smile. Не совсем правильные, потому что реализация запроса к БД, рассчитаны на старые версии WordPress, где поля comment_count в таблице wp_posts еще, видимо, не было предусмотрено, от чего запрос получается громоздким. Например, подобный запрос делается в этом примере.

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

/* Функция для вывода постов по количеству комментариев
--------------------------------------------------------
Параметры передаваемые функции (в скобках указано дефолтное значение):
post_num (5) = количество ссылок
format ('') = {date:j.M.Y} - {a}{title}{/a} ({comments})
$days (0) = за последние n дней. Пример: $days=30 выведет посты за последние 30 дней. Или указиваем год за который нужно вывести комментарии. Пример:2009
cache ('') = включить кеш (по умолчанию выключен), указываем 1, чтобы включить
$post_type ('post') = тип записей
---
Вызываем функцию примерно так:
<?php echo kama_most_commented_posts(10, '{a}{title}{/a} <sup>{comments}</sup>', 0, 31); ?>
*/
function kama_most_commented_posts($post_num=10, $format='', $days=0, $cache='', $post_type='post'){
	global $wpdb;

	if( $cache ){
		$key = (string) md5( $post_num . $format . $days . $post_type );
		if ( $cache_out = wp_cache_get($key, __FUNCTION__) )
			return $cache_out;
	}

	if($days){
		$AND_days = "AND post_date > CURDATE() - INTERVAL $days DAY";
		if(strlen($days)==4)
			$AND_days = "AND YEAR(post_date)=" . trim($days);
	}
	$sql = "SELECT ID, post_title, post_date, comment_count, guid
		FROM $wpdb->posts p
		WHERE post_status = 'publish' AND post_type = '$post_type' $AND_days
		ORDER BY comment_count DESC ".
		($post_num ? " LIMIT $post_num" : '');
	$res = $wpdb->get_results($sql);

	if(!$res) return false;

	// Формировка вывода
	if( $format ) preg_match ('!{date:(.*?)}!', $format, $date_m);
	foreach ($res as $pst){
		if($pst->comment_count==0) continue; 

		$x == 'li1' ? $x = 'li2' : $x = 'li1';
		$title = esc_attr($pst->post_title);
		$a = "<a href='". get_permalink($pst->ID) ."' title='$title'>";

		$Sformat = "$a$title ($pst->comment_count)</a>";
		if($format){
			$replacement = array( 
				'{title}'     => $title
				,'{a}'        => $a
				,'{/a}'       => '</a>'
				,'{comments}' => $pst->comment_count
			);
			if($date_m)
				$replacement[$date_m[0]] = apply_filters('the_time', mysql2date($date_m[1], $pst->post_date));

			$Sformat = strtr($format, $replacement);
		}
		$out .= "<li class='$x'>$Sformat</li>";
	}
	if( !$out ) 
		return "<li>Нет записей с комментариями</li>";

	if( $cache )
		wp_cache_add($key, $out, __FUNCTION__);

	return $out;
}

После того, как функция успешно установлена в functions.php, её нужно вызвать так:

<ul>
	  <?php echo kama_most_commented_posts(10); ?>
</ul>

В результате, мы получим список (оформленный в HTML теги li) из 10 ссылок на посты с наибольшем количеством комментариев. Если вместо 10 поставить 0, то будут выведены все комментарии, без ограничения (может пригодится если ограничивать вывод по году)

Расширенные настройки функции вывода постов по количеству комментариев

Устанавливаем формат вывода

Вторым параметром функции можно передать формат вывода, например:

<ul>
	  <?php echo kama_most_commented_posts(10, '{a}{title}{/a} <sup>{comments}</sup> ? {date:j.M.Y}'); ?>
</ul>

Выведет список ссылок в таком формате:

Так будет выглядеть в HTML коде:

<ul>
	<li><a href="УРЛ">Название статьи</a> <sup>25</sup> ? 25 ноября 2010</li>
	<li><a href="УРЛ">Название другой статьи</a> <sup>12</sup> ? 23 октября 2010</li>
</ul>

Как форматировать дату можно посмотреть на этой странице кодекса WordPress.

Ограничиваем выборку самых комментируемых постов количеством дней или выводим по году

Если нам нужно вывести самые комментируемые посты за, предположим, последние 60 дней, то вызываем функцию так:

<ul>
	  <?php echo kama_most_commented_posts(10, '', 60); ?>
</ul>

Если нужно вывести посты, например, за 2009 год, то вызываем так:

<ul>
	  <?php echo kama_most_commented_posts(0, '', 2009); ?>
</ul>

Включаем кэш

Если используются плагины кэширования запросов, совместимые со стандартным кэшем WordPress, то устанавливаем четвертый параметр функции, ставим 1:

<ul>
	  <?php echo kama_most_commented_posts(10, '', 0, 1); ?>
</ul>

Теперь, вывод функции будет кэшироваться

Выбираем какой тип самых комментируемых записей мы хотим вывести

Предположим, нам нужно вывести самые комментируемые страницы (не посты) или у нас есть тип записей отличный от постов (post), скажем, newpost_type. Тип записей по которому будет проходить выборка задается в последнем параметре:

<ul>
	  <?php echo kama_most_commented_posts(10, '', 30, 0, 'newpost_type'); ?>
</ul>

Вопросы?

28 комментов
Полезные 2 Все
  • eavasi www.eavasi.ru

    Тимур, ты как будто мои мысли читаешь. Изобретаешь именну ту функцию, о которой думаю я в данное время.
    У меня выводятся самые комментируемые посты. Выводятся с помощью плагина Customizable Post Listings, последнее обновление которого было в апреле 2008 и скорее всего количество постов в этом плагине выбирается через обходные пути и с огромным количеством запросов к базе.
    Вечером буду прикручивать твою новую функцию. Одновременно разделю самые комментируемые посты по годам. Получится прикольно. Должно получится, по крайней мере.
    Огромное тебе спасибо, Тимур.
    Если будут затруднения с прикруткой, буду приставать к тебе через комменты.
    зы. Тимур, напиши гостевой постик, маленький, 500 знаков например.

    Ответить28.Ноя.2010 в 09:38 #
    • Kama7682

      Пожалуйста! Обращайся чуть что.
      Насчет поста подумаю, авось что и придумаю smile

      Ответить28.Ноя.2010 в 10:07 #
      • eavasi www.eavasi.ru

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

        Ответить28.Ноя.2010 в 15:56 #
        • Kama7682

          Пардон, "запятая не в том месте оказалась" smile Поправил, вызывается так:

          <ul>  
          	 <?php echo kama_most_commented_posts(0, '', 2009); ?>  
          </ul>

          П.С. Название функции поменял

          Ответить28.Ноя.2010 в 19:31 #
  • eavasi www.eavasi.ru

    Тимур, как вывести самые комментируемые посты не за последние Н-дней, а за конкретный период, например за 2008 или 2009 годы?

    Ответить28.Ноя.2010 в 09:59 #
    • Kama7682

      Дополнил функцию вызывается так:

      <ul>  
      	 <?php echo kama_most_commented_posts(0, '', 2009); ?>  
      </ul>
      Ответить28.Ноя.2010 в 14:53 #
      • eavasi www.eavasi.ru

        О! Просто замечательно! Ты, Тимур, исполнитель желаний, а стало быть волшебник! Спасибо!

        Ответить28.Ноя.2010 в 15:32 #
  • eavasi www.eavasi.ru

    И еще, Тимур, как будет вести себя функция со включенным кешированием при наличии работающего MaxCache Script?

    Ответить28.Ноя.2010 в 10:02 #
    • Kama7682

      С MaxCache не нужно включать кэш - смысла нет абсолютно, там же вся страница кэшируется.

      Ответить28.Ноя.2010 в 10:08 #
  • Zyama

    Очень много идет запросов к базе данных! порядка 15!!! надо какой-то другой вариант искать...

    Ответить06.Фев.2011 в 18:53 #
    • Kama7682

      Ну не знаю, что у вас там настроено и как, но эта функция делает 1 запрос чтобы получить данные: $wpdb->get_results($sql).

      Ответить06.Фев.2011 в 19:50 #
  • Allpa allpa.ru

    Спасибо за функцию, дружище!
    Только она у меня как-то странно работает — не выдаёт кол-во каментов, а ставит буквы n, t или nt.
    Можно глянуть у меня на Главной, например (allpa.ru), в самом низу, второй блок "Популярное, много отзывов". Чо делать?

    Ответить25.Сен.2011 в 19:07 #
    • Kama7682

      Карамба, что я вижу — новый дизайн, напичканный всякими няшками! Давно я на твоем блоге не был blush

      Поправил функцию: просто замени код. У меня чет во всех статьях слэши удалились, от сюда эти n,t.

      Ответить25.Сен.2011 в 20:37 #
      • Allpa allpa.ru

        напичканный всякими няшками!

        Ага. Только приходится юзать плаг PHP Widget, чтобы юзать все твои вкусности sad Если в обычном шаблоне я без проблем запихивала коды прямо в файлы footer или sidebar, то тут шиш, тут всё на виджетах.

        просто замени код

        Слушай, а можно вывести кол-во каментов из ссылки? То есть тайтл поста - ссылка, а количество каментов - уже нет?
        Я там тебе письмишки поскидывала? Получил? Одно вчера из контактной формы на блоге: тоже был вопросец по другой функции smile

        Ответить25.Сен.2011 в 20:59 #
        • Kama7682

          WooThemes все на виджетах заточены — мне тоже не нравятся виджеты очень, однако говорят что это удобно unknw

          кол-во каментов из ссылки

          При вызове функции укажи второй параметр:

          <ul>  
          	  <?php echo kama_most_commented_posts(10, '{a}{title} ({comments}){/a}'); ?>  
          </ul>

          В статье на эту тему пример есть вроде.

          Ответить25.Сен.2011 в 21:26 #
  • Allpa allpa.ru

    укажи второй параметр

    Если этот код использовать, в блоке кроме его названия нет ничего.
    Этот ?

    <?php echo kama_most_commented_posts(10, '{a}{title}{/a} {comments} коммент. ? {date:j.M.Y}'); ?>

    работает. Но стоит убрать дату и привести код к такому виду ?

    <?php echo kama_most_commented_posts(10, '{a}{title}{/a} {comments} коммент.'); ?>

    как опять видим блок без содержимого.. о.О

    Ответить25.Сен.2011 в 21:53 #
    • Kama7682

      Поправил, даже протестировал. Бала ошибка в коде и благодаря твоей настойчивости мы её поправили. Спс!

      Ответить25.Сен.2011 в 22:54 #
      • Allpa allpa.ru

        Хо! Совсем другое дело!
        Спасибо!!! clapping

        Ответить25.Сен.2011 в 23:00 #
  • deSiter desiter.ru

    Спасибо! Как всегда, ацки полезно!

    Ответить20.Янв.2012 в 18:21 #
  • garri studio-gost.ru

    А можно сделать, так что бы выводились комментируемые посты за последний месяц. Чтобы сортировка была не как сейчас по дате поста,а по дате самих комментариев. надеюсь поняли что я имею ввиду. smile

    Ответить29.Янв.2012 в 21:58 #
  • garri studio-gost.ru

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

    Ответить31.Янв.2012 в 19:40 #