ГлавнаяТемыФункции пагинации в WordPress 4.1

Функции пагинации в WordPress 4.1

Обновление: версия 4.1 вышла 18 декабря. Подробное описание в нашей новой статье →

В WordPress версии 4.1 появятся несколько новых функций для упрощения навигации в темах: the_post_navigation, the_posts_navigation и функция пагинации the_posts_pagination.

Для постраничной навигации многие темы для WordPress внедряют поддержку таких плагинов, как WP-PageNavi, а начиная с темы Twenty Fourteen, некоторые авторы последовали примеру стандартной темы и стали выполнять пагинацию с помощью встроенной функции ядра paginate_links.

Использование этой функции часто требует большое количество кода и иногда включает логику для работы с постоянными ссылками модуля WP_Rewrite, данными о запросе WP_Query и прочее. Начиная с WordPress версии 4.1 разработчики ядра обернули эту логику в одну простую функцию.

the_posts_pagination()

Функция the_posts_pagination() вставляет блок пагинации в тему WordPress:

<?php paginate_links(); ?>
Пагинация в теме Twenty Fifteen

Пагинация в теме Twenty Fifteen

В качестве единственного параметра функция the_posts_pagination() принимает массив, который передается в функцию paginate_links(). Это значит, что весь функционал который мы ранее выполняли с помощью paginate_links(), также легко реализовать и с помощью новой упрощенной функции the_posts_pagination().

Например, можно добавить символ № перед каждым номером страницы:

the_posts_pagination( array( 
    'before_page_number' => '&#8470;', 
) );

По умолчанию the_posts_pagination() отображает первую и последнюю страницу, а также по одной странице вокруг текущей. Все остальные заменяются многоточием. Это поведение можно изменить с помощью аргументов:

  • show_all — показывать все страницы
  • end_size — количество страниц в начале и конце списка
  • mid_size — количество страниц слева и справа от текущей страницы

Например:

the_posts_pagination( array(
    'end_size' => 2,
    'mid_size' => 2,
) );

Данный код будет отображать первую, вторую, предпоследнюю и последнюю страницы, независимо от текущей. А вокруг текущей страницы будет по две страницы с каждой стороны. На примере темы Twenty Fifteen это будет выглядеть следующим образом:

Пагинация в теме Twenty Fifteen

Пагинация в теме Twenty Fifteen

Функция the_posts_pagination() добавляет ряд дополнительных классов к разметке, с помощью которых можно изменять внешний вид каждого элемента пагинации.

the_posts_navigation

Функция the_posts_navigation() является менее привлекательной альтернативой функции the_posts_pagination(). Она выводит лишь ссылки на следующую и предыдущую страницы относительно текущей.

До WordPress 4.1 данные ссылки можно получить с помощью функций get_next_posts_link() и get_previous_posts_link(), которыми на сегодняшний день пользуются большинство авторов тем для WordPress. Начиная с версии 4.1 авторы могут существенно упростить вывод подобных ссылок:

<?php the_posts_navigation(); ?>

С помощью ключей prev_text и next_text передаваемого массива, можно изменить текст ссылок. По умолчанию используется «Старые записи» и «Новые записи», что подойдет для большинства случаев.

the_post_navigation

Функцию the_post_navigation() можно использовать в шаблоне вывода одной записи. Данная функция отображает ссылки на следующую и предыдущую записи относительно текущей. Она также хорошо подходит для использования в шаблонах прикрепленных файлов.

<?php the_post_navigation(); ?>

Аргументами prev_text и next_text можно изменить текст, куда строкой %title можно вставить заголовок следующей или предыдущей статьи:

the_post_navigation( array(
    'next_text' => 'Следующая запись: %title',
    'prev_text' => 'Предыдущая запись: %title',
) );

Заключение

Данные встроенные функции WordPress позволяют существенно уменьшить количество кода в темах, а значения их аргументов по умолчанию подойдут для большинства тем, что позволят их использовать без каких-либо параметров.

Следует отметить, что все три функции выводят результат сразу на экран. Если вы хотите записать результат в переменную, сделать это можно добавив префикс get_ к любой из них, например get_the_posts_pagination().

Напоминаем, что WordPress версии 4.1 выйдет в декабре 2014 года вместе с новой стандартной темой Twenty Fifteen.

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

Подписаться → Подпишитесь на бесплатную рассылку журнала WP Magazine и получайте новости, события, подборки тем и плагинов, уроки, советы и многое другое в мире WordPress!

  • versusbassz

    Обязательно попробую, спасибо! Пишите ещё :)

  • Looler

    Отлично!

  • Hendalf

    ну наконец!)

  • Vitaliy Ralle

    Навигации по многостраничной записи вида: []
    Когда можно будет выводить без кастомных функций?

    • Виталий, это можно сделать с помощью функции ядра wp_link_pages(), правда «следующая» и «предыдущая» скорее всего придется добавить самостоятельно с помощью аргументов before и after.

      • Vitaliy Ralle

        скорее всего уже пришлось)
        Вопрос был с надеждой, что вскоре не придется, раз уж взялись за функционал пагинации.

  • Ещы бы про изменения в wp_title почитать, слышал что там тоже что то поменялось…

  • sashic

    Просто и удобно, PageNavi из обязательных плагинов можно исключать

  • Shamil Daniyalov

    а как добавить кнопу типа «Показать еще…» как в Твиттере например

    • Shamil, это можно сделать с помощью модуля Infinite Scroll плагина Jetpack, или же писать собственную реализацию.

  • Anton

    Константин, подскажите, пожалуйста, как проще всего не отображать последнюю страницу в пагинации. Я так понимаю, встроенными параметрами задать это невозможно?

    • Нет, но вы наверняка можете скрыть ее с помощью CSS.

  • Это замечательно, что есть такие функции, которые иногда действительно могут пригодиться. Но если мы говорим о блоге или новостном сайте, то всегда достаточно лишь ссылки на предыдущую и следующую страницу. Зачем кому-то осознанно переходить именно на 3 или 4 страницу после первой? Пользователи не держат в голове что на третьей странице был вот такой-то материал поэтому я иду на третью страницу, а, тут же появилось две новости значит страницы сдвинулись на одну, да-да, значит мне нужна все-таки четвертая страница… Так что рекомендую думать и проигрывать сценарии прежде чем внедрять такие листалки :)

  • Arni

    Константин, а можете привести реальный пример с фрагментом кода, который можно вставить в functions.php, чтобы осуществить вывод блока пагинации а) для записей, б) для комментариев? Был бы очень признателен. Заранее спасибо.

  • Иван

    Интересно, и зачем же пагинацию заключили в заголовок ? Разработчики не дружат с SEO?

    • У нас h1, а не h2, и проблем никаких никогда небыло. Так что по всей видимости это SEO-шники в 2010 году остались ;)

      • Иван

        Ну почему же сразу сеошники, поисковики диктуют свои правила…

  • Олег Мельник

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

  • Ася Тачковская

    Скажите пожалуйста, в любой ли теме можно использовать данные функции? Никак не могу разобраться с пагинацией к теме oblique.