Решаем один из самых популярных вопросов у разработчиков 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.
Читать полностью www.kobzarev.com