Jak przyspieszyć filtrowanie produktów WooCommerce w dużych katalogach z HUSKY
Gdy sklep WooCommerce rozrasta się do kilku tysięcy produktów, filtr produktów może stać się wąskim gardłem. Każdy taxonomy term wymaga count query, każdy attribute dodaje join, a Dynamic Recount zwielokrotnia pracę bazy danych. HUSKY (dawniej WOOF) zawiera kilka wbudowanych mechanizmów caching i hooks zaprojektowanych specjalnie dla dużych katalogów. Ten artykuł obejmuje tylko funkcje, które istnieją w kodzie źródłowym wtyczki — bez hipotetycznych ustawień, bez wymyślonych hooks.
Włącz Cache Dynamic Recount
W HUSKY → Zaawansowane → Opcje znajdziesz ustawienie Cache dynamic recount number for each item in filter. Po włączeniu HUSKY przechowuje wyniki recount dla każdego term w tabeli opcji WordPress lub jako transient, dzięki czemu kolejne ładowania stron całkowicie pomijają counting queries. Jest to najbardziej efektywny przełącznik dla sklepów używających Dynamic Recount z wieloma taxonomy terms.
Cache jest czyszczony zgodnie z harmonogramem, a nie przy zmianach produktów. Interwał jest ustawiany przez opcję auto-czyszczenia obok ustawienia cache (domyślny czas wygaśnięcia to jeden tydzień). Po dodaniu lub zaimportowaniu partii produktów możesz go ręcznie opróżnić za pomocą przycisku clear cache w panelu administracyjnym.
Włącz Cache Terms
Obok recount cache znajduje się ustawienie Cache terms. Gdy formularz filtra zawiera dużą liczbę terms (setki kategorii produktów, attributes lub tags), ta opcja buforuje wyrenderowaną listę terms, dzięki czemu HTML nie musi być odbudowywany przy każdym ładowaniu strony.
Działa tak samo jak recount cache: czyszczony zgodnie z harmonogramem, z własnym interwałem auto-czyszczenia i przyciskiem clear terms cache w adminie. Dla sklepów z głęboko zagnieżdżonymi drzewami kategorii lub wieloma attribute values, włączenie obu caches razem znacznie zmniejsza obciążenie bazy danych na żądanie.
Użyj Turbo Mode dla wstępnie wygenerowanych danych produktów
Turbo Mode to najpotężniejsza optymalizacja, jaką HUSKY oferuje dla dużych katalogów. Po włączeniu, wstępnie generuje flat file zawierający przefiltrowane product IDs dla każdej kombinacji active terms. Zamiast budować i wykonywać złożone WP_Query + tax_query + meta_query przy każdym filter request, wtyczka odczytuje wstępnie obliczony plik — różnica w czasie odpowiedzi jest często rzędu wielkości.
Turbo Mode jest konfigurowany w HUSKY → Rozszerzenia → Turbo Mode. Regeneracja pliku może być zaplanowana za pomocą WordPress cron lub, dla niezawodności, za pomocą prawdziwego serwera crontab (patrz FAQ dotyczące konfiguracji Turbo Mode cron).
Dostosuj limit produktów Turbo Mode
Domyślnie Turbo Mode przetwarza do 15,000 produktów podczas generowania cache. W sklepach z większą liczbą produktów generowanie zatrzymuje się, zanim wszystkie produkty zostaną zindeksowane. Użyj woof_turbo_mode_products_limit hook, aby podnieść ten limit:
add_filter('woof_turbo_mode_products_limit', function($limit) {
// Increase limit for catalogs larger than 15,000 products
return 50000;
});
Hook znajduje się w ext/turbo_mode/index.php:277. Ustaw wartość wystarczająco wysoką, aby objąć cały katalog, ale pamiętaj o PHP execution time i memory limits podczas generowania pliku.
Zoptymalizuj Counter Method dla dużych witryn
System Dynamic Recount używa licznika opartego na WP_Query, który może zużywać znaczną pamięć w sklepach z wieloma produktami. woof_counter_method hook (źródło: classes/counter.php) pozwala przełączyć się na lżejszą metodę liczenia, która ustawia nopaging=false i posts_per_page=1, zmniejszając pamięć na query kosztem potencjalnie mniej precyzyjnych zliczeń:
add_filter('woof_counter_method', function($saving_memory) {
// Enable memory-saving counter mode
return true;
});
Najpierw przetestuj to na swojej witrynie staging — działa dobrze w niektórych konfiguracjach, ale nie we wszystkich.
Dostosuj Filter Query za pomocą woof_products_query
woof_products_query filter hook (źródło: index.php) przekazuje pełną tablicę $query_args przed wykonaniem WP_Query. Użyj go, aby dodać custom meta queries, wykluczyć niektóre produkty lub dostosować query structure dla wydajności:
add_filter('woof_products_query', function($query_args) {
// Exclude products that should never appear in filter results
$query_args['meta_query'][] = array(
'key' => '_exclude_from_filter',
'compare' => 'NOT EXISTS'
);
return $query_args;
});
Do manipulacji na poziomie taxonomy (zmiana relation operators między taxonomies) użyj powiązanego woof_main_query_tax_relations hook.
Włącz WordPress Object Cache dla danych filtra
HUSKY obsługuje woof_use_wp_cache hook do kierowania swoich wewnętrznych danych przez WordPress object cache. Jeśli używasz już persistent object cache backend (Redis, Memcached), włączenie tego hook przenosi dane filtra z bazy danych do szybkiego in-memory storage:
add_filter('woof_use_wp_cache', function($is){
return true;
});
Ważne: Ten hook nie ma wpływu bez zainstalowanej wtyczki persistent object caching. Nie jest zamiennikiem wbudowanych ustawień cache — uzupełnia je, gdy środowisko hostingowe obsługuje object caching.
Połącz ustawienia dla najlepszych rezultatów
Zalecana podstawa dla dużego katalogu (ponad 10,000 produktów, wiele taxonomy terms):
- Włącz Cache dynamic recount i Cache terms w Zaawansowane → Opcje
- Włącz Turbo Mode i ustaw limit produktów, aby odpowiadał rozmiarowi katalogu
- Zastosuj
woof_use_wp_cache, jeśli dostępny jest persistent object cache - Przetestuj
woof_counter_methodna staging, aby sprawdzić, czy tryb oszczędzania pamięci działa dla Twojej konfiguracji - Używaj
woof_products_querytylko wtedy, gdy musisz wykluczyć konkretne produkty z wyników filtra
Zacznij od dwóch wbudowanych przełączników cache — nie wymagają one zmian w kodzie i same w sobie zapewniają najbardziej zauważalną poprawę.