WordPress как на ладони
Очень Удобный и Быстрый Хостинг для сайтов на 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 Все
    Войти