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

Диагностика проблемы: почему пагинация с несколькими WP_Query не работает

Когда на одной странице WordPress выводится несколько запросов WP_Query, часто возникает проблема с пагинацией. Обычно параметр paged работает корректно с единственным запросом, но при нескольких – переход по страницам приводит к сбоям, например, отображается одинаковый набор записей, или при клике на страницу пагинации возникает ошибка 404.

Причина кроется в том, что WordPress использует глобальный параметр paged для текущей страницы, но при нескольких запросах нужно грамотно передавать и обрабатывать разные параметры пагинации для каждого из них. Без дополнительной обработки WP_Query не понимает, какой именно номер страницы нужно вывести.

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

1. Получаем параметр paged из URL с разными именами

Чтобы различать пагинацию для каждого запроса, создайте разные параметры, например, paged1 и paged2 в URL. Например: ?paged1=2&paged2=1.

$paged1 = (get_query_var('paged1')) ? intval(get_query_var('paged1')) : 1;
$paged2 = (get_query_var('paged2')) ? intval(get_query_var('paged2')) : 1;

Если вы используете $_GET, то так:

$paged1 = isset($_GET['paged1']) ? intval($_GET['paged1']) : 1;
$paged2 = isset($_GET['paged2']) ? intval($_GET['paged2']) : 1;

2. Создаем кастомные WP_Query с передачей соответствующего paged

$args1 = [
    'post_type' => 'post',
    'posts_per_page' => 5,
    'paged' => $paged1,
];
$query1 = new WP_Query($args1);

$args2 = [
    'post_type' => 'product',
    'posts_per_page' => 5,
    'paged' => $paged2,
];
$query2 = new WP_Query($args2);

3. Выводим результаты и добавляем пагинацию с разными параметрами

Для каждого запроса используйте собственный навигатор пагинации, который формирует ссылки с нужным параметром:

function custom_pagination($query, $paged_param) {
    $big = 999999999; // число для замены
    echo paginate_links([
        'base' => str_replace($big, '%#%', esc_url(add_query_arg($paged_param, $big))),
        'format' => '',
        'current' => max(1, $query->get('paged')),
        'total' => $query->max_num_pages,
        'add_args' => false,
    ]);
}

// В шаблоне вывода
if ($query1->have_posts()) {
    while ($query1->have_posts()) {
        $query1->the_post();
        the_title('<h3>', '</h3>');
    }
    custom_pagination($query1, 'paged1');
}
wp_reset_postdata();

if ($query2->have_posts()) {
    while ($query2->have_posts()) {
        $query2->the_post();
        the_title('<h3>', '</h3>');
    }
    custom_pagination($query2, 'paged2');
}
wp_reset_postdata();

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

  • Откройте страницу с двумя списками постов и убедитесь, что при переходе по страницам у каждого списка меняется контент отдельно.
  • Проверьте ссылки пагинации – они должны содержать соответствующие параметры (?paged1=2 или ?paged2=3).
  • Ошибки 404 при переходе на страницы пагинации отсутствуют.
  • Проверьте работоспособность в разных браузерах и на мобильных устройствах.

Частые ошибки и как их исправить

  • Использование одного параметра paged для всех запросов: приводит к конфликтам и одинаковой пагинации всех списков. Решение – использовать разные GET-параметры.
  • Отсутствие сброса данных после цикла (wp_reset_postdata()): может привести к неправильному выводу данных. Обязательно вызывайте функцию после каждого запроса.
  • Неправильная генерация ссылок пагинации: используйте paginate_links с корректным параметром base и add_args, чтобы сохранять другие параметры URL.
  • Прямое использование get_query_var('paged') без проверки: если параметр в URL отсутствует, значение будет пустым, что может привести к ошибкам. Всегда устанавливайте значение по умолчанию.

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

  • При использовании GET-параметров пагинации всегда приводите их к целочисленному типу с помощью intval(), чтобы предотвратить XSS и SQL-инъекции.
  • Кешируйте результаты запросов WP_Query с помощью Transients API или Object Cache, если данные не меняются часто, чтобы снизить нагрузку на БД.
  • Не выводите слишком много постов на страницу, особенно с несколькими запросами, чтобы избежать проблем с производительностью.
  • Используйте pre_get_posts, если хотите глобально изменить параметры пагинации для основных запросов, но для нескольких запросов на странице лучше использовать отдельные WP_Query.

Сравнение вариантов реализации пагинации с несколькими WP_Query

ВариантПлюсыМинусы
Один параметр paged для всех запросовПростота реализацииПагинация конфликтует, невозможно использовать несколько списков
Разные GET-параметры (paged1, paged2)Гибкость, независимая пагинация для каждого запросаСложнее URL, нужно дополнительное управление параметрами
AJAX пагинация для каждого запросаПлавный пользовательский опыт, динамическая загрузкаТребует дополнительного JS, сложнее в реализации и поддержке

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

⭐⭐⭐⭐⭐
Как использовать пагинацию для отображения большого количества комментариев в WordPress
09.05.2026
Как исправить неработающую пагинацию при пользовательских запросах WP_Query в WordPress
28.04.2026
Как сделать пагинацию для архива кастомного типа записей с WP-PageNavi
01.02.2026
Как сделать пагинацию для кастомных статусов записей в WordPress
01.03.2026
Как удалить пагинацию в WordPress без плагинов: практическое руководство
21.11.2025
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее