Диагностика проблемы: почему возникает ошибка 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) |