Диагностика проблемы с пагинацией WP_Query
Часто при выводе постов с помощью кастомного запроса WP_Query пагинация не работает должным образом: страницы не переключаются, при переходе на другую страницу выводятся те же записи, либо возникает ошибка 404. Причина обычно кроется в неправильной настройке параметров запроса или конфликтах с глобальной переменной $paged.
Для диагностики выполните следующие шаги:
- Проверьте, передаётся ли в запрос переменная
paged, отвечающая за номер текущей страницы. - Убедитесь, что в URL действительно есть параметр
/page/2/и он корректно обрабатывается. - Проверьте, не конфликтует ли ваш запрос с основным глобальным
queryWordPress. - Включите режим отладки WordPress и посмотрите, нет ли ошибок в логах.
Пошаговое решение проблемы с пагинацией в WP_Query
1. Правильное получение текущей страницы
Для корректной работы пагинации нужно получить текущий номер страницы из запроса. В шаблонах это делается так:
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;2. Использование $paged в параметрах WP_Query
Передайте полученный номер страницы в параметры запроса:
$args = array(
'post_type' => 'post',
'posts_per_page' => 10,
'paged' => $paged
);
$query = new WP_Query($args);3. Вывод пагинации через paginate_links()
Для отображения пагинации используйте функцию paginate_links() с правильными параметрами:
echo paginate_links(array(
'total' => $query->max_num_pages,
'current' => $paged,
'format' => '/page/%#%/',
'prev_text' => '« Назад',
'next_text' => 'Вперёд »'
));4. Использование wp_reset_postdata()
После кастомного запроса обязательно сбрасывайте глобальные данные:
wp_reset_postdata();Проверка результата после внедрения
Чтобы проверить, что пагинация работает:
- Перейдите на страницу с вашим кастомным запросом.
- Проверьте, что URL меняется на
/page/2/при переходе на следующую страницу. - Убедитесь, что при переходе на другую страницу меняются записи, а не повторяются те же.
- Включите просмотр исходного кода и проверьте, что ссылки пагинации формируются корректно.
Частые ошибки и способы их исправления
- Ошибка: Не передан параметр
pagedвWP_Query.
Исправление: Используйте$paged = get_query_var('paged') ?: 1;и передавайте в запрос. - Ошибка: Использование
pageвместоpagedв параметрах запроса.
Исправление: Для пагинации в архивах и списках постов нужно использовать именноpaged. - Ошибка: Конфликт с основным запросом WordPress.
Исправление: В некоторых случаях лучше использоватьpre_get_postsдля изменения главного запроса вместо новогоWP_Query. - Ошибка: Неправильный формат URL пагинации.
Исправление: Убедитесь, что параметрformatвpaginate_links()соответствует структуре постоянных ссылок.
Практические советы по производительности и SEO
- Используйте параметр
no_found_rows => trueвWP_Query, если пагинация не нужна — это ускорит запрос. - Для SEO убедитесь, что на страницах пагинации есть правильные мета-теги, например,
rel="next"иrel="prev". - Кешируйте результаты запросов с пагинацией с помощью Transients API или плагинов кеширования.
- Используйте ЧПУ (человеко-понятные URL) для страниц пагинации, чтобы избежать дублирования контента.
Сравнение методов реализации пагинации для WP_Query
| Метод | Плюсы | Минусы |
|---|---|---|
Кастомный WP_Query с paged | Полный контроль над запросом, гибкость вывода | Требует правильной настройки, возможны ошибки с URL |
Использование pre_get_posts | Изменяет основной запрос, меньше конфликтов | Меньше гибкости, надо хорошо понимать хуки WP |
| Плагины пагинации (WP-PageNavi и др.) | Упрощают вывод и стилизацию | Могут конфликтовать с кастомными запросами |