Как правильно настроить пагинацию для WP_Query с параметром paged в WordPress

В чем проблема с пагинацией при использовании WP_Query и параметра paged?

При создании пользовательских запросов через класс WP_Query часто возникает ситуация, когда пагинация не работает: ссылки на страницы либо ведут на 404 ошибку, либо список записей не меняется при переключении страниц. Основная причина — некорректная передача параметра paged, отвечающего за текущую страницу пагинации, и неправильная организация запроса.

Особенно это актуально для кастомных шаблонов, архивов и сложных запросов с фильтрами.

Диагностика проблем с пагинацией WP_Query

  • Проверить, правильно ли передается значение paged из URL. Обычно это GET-параметр paged или page для страниц.
  • Убедиться, что WP_Query получает параметр paged в аргументах.
  • Проверить настройки постоянных ссылок (Permalinks). Иногда пагинация ломается при дефолтных настройках.
  • Посмотреть, нет ли конфликтов с другими плагинами, которые могут изменять глобальный запрос.
  • Проверить, что параметры posts_per_page и paged не конфликтуют.

Пошаговое решение: настройка правильной пагинации с WP_Query

1. Получаем текущую страницу пагинации

if ( get_query_var('paged') ) {
    $paged = get_query_var('paged');
} elseif ( get_query_var('page') ) { // для страниц
    $paged = get_query_var('page');
} else {
    $paged = 1;
}

Важно использовать оба варианта, так как WordPress иногда по-разному передает параметры пагинации для страниц и постов.

2. Создаем WP_Query с передачей параметра paged

$args = array(
    'post_type' => 'post', // или кастомный тип записи
    'posts_per_page' => 10,
    'paged' => $paged,
    // другие параметры запроса
);

$custom_query = new WP_Query($args);

3. Выводим посты и пагинацию

if ($custom_query->have_posts()) :
    while ($custom_query->have_posts()) : $custom_query->the_post();
        // Ваш вывод постов
        the_title('<h2>', '</h2>');
    endwhile;

    // Пагинация
    echo paginate_links(array(
        'total' => $custom_query->max_num_pages,
        'current' => $paged,
        'format' => '?paged=%#%',
        'prev_text' => '« Назад',
        'next_text' => 'Вперед »',
    ));

    wp_reset_postdata();
else :
    echo '<p>Посты не найдены.</p>';
endif;

Проверка результата после внедрения

  • Перейдите на страницу, где реализован кастомный запрос с пагинацией.
  • Кликните по номерам страниц пагинации, убедитесь, что URL меняется на site.ru/page/2/ или site.ru/?paged=2 и что список постов обновляется.
  • Отсутствие 404 ошибки при переходе на следующую страницу.
  • При отключении параметра paged пагинация перестанет работать, значит, параметр передается корректно.

Частые ошибки при настройке пагинации WP_Query

  • Не передан параметр paged: приводит к постоянному выводу первой страницы.
  • Использование query_posts() вместо WP_Query без сброса глобального запроса.
  • Конфликт с глобальным запросом: если на странице используется основной Loop и кастомный, нужно правильно сбрасывать данные через wp_reset_postdata().
  • Неправильный формат ссылок пагинации: в зависимости от настроек постоянных ссылок, параметр format в paginate_links() нужно подгонять под структуру URL.
  • Проблемы с параметрами permalink: при дефолтных настройках пагинация часто ломается, рекомендуется использовать "Постоянные ссылки" - "Произвольно" или "Название записи".

Практические советы по производительности и безопасности

  • Для снижения нагрузки на базу данных используйте кеширование запросов, например, через Transients API или встроенные кеширующие плагины.
  • При больших объемах данных оптимизируйте запросы, добавляя индексы в базу и фильтруя по нужным полям.
  • Используйте esc_url() и другие функции WordPress для безопасности URL пагинации.
  • Если используется AJAX пагинация, обязательно валидируйте входящие параметры.

Сравнение вариантов реализации пагинации WP_Query

СпособПлюсыМинусыПример
Использование параметра paged в WP_QueryПростой, гибкий, стандартный подходТребует правильного получения paged и сброса postdataКод из статьи
Использование query_posts()Простой вызов, меняет глобальный запросНегативно влияет на производительность, может ломать другие хукиquery_posts(array('paged' => $paged));
Пагинация с WP-PageNaviГотовое решение со стилями и настройкамиДополнительный плагин, возможны конфликтыПодробнее на WPSHOP

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

⭐⭐⭐⭐⭐
Как создать динамическую пагинацию в WordPress с AJAX
08.11.2025
Как добавить пагинацию в WP Admin для кастомных типов записей
28.03.2026
Как сделать пагинацию для кастомных статусов записей в WordPress
01.03.2026
Как добавить пагинацию в WordPress для комплексных запросов с помощью WP_Query
12.03.2026
Пагинация WooCommerce не работает: причины и решение
02.05.2026
×

AI-плагин от WPShop.ru

анализирует конкурентов

пишет статьи

готовит SEO

генерирует изображения

и еще кое-что...
WPGPT
Плагин, который наполняет ваш сайт WordPress
Узнать больше