Как исправить неработающую пагинацию в WooCommerce при кастомных WP_Query

Диагностика проблемы: почему не работает пагинация в кастомных WP_Query WooCommerce

При создании кастомных запросов товаров WooCommerce с использованием WP_Query часто возникает проблема: пагинация либо не отображается, либо ведет на страницы с ошибкой 404, либо показывает повторяющиеся товары. Основные причины:

  • Неправильное использование параметра paged в запросе.
  • Конфликты с основным запросом WooCommerce и глобальными переменными.
  • Отсутствие корректной обработки параметров запроса в URL.
  • Неправильное использование хуков и фильтров WooCommerce.

Пошаговое решение: правильная настройка пагинации для кастомных WP_Query в WooCommerce

1. Получение корректного номера страницы

Для пагинации в WordPress номер текущей страницы должен передаваться через параметр paged запроса. Для WooCommerce лучше использовать get_query_var('paged') с резервным get_query_var('page'):

$paged = max( 1, get_query_var('paged'), get_query_var('page') );

2. Создание кастомного WP_Query с параметром paged

В запросе обязательно укажите параметр paged, чтобы WordPress понимал, какую страницу нужно показать. Пример запроса для товаров WooCommerce:

$args = array(
    'post_type' => 'product',
    'posts_per_page' => 12,
    'paged' => $paged,
    'meta_query' => WC()->query->get_meta_query(),
    'tax_query' => WC()->query->get_tax_query(),
);

$products = new WP_Query( $args );

3. Вывод товаров и пагинации

После получения результатов запроса выведите товары и вызовите функцию пагинации. Для пагинации WooCommerce обычно используют woocommerce_pagination() или стандартную paginate_links() с параметрами из запроса:

if ( $products->have_posts() ) {
    while ( $products->have_posts() ) {
        $products->the_post();
        wc_get_template_part( 'content', 'product' );
    }

    echo paginate_links( array(
        'total' => $products->max_num_pages,
        'current' => $paged,
        'format' => '?paged=%#%',
        'prev_text' => '«',
        'next_text' => '»',
    ) );
} else {
    echo '<p>Товары не найдены.</p>';
}
wp_reset_postdata();

Проверка результата после внедрения

Чтобы убедиться, что пагинация работает:

  • Перейдите на страницу с кастомным выводом товаров.
  • Проверьте, что ссылки пагинации ведут на корректные страницы с параметром ?paged=2 и выше.
  • Проверьте, что товары на каждой странице отличаются, а количество товаров соответствует posts_per_page.
  • Убедитесь, что при переходе на несуществующую страницу выводится пустой результат или 404, если это предусмотрено.

Частые ошибки и как их исправить

  • Ошибка: Параметр paged не передан в WP_Query.
    Исправление: Обязательно добавьте 'paged' => $paged в аргументы запроса.
  • Ошибка: Использование get_query_var('paged') без резервного get_query_var('page'), из-за чего пагинация не работает на статических страницах.
    Исправление: Используйте max(1, get_query_var('paged'), get_query_var('page')) для определения номера страницы.
  • Ошибка: Не вызван wp_reset_postdata() после кастомного запроса.
    Исправление: Всегда вызывайте wp_reset_postdata() после работы с WP_Query, чтобы избежать конфликтов с основным запросом.
  • Ошибка: Конфликт с WooCommerce фильтрами, приводящий к ошибкам 404.
    Исправление: Используйте стандартные методы WooCommerce для meta и tax запросов (WC()->query->get_meta_query() и get_tax_query()), чтобы сохранить совместимость.

Практические советы по производительности и безопасности

  • Кешируйте результаты запросов с помощью Transients API, если данные меняются нечасто.
  • Избегайте избыточных meta_query с большим количеством условий, это замедляет запрос.
  • Используйте нативные функции WooCommerce для формирования запросов — это гарантирует совместимость с будущими обновлениями.
  • Проверяйте входящие параметры пагинации на корректность (целое число, положительное), чтобы избежать SQL-инъекций.

Сравнение вариантов реализации пагинации для кастомных WooCommerce запросов

ВариантОписаниеПлюсыМинусы
Использование WP_Query с pagedКлассический метод с кастомным запросом и передачей paged.Простота, контроль над запросом, совместимость с WooCommerce.Нужно вручную выводить пагинацию, требует внимания к параметрам.
Использование pre_get_posts для изменения основного запросаПерехват и модификация основного WooCommerce запроса для пагинации.Автоматическая интеграция с WooCommerce пагинацией.Сложнее отлаживать, может повлиять на другие части сайта.
Плагины пагинации (WP-PageNavi и др.)Использование плагинов для улучшенной навигации.Удобный интерфейс, готовые стили.Иногда конфликтуют с кастомными запросами WooCommerce.

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Как исправить ошибку 404 при пагинации кастомных типов записей в WordPress
14.06.2026
Как использовать пагинацию с AJAX и кешированием в WP-PageNavi
28.01.2026
Как удалить пагинацию в WordPress без плагинов: практическое руководство
21.11.2025
Как сделать отображение пагинации в WordPress для таблиц
05.12.2025
Как сделать пагинацию для постов по датам в WordPress
15.12.2025
×

Создай идеальный сайт – теперь на 15% дешевле!

Подобрать тему →