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: оптимізація фільтрації категорій

Якщо після ввімкнення швидкого пошуку фільтрація за категоріями продовжує працювати повільно, у вас є два варіанти:

Варіант 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 секунди
  • Постійне рішення (індекси залишаються після видалення коду)

Варіант Б: Кешувати запити категорій

Якщо ви не можете змінити структуру бази даних або хочете використовувати інший підхід, кешування забезпечить хороше підвищення продуктивності.

Додайте цей код до свого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 години
  • Генерує унікальний ключ кешу для кожної комбінації фільтрів
  • Повертає кешовані ідентифікатори продуктів під час наступних ідентичних пошуків

Очікувані результати:

  • Перший пошук: звичайна швидкість
  • Подальші ідентичні пошуки: майже миттєві результати
  • Термін дії кешу автоматично закінчується через 1 годину

Яке рішення використовувати?

Проблеми зі швидкістю текстового пошуку:

Використовуйте рішення 1(post__in filter) – це найпростіше та найефективніше виправлення.

Проблеми зі швидкістю фільтрації категорій:

Використовуйте розчин 2A(Індекси бази даних), якщо:

  • Ви маєте доступ до бази даних
  • Вам потрібна постійна оптимізація
  • Вам потрібна стабільна швидкість для всіх запитів

Використовуйте розчин 2B(Кешування), якщо:

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

Комбіновані рішення:

Ви можете безпечно використовувати всі рішення разом для досягнення максимальної продуктивності:

  1. Увімкнутиpost__inметод (Рішення 1)
  2. Додати індекси бази даних (Рішення 2A)
  3. Додайте кешування (Рішення 2B) – необов’язково для додаткового прискорення

Важливі зауваження

  • Потрібна дочірня тема: Завжди додавайте код до дочірньої темиfunctions.php to prevent loss during theme updates
  • Спершу резервне копіювання: перед додаванням індексів бази даних створіть резервну копію бази даних
  • Тестове середовище: Якщо це можливо, спершу протестуйте рішення на місці розміщення
  • Очищення кешу: якщо використовується рішення для кешування, пам’ятайте, що кешовані результати оновлюються щогодини

Тестування ваших змін

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

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

Якщо ці рішення не забезпечують достатнього покращення, розгляньте:

  • Оновлення до швидшого хостингу
  • Увімкнення кешування об’єктів (Redis/Memcached)
  • Оптимізація конфігурації сервера бази даних
  • Зменшення кількості активних плагінів

Джерело: https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/