Диагностика проблемы: почему пагинация не работает с WP_Query
Частая проблема разработчиков — пагинация по WP_Query не переключается на нужную страницу, или при переходе на другую страницу выводятся одни и те же записи, либо возникает ошибка 404. Это связано с тем, что WP_Query не всегда корректно обрабатывает параметры пагинации, если не передать нужные аргументы и не учитывать глобальный объект $paged.
Проверяем, что именно не так
- Переходим на страницу пагинации, например,
/page/2/. - Проверяем, меняется ли параметр
pagedв запросе (get_query_var('paged')). - Если параметр не меняется, значит,
WP_Queryвсегда запрашивает первую страницу. - Если меняется, но контент не обновляется, значит, проблема в аргументах запроса.
Пошаговое решение: правильная настройка пагинации с WP_Query
Основное правило — передавать параметр paged в конструктор WP_Query, учитывая, что значение может быть в paged или page в зависимости от типа страницы.
Пример рабочего кода:
if (get_query_var('paged')) {
$paged = get_query_var('paged');
} elseif (get_query_var('page')) {
$paged = get_query_var('page');
} else {
$paged = 1;
}
$args = [
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged,
];
$custom_query = new WP_Query($args);
if ($custom_query->have_posts()) :
while ($custom_query->have_posts()) : $custom_query->the_post();
the_title('<h2>', '</h2>');
the_excerpt();
endwhile;
// Вывод пагинации
echo paginate_links([
'total' => $custom_query->max_num_pages,
'current' => $paged,
]);
endif;
wp_reset_postdata();Почему так важно проверять оба параметра?
В зависимости от структуры permalink и контекста (страница, архив, главная) WordPress может передавать номер страницы в paged или page. Игнорируя это, вы рискуете всегда получать первую страницу.
Проверка результата после внедрения
- Перейдите на страницу с пагинацией, например,
/page/2/или?paged=2. - Убедитесь, что заголовки и контент изменились — отображаются записи со второй страницы.
- Посмотрите на HTML пагинации — текущая страница должна подсвечиваться.
- Проверьте консоль браузера на отсутствие JS-ошибок (если пагинация с AJAX).
Частые ошибки и как их исправить
- Ошибка: Не передан параметр
pagedвWP_Query.
Решение: Используйте проверкуget_query_var('paged')и передавайте в аргументы запроса. - Ошибка: Использование глобального
$wp_queryбез сброса после кастомного запроса.
Решение: Всегда вызывайтеwp_reset_postdata()после работы сWP_Query. - Ошибка: Конфликт с плагинами SEO, которые меняют структуру ссылок пагинации.
Решение: Проверьте настройки плагинов (например, Clearfy Pro) на предмет изменения урлов пагинации и исключите конфликты. - Ошибка: Пагинация работает, но при клике на следующую страницу появляется 404.
Решение: Обновите постоянные ссылки в настройках WordPress (Настройки —> Постоянные ссылки —> Сохранить изменения).
Практические советы по безопасности и производительности
- Не запрашивайте слишком много постов за один запрос — оптимально от 5 до 10 записей, чтобы не перегружать сервер.
- Используйте
no_found_rows => trueв args, если не нужна пагинация, для ускорения запросов. - Кешируйте результаты сложных запросов с помощью Transients API или внешних кешей.
- Проверяйте, чтобы пагинация корректно работала с пользовательскими ролями и правами доступа, если контент ограничен.
Сравнение вариантов реализации пагинации
| Вариант | Преимущества | Недостатки |
|---|---|---|
| Использование WP_Query с правильным paged | Полный контроль над запросом, гибкость | Требует ручной настройки, возможны ошибки если не передать paged |
| Использование глобального $wp_query (стандартный Loop) | Простота, автоматическая работа пагинации | Меньше контроля, нельзя кастомизировать запрос |
| Плагины пагинации (WP-PageNavi и др.) | Удобство, готовые стили и функции | Зависимость от стороннего кода, возможны конфликты |