Диагностика проблемы: почему пагинация не работает при кастомных WP_Query в WooCommerce
При создании кастомных запросов на основе WP_Query для вывода товаров WooCommerce часто возникает проблема: пагинация либо не появляется, либо при переключении страниц выдаёт 404 ошибку или показывает неправильное количество товаров.
Основная причина — неправильная обработка параметра paged и конфликт с основным запросом WooCommerce, который отвечает за архив товаров. WooCommerce использует собственную логику для пагинации, и если её не учесть, кастомный запрос не будет корректно взаимодействовать с URL и навигацией.
Пошаговое решение: правильная настройка пагинации для кастомного WP_Query в WooCommerce
1. Получение текущей страницы для пагинации
Важно правильно получить текущую страницу, учитывая разные варианты URL:
$paged = max( 1, get_query_var('paged'), get_query_var('page') );
2. Настройка параметров WP_Query с учётом пагинации
Пример базового запроса товаров WooCommerce с пагинацией:
$args = [
'post_type' => 'product',
'posts_per_page' => 12, // количество товаров на странице
'paged' => $paged,
// добавьте другие параметры по необходимости
];
$query = new WP_Query($args);
3. Использование правильной функции вывода пагинации
Для вывода пагинации используйте paginate_links() с правильными параметрами:
echo paginate_links([
'total' => $query->max_num_pages,
'current' => $paged,
'format' => '?paged=%#%',
'prev_text' => '« Назад',
'next_text' => 'Вперёд »',
]);
4. Обработка пермалинков и правил перезаписи
Если используются красивые ссылки (пермалинки), убедитесь, что правила перезаписи обновлены: зайдите в Настройки > Постоянные ссылки и просто нажмите «Сохранить изменения». Это сбросит правила и устранит 404 ошибки при пагинации.
Проверка результата после внедрения
- Перейдите на страницу с кастомным выводом товаров.
- Проверьте, что отображается правильное количество товаров на странице.
- Пролистывайте пагинацию — ссылки должны вести на правильные страницы без ошибок 404.
- Параметр
pagedдолжен корректно меняться в URL (например, ?paged=2 или /page/2/).
Частые ошибки и как их исправить
- Пагинация всегда показывает первую страницу: проверьте, правильно ли вы получаете
$paged. Иногда нужно использоватьget_query_var('page')вместоpagedв зависимости от контекста. - Ошибка 404 при переходе по страницам: сбросьте правила перезаписи (перейдите в настройки постоянных ссылок и сохраните без изменений).
- Неправильное количество страниц в пагинации: убедитесь, что
posts_per_pageиmax_num_pagesберутся из того же WP_Query, который выводит товары. - Конфликты с основным запросом WooCommerce: избегайте изменения глобального запроса, используйте отдельный WP_Query и не забывайте сбрасывать постдату после вывода
wp_reset_postdata().
Практические советы по производительности и безопасности
- Используйте кэширование (например, Object Cache или transient API) для кастомных запросов, чтобы снизить нагрузку на базу при больших каталогах товаров.
- Всегда проверяйте и экранируйте входящие параметры (например,
paged) перед использованием в запросах. - Избегайте избыточных запросов — ограничивайте выборку товаров только необходимыми полями с помощью
fieldsв WP_Query.
Сравнение вариантов решения проблемы пагинации в WooCommerce с кастомными запросами
| Метод | Плюсы | Минусы |
|---|---|---|
Использование базового WP_Query с корректным paged |
Простой, контролируемый код, гибкость | Необходимо вручную настраивать пагинацию и URL |
Перезаписывать главный запрос с помощью pre_get_posts |
Интеграция с WooCommerce, автоматическая работа пагинации | Риск конфликтов, сложнее отлаживать |
| Использовать плагины пагинации для WooCommerce | Быстро, готовые решения | Меньше контроля, возможны конфликты и нагрузка |