Исправление ошибки 404 при пагинации с несколькими WP_Query на одной странице в WordPress

Диагностика проблемы: почему возникает ошибка 404 при пагинации

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

Проверить, что причина именно в этом, можно так:

  • Убедитесь, что на странице есть два и более кастомных WP_Query с пагинацией.
  • При переходе на страницу пагинации (например, /page/2/) появляется 404.
  • Включите отладку и проверьте, какой параметр paged передаётся в каждом запросе.

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

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

Чтобы пагинация работала для каждого запроса, нужно определить параметр paged для каждого WP_Query отдельно. WordPress хранит текущую страницу в глобальной переменной $paged или в запросе через get_query_var('paged').

$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;

2. Использование уникальных параметров пагинации для каждого запроса

При нескольких WP_Query на странице лучше использовать разные URL-параметры или сегменты URL, чтобы WordPress мог различать, к какому запросу относится пагинация. Если это невозможно, придется вручную обрабатывать параметры пагинации.

Пример использования GET-параметров для пагинации:

$paged_query1 = isset($_GET['paged1']) ? absint($_GET['paged1']) : 1;
$paged_query2 = isset($_GET['paged2']) ? absint($_GET['paged2']) : 1;

3. Настройка WP_Query с правильным paged

Передайте полученные значения в соответствующие WP_Query:

$args1 = [
    'post_type' => 'post',
    'paged' => $paged_query1,
    'posts_per_page' => 5
];

$query1 = new WP_Query($args1);

$args2 = [
    'post_type' => 'product',
    'paged' => $paged_query2,
    'posts_per_page' => 5
];

$query2 = new WP_Query($args2);

4. Формирование ссылок пагинации с разными параметрами

Чтобы ссылки пагинации работали, нужно создавать их с правильными параметрами. Например, используя add_query_arg() для генерации URL с нужным параметром:

function pagination_links_custom($paged, $max_num_pages, $param) {
    return paginate_links([
        'base' => add_query_arg($param . '=%#%'),
        'format' => '',
        'current' => $paged,
        'total' => $max_num_pages,
        'prev_text' => '«',
        'next_text' => '»'
    ]);
}

// В шаблоне
echo pagination_links_custom($paged_query1, $query1->max_num_pages, 'paged1');
echo pagination_links_custom($paged_query2, $query2->max_num_pages, 'paged2');

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

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

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

  • Использование только paged без разделения для нескольких запросов. Решение: применять уникальные параметры пагинации, чтобы не путать запросы.
  • Отсутствие проверки параметров пагинации через absint() и isset(). Это может привести к ошибкам или уязвимостям.
  • Неправильное формирование ссылок пагинации. Используйте paginate_links() и add_query_arg() для корректного формирования URL.
  • Забыли сбросить wp_reset_postdata() после каждого запроса. Это может нарушить глобальный $post и вызвать ошибки в шаблоне.

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

  • Используйте absint() для всех входящих параметров пагинации, чтобы избежать XSS и SQL-инъекций.
  • Минимизируйте количество постов на страницу для снижения нагрузки.
  • Кешируйте результаты WP_Query, если данные не меняются часто, с помощью Transients API или плагинов кеширования.
  • Обязательно вызывайте wp_reset_postdata() после каждого кастомного цикла.

Сводная таблица: варианты реализации пагинации для нескольких WP_Query

ВариантОписаниеПлюсыМинусы
Одинаковый параметр paged для всех запросов Простой, но не разделяет пагинацию Просто реализовать Ошибка 404, конфликт пагинации
Индивидуальные GET-параметры (например, ?paged1=2) Каждый запрос получает свой параметр Корректная пагинация, без конфликтов URL становится длиннее, нужно вручную формировать ссылки
Использование фрагментов URL с rewrite rules SEO-дружелюбно, сложнее в реализации Чистые URL, лучше для SEO Требует написания правил перезаписи (rewrite rules)

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

⭐⭐⭐⭐⭐
Как сделать пагинацию для комплексных запросов WordPress с фильтрацией по таксономиям
25.03.2026
Как реализовать пагинацию для кастомных Gutenberg блоков с AJAX в WordPress
31.03.2026
Как исправить неработающую пагинацию в WooCommerce при фильтрах и сортировке
24.06.2026
Как отладить проблемы пагинации в WordPress: практические методы и примеры
15.03.2026
Как добавить пагинацию в WP REST API с фильтрами и применить кеширование
07.01.2026
×
Обнови свой WordPress!

Держи скидку 15% на премиум тему Reboot

Купить со скидкой ⋙