Диагностика проблемы 404 при пагинации WooCommerce с кастомными WP_Query
Ошибка 404 при переходе по страницам пагинации в WooCommerce — частая проблема, когда используются кастомные запросы WP_Query для вывода товаров. В стандартных условиях WooCommerce управляет пагинацией автоматически, но при кастомизации запроса легко нарушить логику пагинации.
Основные признаки:
- Переход на страницу 2 и далее по пагинации выдаёт 404 ошибку.
- URL пагинации корректный, но контент не подгружается.
- Кастомный WP_Query используется для вывода товаров WooCommerce (post_type = 'product').
Причина — неправильное использование параметра paged или отсутствие вызова глобальной пагинации WooCommerce.
Почему возникает ошибка
WooCommerce использует кастомные параметры запроса и правила пермалинков. При создании собственного WP_Query для товаров необходимо учитывать:
- Передавать правильное значение
paged, получаемое из глобального запроса. - Не нарушать правила rewrite WooCommerce.
- Использовать
pre_get_postsдля корректной настройки основного запроса, если это возможно.
Пошаговое решение: пример правильного WP_Query с пагинацией
Вот рабочий пример кода для шаблона категории товаров WooCommerce с кастомной пагинацией:
$paged = ( get_query_var('paged') ) ? get_query_var('paged') : 1;
$args = [
'post_type' => 'product',
'posts_per_page' => 12,
'paged' => $paged,
'tax_query' => [
[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => 'your-category-slug',
],
],
];
$query = new WP_Query($args);
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
wc_get_template_part( 'content', 'product' );
}
echo paginate_links([
'total' => $query->max_num_pages,
'current' => $paged,
'type' => 'list',
]);
} else {
echo '<p>Товары не найдены.</p>';
}
wp_reset_postdata();Обратите внимание, что ключевой момент — получение paged из глобального запроса через get_query_var('paged'). Это гарантирует, что пагинация будет работать корректно.
Исправляем пермалинки и правила rewrite
После внесения изменений в запрос и шаблон обязательно:
- Перейдите в Настройки > Постоянные ссылки и нажмите «Сохранить изменения» без изменений — это сбросит правила rewrite.
- Очистите кэш сайта и браузера.
Проверка результата после внедрения
Чтобы убедиться, что ошибка исправлена, сделайте следующее:
- Перейдите на страницу с кастомным выводом товаров.
- Проверьте, что на первой странице отображаются товары.
- Перейдите на вторую и последующие страницы пагинации через ссылки.
- Убедитесь, что 404 ошибки не возникает и контент подгружается корректно.
- Проверьте URL пагинации — он должен содержать параметр
/page/2/и так далее.
Частые ошибки и как их исправить
- Не передан параметр
paged: пагинация ломается, страницы после первой вызывают 404. Решение — использоватьget_query_var('paged'). - Использование
query_posts()вместо WP_Query: вызывает конфликты и сброс глобального запроса. Используйте WP_Query иwp_reset_postdata(). - Неправильные правила пермалинков: после изменений всегда сбрасывайте правила в настройках.
- Кэширование: кэш страниц может выдавать неправильный результат. Очистите кэш и отключите плагины кэширования на время теста.
Практические советы по производительности и безопасности
- При большом количестве товаров используйте
posts_per_pageс разумным лимитом (например, 12-24), чтобы не перегружать сервер. - Используйте AJAX пагинацию для улучшения UX, но соблюдайте настройку
pagedи nonce для безопасности. - Внимательно фильтруйте запросы с помощью
tax_queryиmeta_query, чтобы избежать избыточных данных. - Если используете плагины кеширования, убедитесь, что они корректно обрабатывают пагинацию WooCommerce.
Сравнение методов вывода товаров с пагинацией
| Метод | Плюсы | Минусы | Применимость |
|---|---|---|---|
| Стандартный WooCommerce Loop | Автоматическая пагинация, совместимость | Меньше гибкости в кастомизации | Подходит для большинства сайтов |
Кастомный WP_Query с правильным paged | Максимальная гибкость, фильтрация | Требует правильной настройки, риски ошибок | Для кастомных шаблонов и фильтров |
| Плагины пагинации (WP-PageNavi и др.) | Простота внедрения, стильные интерфейсы | Может конфликтовать с кастомными запросами | Когда нужна кастомная навигация |