Диагностика ошибки 404 при пагинации WooCommerce с кастомными WP_Query
Ошибка 404 при переходе по страницам пагинации — частая проблема при использовании кастомных запросов WP_Query в WooCommerce. Обычно она возникает, когда параметры пагинации не передаются или обрабатываются неправильно, или когда WordPress не может сопоставить URL с нужной страницей.
Для диагностики выполните следующие шаги:
- Проверьте, используется ли параметр
pagedв кастомном запросе. - Убедитесь, что структура постоянных ссылок (Permalinks) настроена корректно и не конфликтует с правилами WooCommerce.
- Проверьте, вызывается ли
wp_reset_postdata()после кастомного запроса. - Активируйте дебаг и посмотрите логи ошибок PHP и Rewrite Rules с помощью плагина
Rewrite Rules Inspectorили WP CLI (wp rewrite list).
Пошаговое решение проблемы
1. Используйте правильный параметр paged в WP_Query
Для пагинации нужно получить текущую страницу следующим образом:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;Далее передайте его в аргументы запроса:
$args = array(
'post_type' => 'product',
'posts_per_page' => 12,
'paged' => $paged
);
$query = new WP_Query($args);2. Обработайте пагинацию с помощью paginate_links()
Пример вывода пагинации в шаблоне:
echo paginate_links(array(
'total' => $query->max_num_pages,
'current' => $paged,
'format' => '?paged=%#%',
'show_all' => false,
'type' => 'plain',
));3. Пересоздайте постоянные ссылки
После внесения изменений зайдите в Настройки → Постоянные ссылки и нажмите «Сохранить изменения» без правок. Это обновит правила перезаписи URL, что часто решает ошибки 404.
4. Убедитесь, что WooCommerce правильно обрабатывает кастомные запросы
Иногда WooCommerce перехватывает запросы. Чтобы избежать конфликтов, добавьте следующий код в файл functions.php вашей темы:
function fix_woocommerce_custom_query_pagination( $query ) {
if ( !is_admin() && $query->is_main_query() && is_post_type_archive('product') ) {
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$query->set( 'paged', $paged );
}
}
add_action( 'pre_get_posts', 'fix_woocommerce_custom_query_pagination' );Проверка результата после внедрения
- Перейдите на страницу архива товаров WooCommerce с пагинацией.
- Кликните на номера страниц или кнопки «Следующая»/«Предыдущая».
- Проверьте, что URL изменяется с параметром
pagedи страница не возвращает ошибку 404. - Убедитесь, что выводятся корректные товары для каждой страницы.
Частые ошибки и их исправление
- Отсутствие параметра
pagedв WP_Query: запрос всегда показывает первую страницу, переходы по страницам ведут к 404. - Неправильное получение номера текущей страницы: Используйте
get_query_var('paged'), а не$_GET['paged']или$_REQUEST. - Конфликт с основным запросом WooCommerce: кастомный WP_Query без фильтрация
pre_get_postsможет конфликтовать с WooCommerce. - Проблемы с правилами перезаписи URL: неактуальные rewrite rules, их нужно обновить через админку.
Практические советы по безопасности и производительности
- Используйте
posts_per_pageс разумным значением (например, 12 или 24) для снижения нагрузки на базу данных. - Кешируйте результаты запросов, если возможно, чтобы улучшить время отклика.
- При сложных фильтрах используйте
transient APIили внешние кеширующие решения. - Проверяйте, что пользовательский код не ломает стандартные хуки WooCommerce, чтобы не вызвать неожиданные ошибки.
Сравнение способов реализации пагинации WooCommerce с кастомным WP_Query
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
Использование стандартного paged в WP_Query | Просто, совместимо с WooCommerce | Требует правильной настройки rewrite rules | При базовой пагинации товаров |
Фильтр pre_get_posts для основного запроса | Не требует кастомных циклов, эффективен | Можно случайно повлиять на другие запросы | Для изменения поведения основного архива |
| Плагин для пагинации (например, WP-PageNavi) | Быстрое подключение, удобный интерфейс | Дополнительный вес, возможные конфликты | Для сложных UI решений |