Популярные записи WordPress. Небольшой рецепт

06.02.2012

Популярные записи Wordpress

Решил недавно обновить вывод популярных записей блога со скучного и неинформативного списка на более интересный вариант с миниатюрами постов. Такой вариант хоть и требует чуть больше ресурсов, увеличивает немного размер страницы — он гораздо лучше обычного списка. Есть множество плагинов, которые выполняют такую работу, но этот вариант меньше по размеру, нормально настраивается и просто работает, без лишних наворотов.

Как он работает?

Я перебрал несколько вариантов, с помощью которых можно вывести самые комментируемые записи за определенный период. Начал с запроса к базе данных, но этот вариант оказался длиннее, поэтому отказался от него. Кстати, понять, как устроена база данных 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, которого я знаю.

Вот и все на сегодня, если есть что добавить или я что-то сделал неправильно — милости прошу в комментарии. Удачного дня

,

Комментариев: 27

  1. Лев Тигренко

    Доброго всем дня
    Вижу WordPress 30 минут как изнутри.
    Вижу переменную
    =nvl($news[‘contents’]);
    Она выводит новости.
    меняю
    =nvl($content);
    на
    =nvl($actions[‘contents’]);
    или на
    =nvl($actions);
    И ни чего не происходит.
    Вопрос:
    Какое название у переменной отвечающей за акции и как вообще посмотреть список переменных в WoedPress?

    Ответить
  2. Serg

    а как выводить не рейтинг комментируемых постов, дата которых не старше 30 дней, а просто рейтинг всех записей сайта за 30 дней (т.е. счетчик сбрасывается каждые 30 дней)?

    Ответить
  3. Наталья

    Подскажите пожалуйста, можно как то изменить код, чтобы выводились не самые комментируемые записи, а самые просматриваемые?

    Ответить
    • GerinG

      Этот код не подойдет совсем. Самые просматриваемые записи делаются несколько сложнее. Сначала необходимо добавить скриптик, который будет считать просмотры, записывать их в БД, а только потом уже — можно будет выводить. Если интересно — можно написать подробный мануал на эту тему, думаю многим будет интересно.

      Ответить
  4. Ruslan

    Подскажите пожалуйста, как вывести результат не вертикально , а горизонтально в 3 столбца и в 2 и более строки с миниатюрами

    Ответить
    • GerinG

      Тут верстать надо. По сути код отдает простой список, а дальше его уже располагать как нужно. В двух словах тут не опишешь, на самом деле.

      Ответить
    • Виктор Милашечкин

      Можно вставить непосредственно в шаблон. Можно сделать виджетом, как у меня реализовано, тогда понадобится плагин, который умеет исполнять код PHP, типа Daikos Text Widget. Я именно его использую у себя

      Ответить
  5. akkad

    Интересное дело, только не могу понять откуда берутся миниатюры? И как долго они хранятся? Функция get_the_post_thumbnail с какой версии доступна?
    А в виде шорткода если оформить, в сайдбаре тоже должно работать, или ошибаюсь.

    Ответить
    • Виктор Милашечкин

      С версии 3,0 вроде появилась встроенная возможность использования, до этого через кастом филдс народ выкручивался.
      Вот так выглядит в редакторе записей — http://rghost.ru/36394372/image.png

      Принцип работы — берем картинку, вставляем через этот диалог, используем в темах или как вздумается.

      Ответить
      • Cospi

        Она была доступна и до третей версии, просто её надо было включать в function.php

        Ответить
  6. Аноним

    Как без обид, я уже куклу вуду почти доделал? Ну и ладно… И по закону жанра должен сказать в конце — Вы еще пожалеете))) Эмм, а где можно посмотреть блоги из яндекс каталога по тематике сео и манимейкинг?

    Ответить
  7. Аноним

    Привет, как насчет обменяться постовыми, вот даже акцию провожу. Надеюсь, мы найдем общий язык)))

    Ответить
      • Аноним

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

        Ответить
        • Виктор Милашечкин

          Меня пузомерки не интересуют вообще. Мне интересен обмен с сайтами из ЯК или с посещаемостью от 1к уников.
          Поэтому без обид, но нет 

          Ответить
  8. Andrew

    Спасибо. Я разобрался. Проблема в построении миниатюр. У меня не работает функция get_the_post_thumbnail. Я так и не разобрался, как починить:( Т.е. могу вывести список комментариев, но без рисунков…

    Ответить
    • Виктор Милашечкин

      Она выводит картинку, которая назначается как миниатюра стандартными средствами. Если у вас просто вставлено изображение в пост или используется custom_field — ничего не выйдет

      Ответить
  9. Andrew

    Все-таки опять есть вопросы. А куда это писать? Я подумал, что достаточно установить плагин 
    Exec-PHP. и все будет в порядке. Но я установил плагин, кинул этот код в текстовый виджет, но фокус не удался… 
    Что я делал не так?

    Ответить
    • Виктор Милашечкин

      Абсолютно верно. Этот код я использую в блоке «Топ за 60 дней». Единственная разница — у себя в сайдбаре я исключил две категории записей из показа.

      Ответить