Как исправить неработающую пагинацию при комплексных запросах WP_Query

Почему пагинация 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 и кеширования

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как отладить проблемы пагинации в WordPress: практические методы и примеры
15.03.2026
Как добавить AJAX пагинацию в WP-PageNavi с поддержкой кеширования
04.01.2026
Как сделать пагинацию для постов по датам в WordPress
15.12.2025
Как добавить пагинацию в кастомных виджетах WordPress: практическое руководство
19.03.2026
Как сделать пагинацию для многоязычных сайтов WordPress
18.02.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙