HUSKY - Products Filter Professional for WooCommerce

Как ускорить текстовый поиск WOOF Text Filter

Если на вашем сайте большое количество товаров (3000+) и вы замечаете медленную работу поиска с [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: оптимизация фильтрации по категориям

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

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

Индексы базы данных значительно ускоряют запросы по категориям, оптимизируя таблицы term_relationships и 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 секунды
  • Постоянное решение (индексы остаются после удаления кода)

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

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

Добавьте этот код в ваш 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);
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Проверка изменений

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

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

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

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

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