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:
- Włącz
post__inmetoda (Rozwiązanie 1) - Dodaj indeksy bazy danych (Rozwiązanie 2A)
- Dodaj buforowanie (Rozwiązanie 2B) – opcjonalne dla dodatkowego przyspieszenia
Ważne uwagi
- Wymagany motyw potomny: Zawsze dodawaj kod do motywu potomnego
functions.phpaby 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
- Dodaj kod do swojego
functions.php - Wyczyść wszystkie pamięci podręczne (przeglądarka, WordPress, serwer)
- Przetestuj wyszukiwanie, które wcześniej było wolne
- 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/