Популярные статьи в WordPress без плагинов

Блок «Популярные статьи» часто можно увидеть на сайтах на базе WordPress, это удобный способ привлечь внимание посетителя к наиболее популярным статьям. Есть несколько плагинов, которые позволяют вывести такой блок, их легко найти в репозитории, однако я хочу рассказать о двух способах вывода блока популярных статей без плагинов.

Популярные статьи по количеству комментариев

Данное решение выводит список статей, отсортированных по количеству комментариев за период времени. Ограничение по времени нужно для того, чтобы отсечь очень старые статьи.

По умолчанию отбираются 5 статей за последние 90 дней. Чтобы изменить количество статей замените значение переменной $posts_qty, а количество дней — переменной $period.

Популярные статьи по количеству просмотров

Очень простое и удобное решение с использованием custom fields, что позволяет при необходимости вручную скорректировать количество просмотров конкретной статьи.

Добавьте этот код в functions.php вашей темы:

А вызов счетчика вставьте в single.php внутри цикла loop:

И выводим блок:

  • Отлично. Спасибо большое

  • Alex_la

    Очень актуально, спасибо вам

  • Полезная статья.

  • Спасибо за статью помогло !

  • Забираю, буду уменьшать количество плагинов.

  • artool

    Спасибо за статью!
    Воспользовался вторым примером с небольшими приятными изменениями — вместо списка, выводятся тизеры, т.е миниатюра с заголовком.
    Доработка не сложная, а вид полностью меняется.

    Столкнулся со следующей проблемой:
    Изменения в строке [js]$args = array( ‘numberposts’ => 5, ‘meta_key’ => ‘post_views_count’,[/js] ничего на дают:(

    Выводимое количество новостей полностью зависит от настроек блога, а именно, от настроек количества выводимых материалов на странице блога.
    Параметры — Чтение — На страницах блога отображать не более — (Ваше число)

    Не подскажете, как побороть эту зависимость?
    У меня количество выводимых материалов на страницах блога = 5, а популярных новостей хотелось бы штук — 8.
    Заранее спасибо за помощь!

    • Похоже, ошибка в цикле в вашем коде, так как мой код не зависит от настроек блога. Выложите код на pastebin.com и киньте сюда ссылку.

      • artool

        Я допускаю ошибку в коде, поскольку шаблон создавал при помощи Artisteer, а потом вносил множество изменений.
        Поскольку я не совсем понял, какой именно вы просите код, решил разместить код файла single.php — http://pastebin.com/wZSED2er

        Из кода я убрал лишние блоки, остался только костяк.

        • Я имел ввиду ваш код вывода популярных статей, а здесь его нет

          • artool

            Код вывода блока «Популярные записи» без стилей — http://pastebin.com/VHDxrBzv
            Данный код практически ничем не отменяется от вашего исходного кода, добавлена лишь миниатюра к новости.
            Цифру 5 в записи [js]’numberposts’ => 5[/js] пытался изменить на другие, о результатах писал выше.

          • Попробуйте вместо параметра «numberposts» поставить «posts_per_page»

  • artool

    [js]Попробуйте вместо параметра «numberposts» поставить «posts_per_page»[/js]
    Спасибо большое за помощь!
    Всё заработало как нужно.

  • Виктория

    Спасибо за код! Это лучшее из того, что мне встречалось. Не совсем только понятен принцип работы по количеству просмотров. По статистике Google Analytics у меня самые просматриваемые статьи одни, а список популярных записей не совпадает. Где погрешность? Спасибо!

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

      • Виктория

        Спасибо, буду рекомендовать друзьям!

  • А для страниц будет работать этот плагин

    • Это не плагин. Работать должен, но возможно придется внести изменения в код.

  • Max Human

    Все суппер — сработало!! А то замахался бороздить просторы интернета:)) Спасибо!

    Остановился на втором варианте! Но нужна помощь! Мне надо, что бы кроме заголовков выводилась еще такая информация:

    1. Миниатюра записи;
    2. Заголовок записи;
    3. Текст записи (вывожу первый абзац)
    4. Количество Просмотров записи
    5. Количество Комментариев записи
    6. Автор
    7. Рубрика
    8. Метки

    Т.е. надо организовать полноценный вывод поста! Помогите допилить. Заранее, Спасибо!

    • artool

      Возможно, конечно админ отпишет вам что-то другое, но в том что вы просите нет ничего сложного.

      — Чтобы вывести миниатюру записи нужно использовать [js]has_post_thumbnail[/js] (Есть разные параметры)
      — Вызов текста из новости — [js]<?php the_excerpt(); ?> [/js] (есть разные параметры у этой функции)
      — Количество Просмотров записи — во втором варианте создаётся доп. поле со значением равным просмотров. Вам достаточно вывести данные из этого доп. поля. [js]<?php echo get_post_meta($post->ID, ‘post_views_count’, true); ?>[/js]
      — Автор, рубрика, метки и так далее выводятся стандартными средствами вордпресса. Достаточно погуглить.

      Предложенный автором вариант является скелетом, который можно «одеть» как вам угодно.

  • Max Human

    у меня получилось вот так:

    [php][/php]

    Популярные статьи

    5, ‘meta_key’ => ‘post_views_count’, ‘orderby’ => ‘meta_value_num’, ‘order’ => ‘DESC’ );
    query_posts($args);
    while ( have_posts() ) : the_post();
    ?>
    <a href="»>
    ID, ‘IMAGE’, true); ?>
    Автор:

    [php][/php]

    Дополнительно вывожу иллюстрацию поста и имя автора (без ссылки), код прописываю в index.php.

    Добавив 2 строчки — загрузка страницы заметно стала тормозить — может как то по другому можно это реализовать?

    artool, я не силен в пхп и тем более не особо разбираюсь с шаблонами WP, если не сложно — объясните подробно что к чему…

    Спасибо!

  • Max Human

    хмм… чего то пообрезало мой последний комент…

  • Max Human

    ПРОБЛЕМА: Счетчик просмотров записи, после каждого обновления, добавляет 2 просмотра. Т.е. было 100 — обновил страницу — стало 102 — еще раз обновил, получилось 104…

    Помойму так быть не должно!? Код wp_reset_query() обнуляет счетчик, насколько я понял используется если на странице еще что то считается…

    Подскажите как исправить! Спасибо!

    • Два счетчика на странице, где-то ошибка в цикле

  • Max Human

    такс, Автор пишет:
    — А вызов счетчика вставьте в single.php внутри цикла loop: …php setPostViews(get_the_ID())

    Я его засунул в index.php, т.к. вывожу популярные записи на Главной. Или все таки в single.php надо вписать?

  • Max Human

    Вставил счетчик setPostViews(get_the_ID() в single.php — тоже делает +2 … Вставлял и в Цикле и За Циклом…

    Как это исправить? Мысли крутятся возле wp_reset_query()…

    • setPostViews должен быть только в single.php и нигде больше. Каждый вызов этой функции увеличивает счетчик на 1.

    • Вообще у вас огромный провал в знаниях WordPress. Читайте документацию, в частности, что делает wp_reset_query.

  • Max Human

    вставил счетчик в single.php, в Циклу LOOP, сразу ПЕРЕД его закрытием: …end of the loop.

    И всеровно делает +2… Я никаких счетчиков больше не прописывал. Шаблон стандартный: Твенти элевен… WP 3.4.1

  • Max Human

    Насчет провала в знаниях, с вами не поспоришь:) Еще нет двух недель как я пытаюсь разобраться с шаблонами для WP…

  • Max Human

    Neolot, я потратил немного времени, и проверил себя на возможность ошибки! Установил новенький WP с чистым шаблоном, который не редактировался и попытался использовать это решение! И всеравно +2… тут уж от моих познаний ничего не зависит…

    Куда подставлял счетчик:

    1. В single.php в Цикле LOOP, перед тегом …php endwhile; // end of the loop….
    2. В single.php ЗА пределами цикла LOOP…
    3. В content-single.php, в разных местах подставлял…

    Может проблема в счетчике? Давайте попробуем это решить, другие пользоваться будут…

    • Сергей

      У меня подобная проблема решилась подстановкой функции wp_reset_query(); сразу после вызова функции setPostView(): ()

  • artool

    Здравствуйте!
    Можно ли организовать вывод популярных постов определенной категории используя второй способ? (уж очень мне этот способ понравился)

    Заранее благодарен за помощь!

    • Это задается в параметрах функции query_posts, почитайте в документации.
      В данном случае нужно изменить переменную $args, добавив параметр cat c id нужной категории:
      [php]$args = array(‘cat’ => 10, ‘numberposts’ => 5, ‘meta_key’ => ‘post_views_count’, ‘orderby’ => ‘meta_value_num’, ‘order’ => ‘DESC’ );[/php]

      • artool

        Огромное вам спасибо!
        Второй раз обращался к вам за помощью, и второй раз вы мне помогли.

      • Евгений

        У меня почему то не фильтрует по категории, ‘cat’ => 10
        Всё равно выводит из другой категории.
        Возможно есть другой вариант? Помогите пожайлуста

        • Другого варианта нет, где-то ошибка в вашем коде. Выложите код на pastebin.com и отпишитесь сюда, тогда смогу помочь.

          • Евгений

            Использую такой код

            [php] $args = array( ‘cat’ => 1, ‘numberposts’ => 10, ‘meta_key’ => ‘post_views_count’, ‘orderby’ => ‘meta_value_num’, ‘order’ => ‘DESC’ );
            query_posts($args);
            while ( have_posts() ) : the_post();[/php]

            но дело в том что, пробывал и другие вариаты, и там тоже не подошла фильтрация, в php я слаб, возможно как то по другому мне надо выводить из массива категории.
            Сам сайт и страница категории http://money-tor.com/home/uchastvuyu-uzhe-2-dnya-a-moya-matrica-ne-zakryvaetsya-pomogite/#more-672

  • серж

    Здравствуйте!
    Подскажите если знаете, как вывести определенные(какие надо) записи в сайдбар с миниатюрами и без!? Спасибо

    • Готового решения не дам, это слишком большой вопрос для комментария. Читайте документацию по WP_Query, о миниатюрах также написано очень много.

      • серж

        советую вам написать на эту тему :idea 🙂

  • Не пашет — у меня вообще плюс 5 добавляет.

  • Кристина

    Здравствуйте.
    Спасибо за ваш код для вывода записей. Все получилось, только не получается разобраться в стилях. Сделала свой шалон, посты выводятся не один под другим, а в ряд.
    Но при выводе популярных постов, они почему-то идут один под другим, хотя все стили, которые задуманы применились. Скажите, пожалуйста, как их в ряд поставить?

    • Не видя ваших стилей невозможно ничего сказать, но проблема точно в них.

  • Подскажите пожалуйста, а как выводить популярные записи за определенное кол-во времени, например скажем за последние 3 дня.

  • artool

    Здравствуйте!

    Вы мне уже неоднократно помогали, надеюсь и сейчас на Вашу помощь.

    Создаю страницы с популярными записями определённых тегов/рубрик,
    но столкнулся с проблемой, не могли бы вы подсказать как её решить?

    Суть проблемы:
    Если я буду использовать пример предлагаемый ранее (http://neolot.com/wordpress/popular-posts-wordpress#comment-1279832342), мне
    придётся создавать отдельные шаблоны страниц с циклом для вывода
    популярных записей той или иной рубрики или тега.

    Это обусловлено ‘cat’ => 210,

    Можно ли значение ‘cat’ передать из произвольного поля записи?

    Т.е. можно ли создать универсальный шаблон, в котором ‘cat’ меняется на содержимое определённого произвольного поля?
    Для наглядности добавлю сам код — http://pastebin.com/Z4xkHYCg

    • Neolot

      Произвольные поля привязаны к постам. Если этот цикл будет выводиться на single.php, то это будет работать.

      • artool

        Спасибо за ответ!

        Но я не понимаю как именно передать значение произвольного поля аргументу ‘cat’ (может я не совсем верно выразился аргумента/переменная и т.д.)

        Данный код я хочу использовать не в single.php, а в page.php, у страницы ведь тоже могут быть произвольные поля.

        Подробное описание ситуации:
        1) Я создал несколько шаблонов страниц: page-pop-cat1.php, page-pop-cat1.php и т.д. В этих шаблонах прописан цикл для вывода популярных записей той или иной рубрики,тега.
        2) Создал страницы и назначил для каждой из них соответствующий шаблон.

        Вся «фига» в том, что если я захочу внести какие-то изменения в сам шаблон, то мне придётся переделывать все файлы (page-pop-cat1.php, page-pop-cat1.php и т.д.)

        Именно поэтому и родилась идея создать универсальный шаблон, цикл в котором зависел бы от содержания произвол. поля.

        Отдельно получить содержание произвольного поля я могу, а вот как получить это значение и вставить его в цикл?
        Вот этого я не знаю, и все мои попытки пока не увенчались успехом. Не дорос я пока для этого…

        • Neolot

          Чтобы получить значение произвольного поля, нужно использовать функцию get_post_meta(). Почитайте документацию, там есть примеры: http://codex.wordpress.org/Function_Reference/get_post_meta
          В вашем случае нужно делать примерно так: http://pastebin.com/SXKefDpS

          • artool

            В очередной раз благодарю за помощь!
            Я пытался сделать подобным образом, но в связи с слабым пониманием что и куда нужно вставлять, я делал всё чуть-чуть не так. Теперь всё стало на свои места.

  • Игорь

    А при включенном super cache не работает, при нем даже вызов function.php не происходит. Как можно обойти?

    • Neolot

      Это очень странно. Подозреваю, что есть какие-то проблемы с вашей темой, functions должен работать в любом случае. Как вариант, попробуйте другие плагины кэширование, их сейчас очень много.

  • Игорь

    для вывода определенного количества постов ипользуется «posts_per_page», а не «numberposts».

    • Neolot

      Статья была написана 3 года назад. С тех пор код WordPress изменился.