HUSKY - Product Filter for WooCommerce

Как ускорить поиск товаров WooCommerce (текстовый фильтр HUSKY)

Если на вашем сайте большое количество товаров (3000+) и поиск товаров WooCommerce [woof_text_filter] работает медленно, это руководство поможет вам его оптимизировать.

Проблема

По умолчанию HUSKY использует метод SQL JOIN для поиска, что может замедлять работу на больших базах данных. Частые симптомы: поиск по тексту занимает более 10 секунд, а фильтрация по категориям вызывает задержки.

Решение 1: Включить быстрый метод поиска (post__in)

Плагин имеет встроенный более быстрый метод поиска, который использует post__in вместо SQL JOIN. Это гораздо эффективнее для больших каталогов товаров.

Реализация

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

add_filter('woof_husky_query_post__in', '__return_true');

Ожидаемые результаты

  • Скорость поиска по тексту: От 10+ секунд до 1-3 секунд
  • Работает сразу после добавления кода
  • Изменения базы данных не требуются

Решение 2: Оптимизация фильтрации по категориям

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

Вариант А: Добавить индексы базы данных (Рекомендуется)

Индексы базы данных значительно ускоряют запросы по категориям, оптимизируя term_relationships and term_taxonomy таблицы.

Добавьте этот код в ваш functions.php:

add_action('admin_init', 'add_woof_category_indexes', 999);

function add_woof_category_indexes() {
    global $wpdb;

    // Run only once
    if (get_option('woof_category_indexes_added')) {
        return;
    }

    // Add index to term_relationships table
    $wpdb->query("
        ALTER TABLE {$wpdb->term_relationships}
        ADD INDEX woof_cat_idx (object_id, term_taxonomy_id)
    ");

    // Add index to term_taxonomy table
    $wpdb->query("
        ALTER TABLE {$wpdb->term_taxonomy}
        ADD INDEX woof_tax_idx (taxonomy, term_id)
    ");

    // Mark as completed
    update_option('woof_category_indexes_added', true);
}

Как это работает:

  • Выполняется один раз при первой загрузке страницы администратора
  • Создает оптимизированные индексы базы данных
  • Сохраняет флаг завершения, чтобы предотвратить повторное выполнение

Ожидаемые результаты:

  • Фильтрация по категориям: От нескольких секунд до < 1 секунды
  • Постоянное решение (индексы остаются после удаления кода)

Вариант Б: Кэширование запросов по категориям

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

Add this code to your functions.php:

add_filter('woof_get_query_args', 'cache_woof_category_queries', 10, 1);

function cache_woof_category_queries($args) {
    // Only cache when category filter is used
    if (empty($_GET['product_cat'])) {
        return $args;
    }

    // Generate cache key based on current filters
    $cache_key = 'woof_cat_' . md5(serialize($_GET));
    $cached_ids = get_transient($cache_key);

    // Return cached results if available
    if ($cached_ids !== false) {
        $args['post__in'] = $cached_ids;
        return $args;
    }

    return $args;
}

add_action('pre_get_posts', 'store_woof_category_cache', 999);

function store_woof_category_cache($query) {
    // Store query results in cache
    if (!empty($_GET['product_cat']) && !empty($query->posts)) {
        $cache_key = 'woof_cat_' . md5(serialize($_GET));
        $post_ids = wp_list_pluck($query->posts, 'ID');
        set_transient($cache_key, $post_ids, HOUR_IN_SECONDS);
    }
}

How it works:

  • Кэширует результаты фильтра по категориям на 1 час
  • Генерирует уникальный ключ кэша для каждой комбинации фильтров
  • Возвращает кэшированные ID товаров при последующих идентичных поисках

Expected Results:

  • Первый поиск: Нормальная скорость
  • Последующие идентичные поиски: Практически мгновенные результаты
  • Кэш автоматически истекает через 1 час

Какое решение использовать?

Для проблем со скоростью поиска по тексту:

Используйте Решение 1 (фильтр post__in) — это самое простое и эффективное исправление.

Для проблем со скоростью фильтрации по категориям:

Используйте Решение 2А (Индексы базы данных), если:

  • У вас есть доступ к базе данных
  • Вы хотите постоянную оптимизацию
  • Вам нужна стабильная скорость для всех запросов

Используйте Решение 2Б (Кэширование), если:

  • Вы не можете изменять структуру базы данных
  • Ваши пользователи часто повторяют одни и те же поиски
  • У вас переменные шаблоны поиска

Комбинирование решений:

Вы можете безопасно использовать все решения вместе для максимальной производительности:

  1. Включить post__in метод (Решение 1)
  2. Добавить индексы базы данных (Решение 2А)
  3. Добавить кэширование (Решение 2Б) — опционально для дополнительного ускорения

Важные замечания

  • Требуется дочерняя тема: Всегда добавляйте код в functions.php дочерней темы, чтобы избежать потери при обновлении темы
  • Сначала сделайте резервную копию: Перед добавлением индексов базы данных сделайте резервную копию вашей базы данных
  • Тестовая среда: По возможности сначала протестируйте решения на тестовом сайте
  • Очистка кэшаЕсли вы используете решение для кэширования, помните, что кэшированные результаты обновляются ежечасно

Тестирование ваших изменений

  1. Добавьте код в свой functions.php
  2. Очистить весь кэш (браузера, WordPress, сервера)
  3. Протестируйте поиск, который ранее работал медленно
  4. Отслеживайте улучшение времени поиска

Оптимизация на стороне сервера

Если эти решения не дают достаточного улучшения, рассмотрите:

  • Переход на более быстрый хостинг
  • Включение кэширования объектов (Redis/Memcached)
  • Оптимизация конфигурации вашего серверного ПО базы данных
  • Уменьшение количества активных плагинов

Источник: https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/