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:
- Włącz metodę
post__in(rozwiązanie 1) - Dodaj indeksy bazy danych (rozwiązanie 2A)
- Dodaj buforowanie (rozwiązanie 2B) – opcjonalnie dla dodatkowego przyspieszenia
Ważne uwagi
- Wymagany motyw potomny: Zawsze dodawaj kod do pliku
functions.phpmotywu 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
- Dodaj kod do swojego
functions.php - Wyczyść wszystkie bufory (przeglądarki, WordPress, serwera)
- Przetestuj wyszukiwanie, które wcześniej było wolne
- 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/