wp-code.ru wordpress WP-Codе

Как отключить пагинацию в WooCommerce при фильтрации и сортировке

Диагностика проблемы с пагинацией при фильтрации и сортировке в WooCommerce

В стандартной работе WooCommerce при использовании фильтров (например, по атрибутам, цене) или сортировке товаров зачастую пагинация не учитывает текущие параметры запроса и сбрасывается. Это приводит к тому, что пользователь при переходе на следующую страницу теряет применённые фильтры и сортировку, что ухудшает UX и снижает конверсию.

Чтобы убедиться, что именно это происходит, откройте страницу магазина, примените фильтры или сортировку, затем перейдите на вторую страницу пагинации. Если фильтры сбрасываются или сортировка меняется на дефолтную, значит пагинация работает некорректно.

Почему пагинация сбрасывает параметры фильтров и сортировки в WooCommerce

WooCommerce использует стандартные URL с параметром paged для пагинации, но при этом фильтры и сортировка могут передаваться через query-параметры GET-запроса или через сессии. Некорректная генерация ссылок пагинации либо игнорирование текущих параметров приводит к потере состояния.

Также пагинация может не учитывать параметры, если используются AJAX-фильтры без правильного обновления URL или если тема/плагин не поддерживают динамическое обновление.

Пошаговое решение: отключение пагинации при фильтрации и сортировке

Обычно задача сводится либо к отключению пагинации при активных фильтрах, либо к корректной передаче параметров. Рассмотрим вариант с отключением пагинации — показываем все товары, соответствующие фильтрам, на одной странице.

Шаг 1. Изменение параметра posts_per_page для WooCommerce каталога

Добавьте следующий код в файл functions.php активной темы или в отдельный плагин:

add_action('pre_get_posts', function($query) {
    if (is_admin() || !$query->is_main_query()) {
        return;
    }

    if (is_post_type_archive('product') || is_tax('product_cat') || is_tax('product_tag')) {
        // Проверяем, есть ли активные фильтры или сортировка
        if (!empty($_GET['orderby']) || !empty($_GET['filter'])) {
            // Отключаем пагинацию, показываем все товары на одной странице
            $query->set('posts_per_page', -1);
            $query->set('nopaging', true);
        }
    }
});

В этом примере мы отключаем пагинацию при наличии GET-параметров orderby (стандартный параметр WooCommerce для сортировки) или filter (пример пользовательского параметра фильтра). Можно адаптировать проверку под свои фильтры.

Шаг 2. Обновление ссылок пагинации (если нужна)

Если вы хотите полностью отключить пагинацию, то убрать ссылки на страницы можно через фильтр WooCommerce:

add_filter('woocommerce_pagination_args', function($args) {
    if (!empty($_GET['orderby']) || !empty($_GET['filter'])) {
        // Отключаем пагинацию при фильтрах
        $args['total'] = 1;
        $args['end_size'] = 0;
        $args['mid_size'] = 0;
    }
    return $args;
});

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

1. Перейдите в каталог товаров WooCommerce и примените сортировку или фильтр.

2. Убедитесь, что товары отображаются на одной странице без пагинации.

3. Попробуйте перейти на другую страницу пагинации — ссылки должны либо отсутствовать, либо вести на первую страницу (если пагинация отключена).

4. Проверьте консоль браузера на наличие ошибок JavaScript, если используете AJAX-фильтры.

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

  • Пагинация не меняется после добавления кода — убедитесь, что ваш код добавлен в правильный файл и активна нужная тема/плагин. Проверьте, что pre_get_posts действительно срабатывает, добавив error_log() или var_dump().
  • Показывается слишком много товаров, страница грузится долго — отключение пагинации для больших каталогов не рекомендуется. В этом случае лучше реализовать корректное добавление параметров фильтров к URL пагинации.
  • Фильтры не работают с AJAX — необходимо убедиться, что ваша тема или плагин корректно обновляют URL и используют правильные события для перезагрузки товаров.

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

  • Производительность: Отключение пагинации для большого каталога может привести к чрезмерной нагрузке на сервер и медленной загрузке страницы. Используйте это решение только для небольших наборов товаров или добавьте ограничение по количеству товаров (например, posts_per_page = 100).
  • Безопасность: Проверяйте и фильтруйте пользовательские GET-параметры, чтобы избежать уязвимостей через некорректные запросы.
  • Кэширование: Если у вас включено кэширование страниц, убедитесь, что оно учитывает параметры фильтров и сортировки, иначе пользователи будут видеть некорректные результаты.

Сравнение вариантов решения пагинации при фильтрации

МетодОписаниеПлюсыМинусы
Отключение пагинации (posts_per_page=-1)Показывает все товары на одной странице при фильтрахПростота реализации, сразу видно все товарыПотенциальная нагрузка на сервер, долгий рендеринг
Корректное добавление параметров к пагинацииПередача фильтров и сортировки в URL пагинацииСохраняет пагинацию, фильтры работают корректноСложнее в реализации, требует доработки темы или плагинов
Использование AJAX для фильтровОбновление товаров без перезагрузки страницыЛучший UX, быстрая фильтрацияТребует дополнительной разработки, тестирования
×
WPShop
партнерка без «но»!

До 3225₽ за каждую продажу

Подключиться к игре