Filtr WooCommerce: tylko atrybuty bieżącej kategorii
Gdy kilka kategorii produktów korzysta z jednego atrybutu, filtr WooCommerce często oferuje wartości, które na danej stronie nie mają sensu: Grill w lodówkach, 512 GB w słuchawkach, marki, których nie ma w tej kategorii. Kliknięcie takiej wartości daje pusty wynik. Aby filtr WooCommerce pokazywał tylko atrybuty bieżącej kategorii, HUSKY zlicza produkty stojące za każdym terminem na stronie i ukrywa te, których licznik wynosi zero. Poniżej opisujemy, jak to działa, dokładne ustawienia, jak ukryć liczby oraz przypadki, w których kategoria w ogóle nie jest znana.
Skąd filtr wie, co należy do bieżącej kategorii
Na stronie kategorii produktów oraz w każdym innym archiwum taksonomii produktów (tag, archiwum atrybutu, marka) HUSKY zapamiętuje termin, który strona wyświetla. Przy włączonym Dynamicznym przeliczaniu (Dynamic recount) liczba obok każdego terminu filtra jest obliczana jako: produkty tej kategorii, które spełniają wszystko, co odwiedzający już wybrał, i mają ten termin. Wartość, której nie ma żaden produkt w kategorii, dostaje 0.
Ukryj puste określenia (Hide empty terms) usuwa następnie z formularza każdy termin z wartością 0. Gdy znikną wszystkie terminy sekcji, znika też cała sekcja wraz z tytułem, więc atrybut nieużywany w kategorii znika z paska bocznego. Sama sekcja kategorii jest przycinana do podkategorii oglądanej kategorii; ten fragment i jego wyjątki wyjaśnia artykuł dlaczego filtr pokazuje tylko podkategorie.
Nic nie trzeba konfigurować osobno dla każdej kategorii. Ten sam formularz umieszczony na pasku bocznym lub w szablonie kategorii sam dopasowuje się do każdej strony kategorii.
Trzy ustawienia, które ukrywają puste terminy
Otwórz ustawienia wtyczki, zakładkę Opcje (Options), i ustaw:
- Pokaż ilość (Show count): Tak
- Dynamiczne przeliczanie (Dynamic recount): Tak
- Ukryj puste określenia (Hide empty terms): Tak
Zapisz, a następnie wyczyść każdą pamięć podręczną, która może przechowywać stare liczby: Cache'uj dynamiczny numer ponownego liczenia dla każdego elementu w filtrze (Cache dynamic recount number for each item in filter) i Określenia cache (Cache terms) w Zaawansowane → Opcje (Advanced → Options), jeśli z nich korzystasz, oraz pamięć podręczną stron swojej witryny.
Te trzy opcje są od siebie zależne, a strona ustawień to wymusza: pusty termin można znaleźć tylko przez zliczanie. Włączenie Ukryj puste określenia (Hide empty terms) włącza też dwie pozostałe, a wyłączenie Pokaż ilość (Show count) wyłącza dwie pozostałe. Jeśli ustawisz Pokaż ilość (Show count) na Nie, żeby pozbyć się liczb, puste terminy wrócą na każdej stronie. Możliwe kombinacje:
| Pokaż ilość / Dynamiczne przeliczanie / Ukryj puste określenia | Co widzą odwiedzający |
|---|---|
| Nie / Nie / Nie | Wszystkie terminy, bez liczb |
| Tak / Nie / Nie | Liczby dla całego sklepu; terminy bez żadnego produktu są wyszarzone |
| Tak / Tak / Nie | Liczby dla bieżącej kategorii i wyboru; terminy z zerem pozostają widoczne, ale są wyszarzone i nie można ich wybrać |
| Tak / Tak / Tak | Terminy z zerem są ukryte; puste sekcje znikają |
Trzeci wiersz to wybór wtedy, gdy wolisz pokazywać niedostępne wartości jako nieaktywne zamiast je usuwać. Globalne opcje może nadpisać jeszcze kilka miejsc:
- W wersji darmowej Ukryj puste określenia (Hide empty terms) i Ukryj tekst ilości określeń (Hide terms count text) (poniżej) są wyszarzone; należą do wersji premium.
- Widżet filtra HUSKY ma własne pole Dynamiczne przeliczanie (Dynamic recount) (Domyślne (Default), Nie (No), Tak (Yes)). Jeśli ustawisz je na Nie (No), ten widżet ignoruje ustawienie globalne. Shortcode [woof] ma ten sam przełącznik jako
dynamic_recount=1lubdynamic_recount=0. - Gdy włączony jest Tryb Turbo, zakładka Opcje (Options) pokazuje osobne kopie tych trzech ustawień dla Trybu Turbo. Po jego włączeniu ustaw je ponownie.
- Taksonomia wyświetlana jako suwak zakresu nie jest przeliczana przez opcje globalne. Otwórz jej opcje dodatkowe (ikona koła zębatego obok taksonomii w zakładce Struktura (Structure)) i ustaw Włącz dynamiczne przeliczanie (Enable dynamic recount) na Tak; wartości bez produktów są wtedy pomijane na skali suwaka.
Pozostałe ustawienia z tego samego ekranu opisuje dokumentacja zakładki Opcje.
Ukrywanie pustych terminów bez pokazywania liczby
Najczęstsze życzenie to ukryć puste terminy bez wyświetlania liczb w rodzaju (12). Zostaw włączone wszystkie trzy opcje i przejdź do Zaawansowane → Opcje (Advanced → Options): ustaw Ukryj tekst ilości określeń (Hide terms count text) na Tak. Wtyczka nadal oblicza liczby, których potrzebuje, by wiedzieć, co jest puste, ale ich nie wyświetla. Aby zrobić to tylko dla jednego formularza, dodaj do jego shortcode'a hide_terms_count=1, na przykład [woof hide_terms_count=1].
Ukrycie licznika za pomocą CSS działa także dla pól wyboru i przycisków opcji (.woof_checkbox_count, .woof_radio_count), ale nie dla list rozwijanych: tam liczba jest częścią tekstu opcji i nie ma własnego elementu. Ustawienie obejmuje każdy typ filtra.
Aby zmienić licznik tylko w niektórych sekcjach, użyj haka woof_term_count_format. Otrzymuje on format, domyślnie (%d), oraz slug taksonomii:
/*
* HUSKY: counter format per filter section.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woof_term_count_format', function ($format, $tax_slug) {
// no numbers at all in the Tags and Brand sections
if (in_array($tax_slug, array('product_tag', 'pa_brand'), true)) {
return '';
}
// "12" instead of "(12)" everywhere else
return '%d';
}, 10, 2);
Puste terminy są w tych sekcjach nadal ukrywane, ponieważ ukrywanie zależy od obliczonej liczby, a nie od wyświetlanego tekstu. Aby pokazywać liczby tylko na najniższym poziomie drzewa kategorii, ukryj za pomocą CSS liczniki terminów, które mają potomków (pole Custom CSS w Twoim motywie):
.woof_childs_list_li > .woof_checkbox_label > .woof_checkbox_count {
display: none;
}
Wybrany termin nigdy nie pokazuje liczby. Tak zostało to pomyślane: przeliczanie pomija terminy, które są już częścią wyszukiwania.
Dlaczego po pierwszym wyborze znikają inne wartości
Dynamiczne przeliczanie zawęża formularz z każdym wyborem: po wybraniu Marka: Bosch zostają tylko kolory, które mają produkty Bosch w tej kategorii. Na tym polega ta funkcja. Nie da się jej wyłączyć tylko dla jednej sekcji.
Innym przypadkiem jest sytuacja, gdy wybranie jednego koloru ukrywa wszystkie pozostałe kolory. To wynika z logiki sekcji. Otwórz opcje dodatkowe taksonomii (ikona koła zębatego w zakładce Struktura (Structure)) i spójrz na Logika filtrowania (Logic of filtering):
- OR (domyślnie): produkty, które mają co najmniej jedną z wybranych wartości. Każdy inny kolor jest liczony osobno (w ramach wyborów w pozostałych sekcjach), więc kolory istniejące w kategorii pozostają.
- AND: produkty, które mają wszystkie wybrane wartości naraz. Licznik każdego innego koloru oznacza wtedy „produkty, które są jednocześnie czerwone i niebieskie”, zwykle 0, więc przy Ukryj puste określenia (Hide empty terms) znikają.
- NOT IN: wyklucza produkty z wybranymi wartościami.
Dla kolorów, rozmiarów i większości atrybutów, przy których odwiedzający chce „tego albo tamtego”, właściwą logiką jest OR. AND zachowaj dla cech, które muszą występować wszystkie naraz, jak „Wi-Fi i Bluetooth”.
Dla opcji, które zawężają się, zanim załadują się jakiekolwiek produkty (wyszukiwarka złożona z zależnych list rozwijanych), użyj [woof ajax_redraw=1 autosubmit=1]: każda zmiana przerysowuje tylko formularz z przeliczonymi opcjami, a przycisk filtra ładuje produkty. ajax_redraw nie jest przeznaczony dla trybu AJAX, więc dla tego formularza zostaw wyłączone Próbuj zajaxować sklep (Try to ajaxify the shop).
Strona sklepu, własne strony i kreatory stron
Automatyczne zawężanie wymaga archiwum taksonomii. Gdzie indziej nie ma bieżącej kategorii:
- Główna strona sklepu pokazuje cały katalog, więc dopóki odwiedzający niczego nie wybierze, ukryte są tylko wartości bez żadnego produktu w sklepie. To prawidłowe zachowanie.
- Strona WordPressa (strona główna, strona docelowa, strona zbudowana w Elementorze lub Divi, która wyświetla jedną kategorię) nie jest archiwum kategorii, nawet jeśli pokazuje tylko produkty tej kategorii. Filtr nie może tego wiedzieć i wyświetla wszystko.
Na takiej stronie wskaż obu shortcode'om, której kategorii dotyczy strona. Użyj identyfikatora terminu z Produkty → Kategorie (Products → Categories):
[woof taxonomies=product_cat:15]
[woof_products taxonomies=product_cat:15 per_page=12]
Atrybut taxonomies w [woof] sprawia, że liczby i ukrywanie podążają za tą kategorią, a ten sam atrybut w [woof_products] ogranicza wyświetlane produkty. Kilka identyfikatorów jednej taksonomii rozdziela się przecinkami (product_cat:15,16, produkty z którejkolwiek), kilka taksonomii znakiem plus (product_cat:15+pa_color:22). Działa to tylko przy włączonych trzech opisanych wyżej opcjach. Pełną konfigurację takich stron opisuje artykuł filtr produktów na własnej stronie lub stronie głównej.
Jeśli potrzebujesz innego zestawu sekcji dla każdej kategorii, a nie innych wartości, zobacz jak pokazywać różne filtry dla poszczególnych kategorii.
Jeśli filtr w prawdziwym archiwum kategorii nadal zachowuje się jak na stronie sklepu, szablon archiwum motywu może ukrywać bieżącą kategorię przed wtyczką; zdarza się to głównie w szablonach opartych na blokach. W Zaawansowane → Opcje (Advanced → Options) ustaw Dodatkowe sprawdzanie strony kategorii (Additional check of the category page) na Tak.
Lżejsza opcja bez dynamicznego przeliczania
Jeśli chcesz tylko ukryć terminy, które nie mają produktów nigdzie w sklepie (stare rozmiary, markę wycofaną ze sprzedaży), dynamiczne przeliczanie nie jest potrzebne. Ten fragment kodu każe WordPressowi pomijać takie terminy, gdy HUSKY je ładuje:
/*
* HUSKY: do not list terms that have no published products at all.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woof_get_terms_args', function ($args) {
$args['hide_empty'] = true;
return $args;
});
Nie kosztuje nic przy ładowaniu strony, ale nie wie nic o bieżącej kategorii ani o wyborze odwiedzającego: rozmiar, który istnieje tylko w butach, nadal pokaże się w kategorii koszul. Jeśli Określenia cache (Cache terms) jest włączone, po dodaniu kodu wyczyść pamięć podręczną terminów. Ten sam fragment pokazuje FAQ jak ukryć puste terminy.
Ile kosztuje dynamiczne przeliczanie w dużych katalogach
Każdy termin w formularzu wymaga przy każdym wyświetleniu strony własnego zapytania zliczającego, także te ukryte, więc formularz z 300 terminami wykonuje około 300 zapytań zliczających. Przy kilku tysiącach produktów jest to niezauważalne; przy dziesiątkach tysięcy może spowolnić każdą stronę kategorii. Zanim wyłączysz tę funkcję:
- włącz Cache'uj dynamiczny numer ponownego liczenia dla każdego elementu w filtrze (Cache dynamic recount number for each item in filter) w Zaawansowane → Opcje (Advanced → Options);
- używaj
dynamic_recount=0w formularzach, w których zawężanie nie jest potrzebne, na przykład w formularzu wyszukiwania w nagłówku; - rozważ Tryb Turbo, który filtruje i zlicza na podstawie przygotowanego pliku danych zamiast zapytań do bazy.
Szczegóły znajdziesz w artykule jak przyspieszyć filtrowanie produktów w dużych katalogach.
Lista kontrolna, gdy nadal pokazują się nieistotne opcje
- Pokaż ilość (Show count), Dynamiczne przeliczanie (Dynamic recount) i Ukryj puste określenia (Hide empty terms) mają wartość Tak (albo ich kopie dla Trybu Turbo, jeśli Tryb Turbo jest włączony).
- Liczby są ukryte za pomocą Ukryj tekst ilości określeń (Hide terms count text), a nie przez ustawienie Pokaż ilość (Show count) na Nie.
- Pole Dynamiczne przeliczanie (Dynamic recount) widżetu ma wartość Domyślne (Default) lub Tak (Yes); w shortcodzie nie ma
dynamic_recount=0. - Testujesz na prawdziwym archiwum kategorii albo shortcode na własnej stronie ma
taxonomies=. - Pamięć podręczna przeliczeń, pamięć podręczna terminów i pamięć podręczna stron zostały po zmianie wyczyszczone.
- Logika filtrowania (Logic of filtering) atrybutu to OR, jeśli inne wartości mają pozostać po dokonaniu wyboru.
Jeśli to wszystko jest ustawione, a kategoria nadal wyświetla wartości bez produktów, załóż temat na forum wsparcia HUSKY, podając link do strony kategorii i wartość, która powinna być ukryta.