Решил недавно обновить вывод популярных записей блога со скучного и неинформативного списка на более интересный вариант с миниатюрами постов. Такой вариант хоть и требует чуть больше ресурсов, увеличивает немного размер страницы — он гораздо лучше обычного списка. Есть множество плагинов, которые выполняют такую работу, но этот вариант меньше по размеру, нормально настраивается и просто работает, без лишних наворотов.
Как он работает?
Я перебрал несколько вариантов, с помощью которых можно вывести самые комментируемые записи за определенный период. Начал с запроса к базе данных, но этот вариант оказался длиннее, поэтому отказался от него. Кстати, понять, как устроена база данных wordpress можно из отличной статьи Дениса Webliberty. Очень грамотно написано, рекомендую.
Остановился на варианте со стандартным запросом WordPress query_posts. Он меньше по размеру, работает аналогично, его и расмотрим. Сразу даю полный код для нетерпеливых
<?php
global $post;
function filter_where($where = '') {
$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
return $where;}
add_filter('posts_where', 'filter_where');
query_posts('post_type=post&posts_per_page=5&orderby=comment_count&order=DESC');
while (have_posts()): the_post();
$thumb = get_the_post_thumbnail($post->ID,array(100,60), true);>
<div class="popular">
<div class="thumb"><?php echo $thumb; ?></div>
<div class="pop_title">
<a href="<?php the_permalink(); ?>"
title="<?php the_title(); ?>"><?php the_title(); ?></a></div>
</div>
<?php
endwhile;
wp_reset_query(); ?>
Теперь чуть подробнее:
<?php
global $post;
function filter_where($where = '') {
$where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";
return $where;}
add_filter('posts_where', 'filter_where');
query_posts('post_type=post&posts_per_page=5&orderby=comment_count&order=DESC');
Первым делом объявили переменную $post, затем создаем фильтр, который применим к запросу. Фильтр отсеивает записи, дата которых не подходит под условия. В коде — 30 дней, можно поставить любое количество, у меня в сайдбаре стоит 60 дней.
Затем идет, собственно, запрос, в котором указано, что отбирать только посты, не страницы, всего 5 штук(можете указать ваше значение), сортировать их по количеству комментариев, по убыванию. То есть, самые комментируемые записи у нас оказываются сверху, что нам и нужно. Идем дальше:
while (have_posts()): the_post(); $thumb = get_the_post_thumbnail($post->ID,array(100,60), true);?> <div class="popular"> <div class="thumb"><?php echo $thumb; ?></div>; <div class="pop_title"> <a href="<?php the_permalink(); ?>" title="<?php the_title(); ?>"><?php the_title(); ?></a></div>; </div>; <?php endwhile; wp_reset_query(); ?>
Сначала идет цикл, в теле которого первым делом мы достаем миниатюру записи и записываем ее в переменную $thumb. Обратите внимание, в коде я сразу указываю, какой размер картинки мне необходим — array(100,60). Размеры, соответственно по ширине и высоте.
Дальше идет оформление списка популярных записей, там ничего особенного, свой код я дам:
.thumb{float:left;margin-right:5px;}
.popular{height:75px}
При выводе мы используем стандартные функции the_permalink(), которая получает прямую ссылку на запись и the_title(), которая выводит название статьи.
Особое внимание хочу обратить на wp_reset_query(), многие забывают об этой функции. Она сбрасывает условия запроса, после выполнения цикла. Если не вставить эту функцию, могут появиться различные «глюки» при выводе записей. Причем, не только в этом коде, но и в других местах страницы. Будьте внимательны, не упускайте этот момент.
Код вывода популярных записей WordPress на Pastebin
Пример работы можно увидеть у меня в сайдбаре, топ записей за 60 дней. Код можно использовать в любом месте вашего шаблона.
Особое спасибо за помощь при работе над этим примером хочется сказать Юрию Похилько, ака Neolot — лучшему кодеру WordPress, которого я знаю.
Вот и все на сегодня, если есть что добавить или я что-то сделал неправильно — милости прошу в комментарии. Удачного дня



можно еще и количество коментов прикрутить к каждой записи для наглядности, как на блэкпиг, к примеру)
Пока лениво делать это )) Но мысль хорошая, спасибо Руслан
Правильно ли я понял, что результат приведен справа?
Абсолютно верно. Этот код я использую в блоке «Топ за 60 дней». Единственная разница — у себя в сайдбаре я исключил две категории записей из показа.
Все-таки опять есть вопросы. А куда это писать? Я подумал, что достаточно установить плагин
Exec-PHP. и все будет в порядке. Но я установил плагин, кинул этот код в текстовый виджет, но фокус не удался…
Что я делал не так?
Плагин создает обычно свой виджет, в который добавляется код. Я использую Daiko Text Widget, в него и вставляю PHP
Спасибо. Я разобрался. Проблема в построении миниатюр. У меня не работает функция get_the_post_thumbnail. Я так и не разобрался, как починить:( Т.е. могу вывести список комментариев, но без рисунков…
Она выводит картинку, которая назначается как миниатюра стандартными средствами. Если у вас просто вставлено изображение в пост или используется custom_field — ничего не выйдет
Привет, как насчет обменяться постовыми, вот даже акцию провожу. Надеюсь, мы найдем общий язык)))
Боюсь, что не найдем. Слишком неравнозначный обмен
Пузомерки сайтов схожи. Тем более, я прошу всего постовой за полноценный обзор, как говорят евреи ведь всегда можно договориться)))
Меня пузомерки не интересуют вообще. Мне интересен обмен с сайтами из ЯК или с посещаемостью от 1к уников.
Поэтому без обид, но нет
Как без обид, я уже куклу вуду почти доделал? Ну и ладно… И по закону жанра должен сказать в конце — Вы еще пожалеете))) Эмм, а где можно посмотреть блоги из яндекс каталога по тематике сео и манимейкинг?
Люблю людей с юмором
Смотрите тут
http://yaca.yandex.ua/yca/cat/Computers/Internet/Web_Development/
Зер гуд. Спасибо.
Интересное дело, только не могу понять откуда берутся миниатюры? И как долго они хранятся? Функция get_the_post_thumbnail с какой версии доступна?
А в виде шорткода если оформить, в сайдбаре тоже должно работать, или ошибаюсь.
С версии 3,0 вроде появилась встроенная возможность использования, до этого через кастом филдс народ выкручивался.
Вот так выглядит в редакторе записей - http://rghost.ru/36394372/image.png
Принцип работы — берем картинку, вставляем через этот диалог, используем в темах или как вздумается.
Ясно, спасибо. Я на 2.8 сижу, зато и не знал о таком.
Она была доступна и до третей версии, просто её надо было включать в function.php
а куда этот чудный код пристроить?
Можно вставить непосредственно в шаблон. Можно сделать виджетом, как у меня реализовано, тогда понадобится плагин, который умеет исполнять код PHP, типа Daikos Text Widget. Я именно его использую у себя