HUSKY - Products Filter Professional for WooCommerce

Jak przyspieszyć wyszukiwanie w filtrze tekstowym WOOF

Jeśli Twoja witryna ma dużą liczbę produktów (ponad 3000) i doświadczasz wolnego działania wyszukiwania z [woof_text_filter], ten przewodnik pomoże Ci go zoptymalizować.

Problem

Domyślnie HUSKY używa metody SQL JOIN do wyszukiwania, co może być wolne na dużych bazach danych. Wyszukiwanie tekstowe trwające 10+ sekund i opóźnienia podczas filtrowania kategorii są typowymi objawami.

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

Wtyczka posiada wbudowaną szybszą metodę wyszukiwania, która wykorzystuje post__in zamiast SQL JOIN. Jest to znacznie bardziej wydajne w przypadku dużych katalogów produktów.

Implementacja

Dodaj tę pojedynczą linię do swojego motywu functions.php plik:

add_filter('woof_husky_query_post__in', '__return_true');

Oczekiwane wyniki

  • Szybkość wyszukiwania tekstowego: Od 10+ sekund do 1-3 sekund
  • Działa natychmiast po dodaniu kodu
  • Nie są wymagane żadne zmiany 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: Dodaj indeksy baz danych (zalecane)

Indeksy bazy danych dramatycznie przyspieszają zapytania do kategorii poprzez optymalizację term_relationships i term_taxonomy tabele.

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:

  • Uruchamia się raz przy pierwszym ładowaniu strony administratora
  • Tworzy zoptymalizowane indeksy baz danych
  • Przechowuje flagę ukończenia, aby zapobiec ponownemu uruchomieniu

Oczekiwane rezultaty:

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

Opcja B: Buforowanie zapytań o kategorie

Jeśli nie możesz zmodyfikować 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 filtru kategorii przez 1 godzinę
  • Generuje unikalny klucz cache dla każdej kombinacji filtrów
  • Zwraca buforowane identyfikatory produktów przy kolejnych identycznych wyszukiwaniach

Oczekiwane rezultaty:

  • Pierwsze wyszukiwanie: Normalna prędkość
  • Kolejne identyczne wyszukiwania: Niemal natychmiastowe wyniki
  • Pamięć podręczna automatycznie wygasa po 1 godzinie

Jakiego rozwiązania użyć?

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

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

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

Użyj rozwiązania 2A (Indeksy baz danych) jeśli:

  • Masz dostęp do bazy danych
  • Chcesz trwałej optymalizacji
  • Potrzebujesz spójnej prędkoś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 post__in metoda (Rozwiązanie 1)
  2. Dodaj indeksy bazy danych (Rozwiązanie 2A)
  3. Dodaj buforowanie (Rozwiązanie 2B) – opcjonalne dla dodatkowego przyspieszenia

Ważne uwagi

  • Wymagany motyw potomny: Zawsze dodawaj kod do motywu potomnego functions.php aby zapobiec utracie podczas aktualizacji motywu
  • Najpierw wykonaj kopię zapasową: Przed dodaniem indeksów bazy danych, wykonaj kopię zapasową swojej bazy danych
  • Środowisko testowe: W miarę możliwości najpierw przetestuj rozwiązania na stronie staging
  • Czyszczenie pamięci podręcznej: Jeśli korzystasz z rozwiązania do buforowania, pamiętaj, że buforowane wyniki są aktualizowane co godzinę

Testowanie Twoich Zmian

  1. Dodaj kod do swojego functions.php
  2. Wyczyść wszystkie pamięci podręczne (przeglądarka, WordPress, serwer)
  3. Przetestuj wyszukiwanie, które wcześniej było wolne
  4. Monitorowanie poprawy czasu wyszukiwania

Optymalizacja po stronie serwera

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

  • Przejście na szybszy hosting
  • Włączanie buforowania obiektów (Redis/Memcached)
  • Optymalizacja konfiguracji serwera bazy danych
  • Zmniejszenie liczby aktywnych pluginów

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