Почему пагинация WP_Query не работает при комплексных запросах
Пагинация в WordPress базируется на параметре paged в объекте WP_Query. При сложных запросах с множественными параметрами (таксономии, мета-запросы, пользовательские статусы) часто возникают ошибки: страницы пагинации ведут на 404 или выводят дубли контента. Основная причина — неверная передача или обработка параметра paged и неправильное вычисление max_num_pages.
Диагностика проблемы
- Страница пагинации с номером больше 1 ведет на 404 — значит, WordPress не распознает корректно текущую страницу.
- Пагинация отображается, но контент не меняется — параметр
pagedне передается в WP_Query. - Количество страниц в пагинации не соответствует реальному числу записей.
Для проверки текущего параметра пагинации добавьте в шаблон перед циклом код:
global $paged;
if ( ! isset( $paged ) || ! $paged ) {
$paged = 1;
}
echo 'Current paged: ' . $paged;Если выводится пусто или 0, значит paged не инициализирован.
Пошаговое решение: правильная настройка пагинации для WP_Query с комплексными параметрами
1. Получаем текущую страницу из запроса
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;Обязательно используйте get_query_var('paged'), а не $_GET['paged'].
2. Формируем аргументы WP_Query, обязательно передаем paged
$args = [
'post_type' => 'product',
'posts_per_page' => 10,
'paged' => $paged,
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'electronics',
],
],
'meta_query' => [
[
'key' => '_price',
'value' => 100,
'compare' => '>=',
'type' => 'NUMERIC',
],
],
];
$query = new WP_Query($args);3. Используем правильный цикл и вывод пагинации
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
// вывод записи
}
// Пагинация
echo paginate_links([
'total' => $query->max_num_pages,
'current' => $paged,
'format' => '?paged=%#%',
]);
} else {
echo 'Записей не найдено';
}
wp_reset_postdata();Проверка результата после внедрения решения
- Перейдите на страницу с пагинацией и проверьте, что ссылки ведут на правильные номера страниц.
- Проверьте, что контент меняется при переходе по страницам.
- Если используется ЧПУ (pretty permalinks), убедитесь, что структура ссылок соответствует настройкам (в некоторых случаях нужно сбросить настройки постоянных ссылок в WordPress).
Частые ошибки и как их исправить
- Не передан параметр
pagedв WP_Query. Решение: всегда получайте текущий номер страницы черезget_query_var('paged')и передавайте в запрос. - Конфликт с параметром
page. Если страница использует шаблон страницы (page template),pagedможет не работать, нужно учитыватьpageили делать проверку:$paged = max( 1, get_query_var('paged'), get_query_var('page') ); - Неправильный
formatв функцииpaginate_links. Для ЧПУ должен быть корректный формат, например'format' => '/page/%#%/', иначе ссылки ведут на 404. - Не вызван
wp_reset_postdata()после пользовательского запроса. Это может влиять на другие части шаблона.
Практические советы по производительности и безопасности
- Для сложных мета-запросов используйте индексирование базы данных, чтобы ускорить выборку.
- Кешируйте результаты WP_Query при сложных запросах, например, через Transients API или объектный кеш.
- Проверяйте пользовательские входные данные, если формируете параметры запроса на основе GET-параметров, чтобы избежать SQL-инъекций.
Сравнение вариантов реализации пагинации для комплексных запросов
| Метод | Плюсы | Минусы |
|---|---|---|
WP_Query с параметром paged | Гибкость, полный контроль, нативная поддержка WordPress | Сложность настройки при множественных фильтрах |
| Плагины пагинации (например, WP-PageNavi) | Простота подключения, готовые дизайны | Может конфликтовать с кастомными запросами, ограниченная гибкость |
| AJAX пагинация | Улучшенный UX, без перезагрузки страницы | Сложнее в реализации, требует JS и кеширования |