Диагностика проблемы: почему возникает ошибка 404 при пагинации с несколькими WP_Query
При использовании нескольких кастомных запросов WP_Query на одной странице с пагинацией часто возникает ошибка 404 при переходе на страницы пагинации. Это происходит из-за конфликта параметра paged, который по умолчанию применяется ко всем запросам и влияет на URL, а WordPress не может корректно определить, к какому именно запросу относится текущая страница.
Типичные симптомы проблемы:
- При переходе на вторую и последующие страницы пагинации выводится 404 ошибка;
- Пагинация работает только для одного из запросов, остальные не реагируют на параметр
paged; - URL страниц пагинации корректный, но содержимое не меняется.
Пошаговое решение: как правильно реализовать пагинацию для нескольких WP_Query на одной странице
Шаг 1. Передача отдельных параметров пагинации
Для каждого запроса нужно использовать свой параметр пагинации, чтобы избежать конфликтов. Например, для первого запроса paged будет браться из paged, для второго — из paged2 и т.д.
function get_current_paged($key = 'paged') {
if (get_query_var($key)) {
return intval(get_query_var($key));
} elseif (isset($_GET[$key])) {
return intval($_GET[$key]);
}
return 1;
}
$paged1 = get_current_paged('paged');
$paged2 = get_current_paged('paged2');Шаг 2. Объявление дополнительных параметров пагинации в WordPress
Чтобы WordPress распознавал дополнительные параметры, их нужно добавить в query_vars через фильтр:
function add_custom_paged_query_vars($vars) {
$vars[] = 'paged2';
return $vars;
}
add_filter('query_vars', 'add_custom_paged_query_vars');Шаг 3. Создание двух WP_Query с разными параметрами пагинации
$args1 = [
'post_type' => 'post',
'posts_per_page' => 5,
'paged' => $paged1,
];
$query1 = new WP_Query($args1);
$args2 = [
'post_type' => 'product',
'posts_per_page' => 4,
'paged' => $paged2,
];
$query2 = new WP_Query($args2);Шаг 4. Генерация ссылок пагинации с кастомными параметрами
Для второго запроса необходимо вручную формировать ссылки пагинации с параметром paged2. Пример функции:
function custom_paginate_links($current_page, $max_page, $paged_var) {
return paginate_links([
'base' => add_query_arg($paged_var, '%#%'),
'format' => '',
'current' => $current_page,
'total' => $max_page,
'type' => 'list',
]);
}
echo custom_paginate_links($paged1, $query1->max_num_pages, 'paged');
echo custom_paginate_links($paged2, $query2->max_num_pages, 'paged2');Проверка результата после внедрения
- Перейдите на страницу с несколькими WP_Query и нажмите пагинацию для каждого из списков;
- Убедитесь, что URL меняется корректно: для первого запроса параметр
paged, для второго —paged2; - Проверяйте, что содержимое каждой секции меняется согласно выбранной странице, а 404 ошибка не появляется;
- Проверьте работу пагинации с разными комбинациями параметров и обновлением страницы.
Частые ошибки и как их исправить
- Отсутствие регистрации параметров пагинации в query_vars: WordPress не распознает кастомные параметры
paged2и др. Решение — добавить их через фильтрquery_vars. - Использование одного параметра
pagedдля всех запросов: приводит к конфликтам и ошибке 404. Нужно разделять параметры пагинации. - Неправильное формирование ссылок пагинации: если ссылки не содержат нужных параметров, переходы приводят к 404 или неправильному результату.
- Не сбрасывается
wp_reset_postdata()после каждого запроса: может привести к неправильному отображению данных и пагинации.
Практические советы по безопасности и производительности
- Используйте
intval()для всех параметров пагинации, чтобы избежать внедрения вредоносного кода через URL. - Минимизируйте количество запросов WP_Query на одной странице, чтобы не перегружать базу данных.
- Разграничивайте пагинацию по параметрам, чтобы не путать логику и избежать избыточных вычислений.
- Кешируйте результаты запросов при возможности, особенно для сложных фильтров и больших объемов данных.
Сравнение вариантов реализации пагинации с несколькими WP_Query
| Вариант | Преимущества | Недостатки |
|---|---|---|
Использование одного параметра paged | Простота кода, стандартная пагинация | Конфликты, ошибки 404, не работает с несколькими запросами |
Использование отдельных параметров (paged2, paged3) | Корректная работа с несколькими WP_Query, гибкость | Усложнение URL и кода, требуется регистрация параметров |
| AJAX пагинация с передачей параметров | Улучшенный UX, нет перезагрузки страницы | Сложная реализация, требует JS и обработки запросов |