Filtr z suwakiem zakresu w WooCommerce dla atrybutów i pól meta
Rozmiar, moc, długość, przekątna ekranu, rok, przebieg: dane liczbowe produktu wymagają raczej suwaka zakresu niż długiej listy pól wyboru. Filtr z suwakiem zakresu w WooCommerce dla atrybutów łatwo włączyć w HUSKY, ale równie łatwo trafić na suwak, który pokazuje 100000 przed 9000, rozbija 1,9 na dwie wartości albo zawsze biegnie od 0 do 100. Przyczyna jest prawie zawsze ta sama: istnieją dwa różne suwaki i obchodzą się z liczbami inaczej. Ten przewodnik wyjaśnia oba, konfigurację każdego z nich oraz poprawki dla złej kolejności, wartości dziesiętnych i pustych zakresów.
Dwa suwaki zakresu: wartości atrybutu albo liczbowe pole meta
HUSKY może narysować suwak zakresu na podstawie dwóch rodzajów danych, a wybór decyduje o tym, co suwak potrafi.
| Suwak atrybutu (taksonomii) | Suwak pola meta | |
|---|---|---|
| Dane | Terminy atrybutu globalnego lub innej taksonomii produktów | Liczba zapisana w metadanych produktu: _length, _weight, pole liczbowe ACF, dowolne pole niestandardowe |
| Co oznacza zakres | Wszystkie terminy między dwoma uchwytami, w kolejności, w jakiej terminy są wymienione | Prawdziwe porównanie liczbowe: wartość między „od” i „do” |
| Pozycje suwaka | Jeden przystanek na każdy istniejący termin, rozmieszczone równomiernie | Dowolna wartość między minimum a maksimum, z Twoim krokiem |
| Minimum i maksimum | Pierwszy i ostatni termin | Ustawiane ręcznie w opcji Zakres (Range) |
| Pola liczbowe od/do | Nie | Tak, Pokaż pola (Show inputs) |
| Skale tekstowe (miękki, średni, twardy) | Tak | Nie, tylko liczby |
| Produkty zmienne | Wyszukiwane według terminów atrybutu produktu | Przeszukiwane są tylko własne metadane produktu, nie jego warianty |
Kluczowa różnica: terminy atrybutu to tekst. WordPress zapisuje 9000 i 100000 jako nazwy, a nie liczby, więc suwak atrybutu może jedynie przechodzić po liście terminów w zadanej kolejności. Niczego nie oblicza. Suwak pola meta porównuje liczby w bazie danych, więc obsługuje dowolną wartość z zakresu, także taką, której nie ma żaden inny produkt.
Atrybuty niestandardowe produktu wpisane bezpośrednio na karcie Atrybuty produktu, bez atrybutu globalnego za nimi, nie są taksonomiami i żaden typ filtra nie może ich użyć. Najpierw utwórz atrybut globalny w Produkty → Atrybuty (zobacz zarządzanie taksonomiami produktów w dokumentacji WooCommerce).
Konfiguracja filtra z suwakiem zakresu dla atrybutów
- Utwórz atrybut globalny, na przykład Moc, i dodaj jego wartości jako terminy:
5,7.5,10,15. Przypisz je do produktów jak zwykle. - Otwórz WooCommerce → Ustawienia → Products Filter → Struktura i ustaw typ tego atrybutu na Suwak (Slider). Ten typ dodaje rozszerzenie Slider.
- Kliknij przycisk dodatkowe opcje (additional options) (koło zębate) obok atrybutu i ustaw opcje suwaka:
- Typ (Type): podwójny (double) dla zakresu od–do; pojedynczy (single) dla jednego uchwytu, który wybiera wszystko od pierwszej wartości do uchwytu („do 10 kW”).
- Krok siatki (Grid step): które etykiety pod suwakiem są widoczne.
1pokazuje wszystkie,2co drugą,-1ukrywa etykiety między końcami. Przydatne, gdy długie wartości nachodzą na siebie. - Włącz dynamiczne przeliczanie (Enable dynamic recount): usuwa wartości bez produktów w bieżących wynikach (zobacz poniżej).
- Skórka suwaka (Slider skin): wygląd tego suwaka.
- Pozostaw Logika filtrowania (Logic of filtering) na LUB (OR). Suwak wysyła każdy termin wybranego odcinka, na przykład
pa_power=5,7-5,10, a produkt potrzebuje tylko jednego z nich. Przy ORAZ (AND) produkt musiałby mieć wszystkie i nic nie zostałoby znalezione.
Ponieważ zakres to „terminy między uchwytami”, cała logika suwaka zależy od kolejności terminów. Jeśli 6.5 znajduje się na liście za 8.2, zakres od 6 do 7 go pominie. Następna sekcja naprawia kolejność.
Wartości suwaka atrybutu w złej kolejności
Typowe objawy: 100000 przed 9000, 10 i 11 przed 2, wartości ujemne w układzie -1, -2, -3, 0, 1 albo uchwyty skaczące w przód i w tył podczas przeciągania. Wszystkie wynikają z sortowania tekstowego. Rozwiązaniem jest nadanie terminom kolejności liczbowej.
Najlepiej: pozwól WooCommerce sortować atrybut numerycznie
Przejdź do Produkty → Atrybuty, edytuj atrybut i ustaw Domyślna kolejność sortowania (Default sort order) na Nazwa (numerycznie) (Name (numeric)). WooCommerce porządkuje wtedy terminy według wartości liczbowej ich nazw, co obsługuje wartości dziesiętne zapisane z kropką, liczby ujemne i nazwy zaczynające się od liczby, takie jak 10 cm. W dodatkowych opcjach suwaka pozostaw Sortuj określenia (Sort terms) na Domyślne (Default), aby HUSKY zachował tę kolejność. Jeśli Określenia cache (Cache terms) jest włączone (Zaawansowane → Opcje), naciśnij potem wyczyść pamięć podręczną okresleń (clear terms cache).
Dla skali tekstowej wybierz zamiast tego Własna kolejność (Custom ordering) i przeciągnij terminy na miejsce na ekranie Konfiguruj terminy (Configure terms) atrybutu: Miękki, Średni, Średnio twardy, Twardy. To samo przeciąganie działa dla każdej listy liczbowej, której kolejnością chcesz sterować ręcznie.
Własne opcje Sortuj określenia w HUSKY
Opcja Sortuj określenia (Sort terms) w dodatkowych opcjach suwaka nadpisuje kolejność domyślną:
- Tytuł (Title) stosuje naturalne sortowanie nazw: poprawne dla dodatnich liczb całkowitych (2 przed 10) i dla nazw takich jak
10 cm, ale nie dla wartości dziesiętnych ani ujemnych. - Numeryczny. (Numeric.) porównuje wartość całkowitoliczbową sluga terminu. Działa tylko dla dodatnich liczb całkowitych: slug dla
6.5to6-5, co liczy się jako 6, a WordPress usuwa początkowy minus podczas tworzenia sluga, więc-3jest sortowane jako 3.
Kod: kolejność numeryczna dla dowolnego suwaka taksonomii
Dla taksonomii niestandardowej, w której Nazwa (numerycznie) (Name (numeric)) z WooCommerce nie jest dostępna, posortuj wartości suwaka w kodzie. Filtr woof_sort_terms_before_out otrzymuje terminy każdego filtra oraz typ filtra:
/**
* HUSKY: order the values of every taxonomy range slider by their number
* (decimals with a dot and negative numbers included).
* Child theme functions.php or a code snippets plugin.
*/
add_filter( 'woof_sort_terms_before_out', function ( $terms, $type ) {
if ( 'slider' === $type && is_array( $terms ) ) {
uasort( $terms, function ( $a, $b ) {
return (float) $a['name'] <=> (float) $b['name'];
} );
}
return $terms;
}, 20, 2 );
Terminy bez liczby na początku (skala tekstowa) liczą się tu jako 0 i zachowują dotychczasową kolejność, więc fragment kodu nie zakłóca takich suwaków.
Wartości dziesiętne, przecinki i nierówne kroki w suwakach atrybutów
- Zapisuj wartości dziesiętne z kropką. Suwak otrzymuje etykiety jako jedną listę rozdzieloną przecinkami, więc termin o nazwie
1,9staje się dwiema etykietami,1i9, a każda następna pozycja wskazuje zły termin. Zmień nazwy takich terminów na1.9. Nie ma to nic wspólnego z ustawieniem separatora dziesiętnego sklepu: nazwy terminów to zwykły tekst. - Pozycje są rozmieszczone równomiernie według terminów, a nie wartości. Terminy 1, 2, 5 i 50 dostają cztery równe kroki. Jeśli suwak ma wyglądać proporcjonalnie, dodaj brakujące wartości pośrednie jako terminy.
- Suwak potrzebuje co najmniej dwóch wartości. Przy dwóch terminach uchwyty mogą stać tylko na dwóch końcach. Jeśli po dynamicznym przeliczeniu zostanie mniej niż dwie wartości, suwak w ogóle się nie wyświetla.
- Można wybrać tylko istniejące terminy. Produkt o wartości 6.5 zostanie znaleziony tylko wtedy, gdy termin 6.5 istnieje i leży między uchwytami.
Suwak zakresu dla pól meta: wymiary, lata i inne liczby
Gdy wartość jest prawdziwym pomiarem, suwak pola meta jest zwykle lepszym narzędziem: porównuje liczby, przyjmuje pola od/do i pozostaje szybki przy tysiącach różnych wartości. Konfiguracja z rozszerzeniem Meta Fields:
- Otwórz kartę Meta Dane (Meta Data) w ustawieniach filtra. Wpisz klucz w polu Dodaj własny klucz ręcznie (Add Custom key by hands) albo użyj Pozyskaj klucze dowolnego produktu wg jego ID (Get keys from any product by its ID), aby zobaczyć, jakie klucze ma produkt.
- Ustaw typ pola na liczba (number), a jego widok na Suwak (Slider). Suwak nie jest oferowany dla pól tekstowych ani dat. Zapisz.
- Otwórz dodatkowe opcje pola i wypełnij Zakres (Range) jako
min^max, na przykład10^250. Ustaw Krok (Step) (0.5działa) oraz w razie potrzeby Przedrostek (Prefix), Przyrostek (Postfix) (cm), Pokaż pola (Show inputs) dla pól liczbowych od/do i Użyj formatowania liczb (Use prettify) dla separatora tysięcy. - Umieść nowy element filtra na karcie Struktura jak każdy inny.
Przydatne klucze: WooCommerce zapisuje wymiary wysyłkowe i wagę produktu jako _length, _width, _height i _weight. Pole liczbowe ACF jest zapisane pod nazwą swojego pola. Szczegóły o kluczach meta znajdziesz w dokumentacji metadanych.
Co warto wiedzieć o suwakach meta:
- Zakres nigdy nie jest obliczany. Suwak pokazuje dokładnie wpisany Zakres (Range); puste pole przyjmuje domyślnie 0–100. Znalezienie prawdziwego minimum i maksimum wymagałoby odczytania każdego produktu przy każdym wyświetleniu strony. Dynamiczne przeliczanie decyduje o tym, które filtry i wartości są pokazywane, a nie o tym, gdzie suwak się zaczyna i kończy. Zaktualizuj zakres, gdy nowe produkty wykroczą poza niego.
- Przechowuj zwykłe liczby z kropką jako separatorem dziesiętnym i bez separatora tysięcy:
1250.5. Baza danych odczytuje tylko liczbę na początku wartości, więc1,250.5jest porównywane jako 1, a1250,5jako 1250. - Lata: zakres taki jak
1990^2026, krok1i Użyj formatowania liczb (Use prettify) ustawione na Nie (No), inaczej 2026 zostanie wyświetlone jako 2 026. - Warianty: przeszukiwane są metadane samego produktu. Jeśli wartość istnieje tylko w wariantach, zapisz ją także w produkcie nadrzędnym albo użyj atrybutu.
Wartości dziesiętne: woof_slider_meta_query_type
Domyślnie suwak meta porównuje wartości jako NUMERIC, co MySQL traktuje jak liczby całkowite. Produkt z wartością 10.11 zostanie więc znaleziony w zakresie 1–10, a 4.2, 4.4 i 4.6 liczą się jako 4. Aby porównywać wartości dziesiętne, zmień typ za pomocą filtra woof_slider_meta_query_type:
/**
* HUSKY: compare these meta sliders as decimal numbers.
* Child theme functions.php or a code snippets plugin.
*/
add_filter( 'woof_slider_meta_query_type', function ( $type, $meta_key ) {
if ( in_array( $meta_key, array( '_length', '_width', '_height', 'screen_size' ), true ) ) {
return 'DECIMAL(10,2)'; // up to 99999999.99
}
return $type;
}, 10, 2 );
W DECIMAL(M,D) wartość M to łączna liczba cyfr, a D liczba cyfr po przecinku. Dobierz je do swojej największej wartości: przy DECIMAL(5,3) maksimum to 99.999, a każda większa wartość jest traktowana jako 99.999.
Ukrywanie suwaków, które nie dotyczą bieżącej kategorii
- Suwak atrybutu: ustaw Włącz dynamiczne przeliczanie (Enable dynamic recount) na Tak (Yes) w jego dodatkowych opcjach. Wartości bez produktów w bieżącej kategorii i wyborze filtrów znikają, a gdy zostaną mniej niż dwie wartości, suwak jest usuwany. Każda wartość kosztuje jedno dodatkowe zapytanie liczące, więc przy atrybutach z setkami terminów obserwuj szybkość strony albo użyj suwaka meta.
- Suwak meta: gdy Ukryj puste określenia (Hide empty terms) jest ustawione na Tak (Yes) na karcie Opcje, suwak meta, który nie ma produktów w swoim zakresie w bieżących wynikach, nie jest wyświetlany.
Suwak atrybutu bez wartości jest usuwany przez skrypt wtyczki po załadowaniu strony, więc jego tytuł może na chwilę mignąć. Ten CSS ukrywa go od początku (Wygląd → Dostosuj → Dodatkowy CSS albo arkusz stylów motywu potomnego):
/* HUSKY: hide empty taxonomy sliders before the script removes them */
.woof_container_slider:has(.woof_hide_slider) {
display: none;
}
Gdy sam produkt ma zakres
Suwak znajduje produkty według jednej wartości na produkt. Jeśli produkt obejmuje zakres (nadaje się dla wzrostu 150–190 cm, dla 3–10 graczy), nie ma wbudowanego wyszukiwania „zakresy się pokrywają”. Dwa sprawdzone modele:
- Dwa pola meta, na przykład
players_miniplayers_max, każde z własnym suwakiem. Odwiedzający szukający gry dla 4 graczy ustawia pierwszy suwak na 1–4, a drugi na 4–10. - Atrybut z jednym terminem na wartość (150, 151 ... 190), z przypisanymi do produktu wszystkimi pasującymi terminami, wyświetlany jako suwak. Przypisuj terminy zbiorczo, a nie ręcznie.
Lista kontrolna
- Suwak atrybutu: atrybut globalny, wartości dziesiętne zapisane z kropką, Domyślna kolejność sortowania (Default sort order) ustawione na Nazwa (numerycznie) (Name (numeric)) albo terminy przeciągnięte w odpowiednią kolejność, Logika filtrowania (Logic of filtering) na LUB (OR).
- Suwak meta: typ pola liczba (number), zwykłe wartości liczbowe, Zakres (Range) wypełniony jako
min^max, typ dziesiętny dla wartości ułamkowych. - Wiele różnych wartości lub prawdziwe pomiary: suwak meta zamiast atrybutu z setkami terminów.
- Suwaki w niewłaściwych kategoriach: Włącz dynamiczne przeliczanie (Enable dynamic recount) dla suwaków atrybutów, Ukryj puste określenia (Hide empty terms) dla suwaków meta.
Jeśli suwak nadal pokazuje błędne wartości po tych krokach, zapytaj na forum wsparcia HUSKY, podając atrybut lub klucz meta, kilka przykładowych wartości i link do strony.