WordPress как на ладони
Новые WordPress шаблоны Хостинг, VPS/VDS и отдельные сервера только на SSD дисках. 7 дней бесплатного тестирования.

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

 С версии 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 Все
  • Дима cайт: cka-spb.ru

    Добрый день! Как сделать так чтобы не повторялся вывод "самых комментируемых записей WordPress". Чтобы один раз - и всё.

    Ответить5.9 лет назад #
  • Валентин Анохин

    comments_popup_link('Нет комментариев', 'Один комментарий', '% комментариев'); Тоже удобная - если не нужно заморачиваться. Удобна при выводе анонсов к постам!

    Ответить5.3 лет назад #
  • Сергей cайт: vseprosto.com

    уже отпала данная задача, так как функция get_posts в WP 2.8 и можно задать переменную orderby=comment_count

    Ответить4 года назад #
  • Кстати, вот аналогичный простенький код функции вывода популярных постов (самых комментируемых), только без настроек по времени и тп., мало ли, может кому будет полезен:

    function sky_popular_posts($num) {
    	global $wpdb;
    	$querystr = "SELECT $wpdb->posts.post_title, $wpdb->posts.comment_count, $wpdb->posts.ID, $wpdb->posts.guid FROM $wpdb->posts WHERE $wpdb->posts.post_status = 'publish' AND $wpdb->posts.post_type = 'post' ORDER BY $wpdb->posts.comment_count DESC LIMIT $num";
    	$popposts = $wpdb->get_results($querystr, OBJECT);
    	if (count($popposts)>0) {
    		$count = 0;
    		foreach ($popposts as $post) {
    			$count++;
    			$class = 'item';
    			if ($count==$num) $class = 'last';
    			?><li><a href="<?php echo $post->guid; ?>"><?php echo $post->post_title; ?></a> (<?php echo $post->comment_count; ?>)</li><?php
    		}
    	}
    }

    Где нужно вывести популярные посты вставляете так:

    <?php sky_popular_posts($num); ?>

    Где вместо $num ставите нужное количество.

    А, вместо: echo $post->guid, используйте the_permalink(); если не настроили хранение ссылок в поле guid.

    2
    Ответить3.8 года назад #
Здравствуйте, !     Войти . Зарегистрироваться