Не за#буйте с вашей пагинацией!!!

Click here to view original web page at www.kobzarev.com
Обложка к записи Не за#буйте с вашей пагинацией!!!

Решаем один из самых популярных вопросов у разработчиков WordPress: «Почему не работает пагинация?»

Так почему же?

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

Существуют страницы постов (постов/страниц/кастомных типов постов(CPT)) или архивные страницы(архивные/терминов страницы и страница поиска).

Пагинация на странице постов

В целом пагинацию можно разбить на 3 небольших этапа:

  • Делаем правильную выборку с помощью WP_Query;
  • Выводим пагинацию;
  • Выводим 404, когда это необходимо

WP_Query для пагинации

Нужно обратить внимание на параметр paged в WP_Query, он говорит о том, какую страницу данного запроса вывести. С помощью функций get_query_var() мы получаем номер текущей страницы …/page/{# страницы}. В зависимости от типа страницы мы должны использовать get_query_var( 'paged' ) или get_query_var( 'page' ). Я решил написать универсальный вариант, который подойдет к любому типу страниц.

Вывод пагинации

Для вывода пагинации используем функцию paginate_links:

В функцию paginate_links нужно передать два параметра: total — количество страниц и current — текущую страницу.

Так же можно использовать the_posts_pagination, но важно помнить, что данная функция работает только с глобальным wp_query и ее вызов выглядит примерно так:

Вывод 404 в случае, когда данных нет

Устанавливаем 404 ответ в глобальный WP_Query. Ставим 404 статус ответа для сервера. nocache_headers — позволяет сбросить кеш для заголовков ответа во всех браузерах. И подключаем 404 страницу с помощью require get_404_template().

Важно, чтобы до вывода данных ф-ций ничего не выводилось на странице!

Результат

Пагинация на архивный страницах

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

Пример страницы

Пагинация

Для архивных страниц можно использовать функцию the_posts_pagination.

Важно, что данная функция работает только с глобальным wp_query.

Изменяем результат запроса с помощью pre_get_posts

Добавляем в functions.php:

С данным хуком нужно быть осторожным. Для начала нужно проверить, что данный запрос является основным с помощью метода is_main_query. Так же проверить, что данных запрос вызывается на фронте с помощью is_admin и то, что данный запрос является поиском is_search. Затем устанавливаем конкретную категорию set( 'cat', 10 );

Источник: WP Punk.