HUSKY - Product Filter for WooCommerce

Как ускорить фильтрацию товаров WooCommerce в больших каталогах с помощью HUSKY

Как ускорить фильтрацию товаров WooCommerce в больших каталогах с помощью HUSKY

Когда магазин WooCommerce вырастает до нескольких тысяч товаров, фильтр товаров может стать узким местом. Каждому термину таксономии нужен подсчёт (count query), каждый атрибут добавляет join, а динамический пересчёт (dynamic recount) умножает нагрузку на базу данных. HUSKY (ранее WOOF) включает несколько встроенных механизмов кэширования и хуков, разработанных специально для больших каталогов. Эта статья охватывает только те функции, которые реально существуют в исходном коде плагина — никаких гипотетических настроек или выдуманных хуков.

Включить Cache Dynamic Recount

В HUSKY → Advanced → Options вы найдёте настройку Cache dynamic recount number for each item in filter. При включении HUSKY сохраняет результаты пересчёта для каждого термина в таблице WordPress options или как transient, поэтому последующие загрузки страниц полностью пропускают запросы подсчёта. Это самый эффективный переключатель для магазинов, использующих Dynamic Recount с большим количеством терминов таксономий.

Кэш очищается по расписанию, а не при изменении товаров. Интервал устанавливается опцией auto-clean рядом с настройкой кэша (срок действия по умолчанию — одна неделя). После добавления или импорта партии товаров вы можете очистить его вручную с помощью кнопки clear cache в панели администратора.

Включить Cache Terms

Рядом с recount cache находится настройка Cache terms. Когда форма фильтра содержит большое количество терминов (сотни категорий товаров, атрибутов или меток), эта опция кэширует отрисованный список терминов, чтобы HTML не нужно было перестраивать при каждой загрузке страницы.

Он работает так же, как recount cache: очищается по расписанию, со своим собственным интервалом auto-clean и кнопкой clear terms cache в админке. Для магазинов с глубоко вложенными деревьями категорий или множеством значений атрибутов включение обоих кэшей вместе значительно снижает нагрузку на базу данных за запрос.

Использовать Turbo Mode для предварительно сгенерированных данных товаров

Turbo Mode — это самая мощная оптимизация, которую HUSKY предлагает для больших каталогов. При включении он предварительно генерирует плоский файл, содержащий отфильтрованные ID товаров для каждой комбинации активных терминов. Вместо построения и выполнения сложных WP_Query + tax_query + meta_query при каждом запросе фильтра плагин читает предварительно вычисленный файл — разница во времени отклика часто составляет порядок величины.

Turbo Mode настраивается в HUSKY → Extensions → Turbo Mode. Перегенерация файла может быть запланирована через WordPress cron или, для надёжности, через настоящий системный crontab (см. FAQ по настройке Turbo Mode cron).

Настроить лимит товаров Turbo Mode

По умолчанию Turbo Mode обрабатывает до 15 000 товаров во время генерации кэша. В магазинах с бо́льшим количеством товаров генерация останавливается до того, как все товары будут проиндексированы. Используйте хук woof_turbo_mode_products_limit, чтобы поднять этот лимит:

add_filter('woof_turbo_mode_products_limit', function($limit) {
    // Increase limit for catalogs larger than 15,000 products
    return 50000;
});

Хук находится в ext/turbo_mode/index.php:277. Установите значение достаточно высоким, чтобы охватить весь ваш каталог, но помните об ограничениях времени выполнения PHP и памяти во время генерации файла.

Оптимизировать метод подсчёта для больших сайтов

Система динамического пересчёта использует счётчик на основе WP_Query, который может потреблять значительный объём памяти в магазинах с большим количеством товаров. Хук woof_counter_method (источник: classes/counter.php) позволяет переключиться на более лёгкий метод подсчёта, который устанавливает nopaging=false и posts_per_page=1, уменьшая потребление памяти на запрос ценой потенциально менее точных результатов:

add_filter('woof_counter_method', function($saving_memory) {
    // Enable memory-saving counter mode
    return true;
});

Сначала протестируйте это на вашем staging-сайте — этот режим хорошо работает на одних конфигурациях, но не на всех.

Настроить запрос фильтра через woof_products_query

Хук woof_products_query (источник: index.php) передаёт полный массив $query_args до выполнения WP_Query. Используйте его для добавления произвольных meta-запросов, исключения определённых товаров или настройки структуры запроса для повышения производительности:

add_filter('woof_products_query', function($query_args) {
    // Exclude products that should never appear in filter results
    $query_args['meta_query'][] = array(
        'key'     => '_exclude_from_filter',
        'compare' => 'NOT EXISTS'
    );
    return $query_args;
});

Для манипуляций на уровне таксономий (изменение операторов связи между таксономиями) используйте связанный хук woof_main_query_tax_relations.

Включить WordPress Object Cache для данных фильтра

HUSKY поддерживает хук woof_use_wp_cache для маршрутизации своих внутренних данных через WordPress object cache. Если вы уже используете постоянное объектное кэширование (Redis, Memcached), включение этого хука перемещает данные фильтра из базы данных в быстрое in-memory хранилище:

add_filter('woof_use_wp_cache', function($is){
    return true;
});

Важно: Этот хук не имеет эффекта без установленного плагина постоянного объектного кэширования. Он не заменяет встроенные настройки кэша — он дополняет их, когда ваше хостинговое окружение поддерживает объектное кэширование.

Комбинируйте настройки для лучшего результата

Рекомендуемая базовая конфигурация для большого каталога (10 000+ товаров, много терминов таксономий):

  • Включите Cache dynamic recount и Cache terms в Advanced → Options
  • Включите Turbo Mode и установите лимит товаров в соответствии с размером вашего каталога
  • Примените woof_use_wp_cache, если доступно постоянное объектное кэширование
  • Протестируйте woof_counter_method на staging, чтобы проверить, подходит ли энергосберегающий режим для вашей конфигурации
  • Используйте woof_products_query только тогда, когда нужно исключить определённые товары из результатов фильтра

Начните с двух встроенных переключателей кэша — они не требуют изменений кода и сами по себе дают наиболее заметное улучшение.