HUSKY - Product Filter for WooCommerce

Jak przyspieszyć wyszukiwanie produktów WooCommerce (filtr tekstowy HUSKY)

Jeśli Twoja strona ma dużą liczbę produktów (3000+) i wyszukiwanie produktów WooCommerce przez [woof_text_filter] jest wolne, ten przewodnik pomoże Ci to zoptymalizować.

Problem

Domyślnie HUSKY używa metody SQL JOIN do wyszukiwania, co może być wolne na dużych bazach danych. Typowe objawy to wyszukiwanie tekstowe trwające 10+ sekund i opóźnienia przy filtrowaniu kategorii.

Rozwiązanie 1: Włącz szybką metodę wyszukiwania (post__in)

Wtyczka ma wbudowaną szybszą metodę wyszukiwania, która używa post__in zamiast SQL JOIN. Jest to znacznie wydajniejsze dla dużych katalogów produktów.

Implementacja

Dodaj tę pojedynczą linię do pliku functions.php w swoim motywie:

add_filter('woof_husky_query_post__in', '__return_true');

Oczekiwane rezultaty

  • Szybkość wyszukiwania tekstowego: z 10+ sekund do 1-3 sekund
  • Działa natychmiast po dodaniu kodu
  • Nie wymaga zmian w bazie danych

Rozwiązanie 2: Optymalizacja filtrowania kategorii

Jeśli filtrowanie kategorii jest nadal wolne po włączeniu szybkiego wyszukiwania, masz dwie opcje:

Opcja A: Dodanie indeksów bazy danych (zalecane)

Indeksy bazy danych znacznie przyspieszają zapytania kategorii, optymalizując tabele term_relationships i term_taxonomy.

Dodaj ten kod do swojego 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);
}

Jak to działa:

  • Uruchamiane raz przy pierwszym ładowaniu strony administracyjnej
  • Tworzy zoptymalizowane indeksy bazy danych
  • Zapisuje flagę zakończenia, aby uniknąć ponownego uruchamiania

Oczekiwane rezultaty:

  • Filtrowanie kategorii: z kilku sekund do < 1 sekundy
  • Stałe rozwiązanie (indeksy pozostają po usunięciu kodu)

Opcja B: Buforowanie zapytań kategorii

Jeśli nie możesz modyfikować struktury bazy danych lub chcesz innego podejścia, buforowanie zapewnia dobrą poprawę wydajności.

Dodaj ten kod do swojego 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);
    }
}

Jak to działa:

  • Buforuje wyniki filtrowania kategorii na 1 godzinę
  • Generuje unikalny klucz bufora dla każdej kombinacji filtra
  • Zwraca buforowane identyfikatory produktów przy kolejnych identycznych wyszukiwaniach

Oczekiwane rezultaty:

  • Pierwsze wyszukiwanie: normalna szybkość
  • Kolejne identyczne wyszukiwania: wyniki niemal natychmiastowe
  • Bufor automatycznie wygasa po 1 godzinie

Które rozwiązanie zastosować?

W przypadku problemów z szybkością wyszukiwania tekstowego:

Użyj rozwiązania 1 (filtr post__in) – to najłatwiejsza i najskuteczniejsza poprawka.

W przypadku problemów z szybkością filtrowania kategorii:

Użyj rozwiązania 2A (indeksy bazy danych), jeśli:

  • Masz dostęp do bazy danych
  • Chcesz stałej optymalizacji
  • Potrzebujesz stałej szybkości dla wszystkich zapytań

Użyj rozwiązania 2B (buforowanie), jeśli:

  • Nie możesz modyfikować struktury bazy danych
  • Twoi użytkownicy często powtarzają te same wyszukiwania
  • Masz zmienne wzorce wyszukiwania

Łączenie rozwiązań:

Możesz bezpiecznie używać wszystkich rozwiązań razem dla maksymalnej wydajności:

  1. Włącz metodę post__in (rozwiązanie 1)
  2. Dodaj indeksy bazy danych (rozwiązanie 2A)
  3. Dodaj buforowanie (rozwiązanie 2B) – opcjonalnie dla dodatkowego przyspieszenia

Ważne uwagi

  • Wymagany motyw potomny: Zawsze dodawaj kod do pliku functions.php motywu potomnego, aby zapobiec utracie podczas aktualizacji motywu
  • Najpierw wykonaj kopię zapasową: Przed dodaniem indeksów bazy danych wykonaj kopię zapasową bazy danych
  • Środowisko testowe: Jeśli to możliwe, przetestuj rozwiązania na stronie stagingowej
  • Czyszczenie bufora: Jeśli używasz rozwiązania buforowania, pamiętaj, że buforowane wyniki są aktualizowane co godzinę

Testowanie zmian

  1. Dodaj kod do swojego functions.php
  2. Wyczyść wszystkie bufory (przeglądarki, WordPress, serwera)
  3. Przetestuj wyszukiwanie, które wcześniej było wolne
  4. Monitoruj poprawę czasu wyszukiwania

Optymalizacja po stronie serwera

Jeśli te rozwiązania nie zapewnią wystarczającej poprawy, rozważ:

  • Przejście na szybszy hosting
  • Włączenie buforowania obiektów (Redis/Memcached)
  • Optymalizację konfiguracji serwera bazy danych
  • Zmniejszenie liczby aktywnych wtyczek

Źródło: https://pluginus.net/support/topic/very-slow-woof_text_filter-searches/