<ws-filter> ermöglicht die Filterung der Suchergebnisse oder Kategorien basierend auf verschiedenen Produkteigenschaften. Sie unterstützt verschiedene Filtertypen wie Checkboxen, Wertebereiche (Range), Schieberegler (Slider), bildbasierte Auswahl (Image) und klickbare Labels (Label).
Es werden dynamisch generierte Filter (beispielsweise Farben) sowie individuell definierte Custom-Filter (beispielsweise Topseller, Verfügbarkeit) unterstützt.
Voraussetzung
- Die Komponente muss innerhalb von
<ws-filters>eingebunden werden - Damit die Filterkomponente korrekt funktioniert, muss das Attribut
name=""den technischen Spaltennamen aus dem Datenfeed enthalten, dieser muss zwingend lowercase (kleingeschrieben) sein. Dieser Spaltenname gibt an, auf welches Produktdatenfeld sich der Filter beziehen soll. Beispiele für mögliche Spaltennamen sind:price: Für Preisfilter.color: Für Farbauswahlfilter.brand: Für Markenfilter.
- Die Spaltennamen im Datenfeed werden über die Datenfelder definiert, die in der Konfiguration des Such-Moduls aktiviert und für Filter, Sortierung oder Suche verwendet werden.
Dynamische und Custom-Filter
Die Komponente<ws-filter> unterstützt zwei Arten von Filtern: dynamische Filter und Custom-Filter. Beide Filterarten können im Frontend gleich aussehen (beispielsweise als Checkbox).
Dynamische Filter
Dynamische Filter basieren direkt auf den Produktdaten, also auf Informationen, die im Datenfeed zu jedem einzelnen Produkt verfügbar sind. Typische Beispiele sind Farbe, Größe oder Marke. Typische Einsatzbereiche für dynamische Filter:- Farbe (
color) - Größe (
size) - Marke (
brand) - Preis (
price) - Zutaten (
ingredients)
Custom-Filter
Custom-Filter basieren nicht auf den einzelnen Werten im Feed, sondern auf technisch definierten Filterbedingungen (beispielsweise „Lagerbestand ≥ 1”). Custom-Filter sind somit vordefinierte Filter, bei denen Sie entscheiden, was genau gefiltert werden soll. Typische Anwendungsfälle:- Nur verfügbare Produkte (beispielsweise Lagerbestand > 0)
- „Neuheiten” basierend auf dem Creation Date
- Sale-Produkte (beispielsweise
is_reduced = true) - Bewertung (beispielsweise
rating >= 4)
Komponente für Filter
Die einzelnen<ws-filter> für die Filter-Elemente müssen immer innerhalb von <ws-filters> liegen.
Ist <ws-filters> bereits vorhanden, können die weiteren Filter einfach dort ergänzt werden.
Komponente für dynamische Filter
Die Komponente kann wie folgt auf der Kategorie- und Suchergebnisseite eingebunden werden:- Attribute
-
type: Gibt den Filtertyp an.checkbox: Auswahl über Checkboxen (beispielsweise Kategorien oder Farben)negate: Aktiviert den Ausschluss-Filter. Produkte, die die gewählten Filterwerte enthalten, werden nicht angezeigt. Nur beitype="checkbox"verfügbar
range: Schieberegler für Wertebereiche (beispielsweise Preis).display-type: Darstellungstyp des Range-Filtersslider: Stellt den Range-Filter nur als einen Slider darfields: Stellt den Range-Filter nur als Number-Input-Felder dar (2 Input-Felder)slider-fields: Stellt den Range-Filter als Slider und Number-Input-Felder dar
image: Bildbasierte Auswahl über anklickbare Bilder (beispielsweise Farben, Materialien, Muster). Details siehe Bildbasierte Filter.label: Klickbare Label-Optionen mit verstecktem Checkbox-Input (beispielsweise Größen). Details siehe Label-Filter.
-
multiple="true": Erlaubt die Mehrfachauswahl (fürtype="checkbox",type="image"undtype="label", Default beiimageundlabel:false). -
use-sort: Legt die Reihenfolge der Filterwerte fest. Details siehe Reihenfolge der Filterwerte.- ohne Angabe: alphabetisch aufsteigend
count: nach Trefferanzahl absteigendnumeric: numerisch aufsteigend. Ersetzt das bisherige Attributuse-numeric-sort="true".
-
data-template: Vorlage für die Beschriftung der Filterwerte mit den Platzhaltern{%value%}und{%count%}. Ohne dieses Attribut zeigt der Filter nur den Wert. Wirkt nur beitype="checkbox"undtype="label". Beitype="image"wird das Attribut ignoriert. Details siehe Trefferanzahl pro Filterwert anzeigen. -
name: Definiert das Produktdatenfeld, auf das der Filter angewendet wird, beispielsweisecatidsfür Kategorienpricefür Preis
-
Produktdatenfelder, die als Filter genutzt werden, werden standardmäßig positiv ausgewertet. Soll ein Feld alternativ oder ausschließlich negativ filtern, muss in der Konfiguration die negative Variante zu aktiviert werden. Die Logik steuert das Attribut
negate innerhalb von <ws-filters>. Wenn beide Varianten parallel verfügbar sein sollen, ist für die negative Darstellung der technische Feldname mit dem Präfix neq_ (beispielsweise neq_field_name) zu verwenden. Bei ausschließlich negativer Nutzung ist kein separates neq_-Feld erforderlich. Wichtig: Damit das neq_-Feld überhaupt existiert, muss das negate-Attribut zusätzlich im Importmodul gesetzt werden.Soll der Nutzer selbst zwischen Include und Exclude umschalten können, steht dafür die Komponente ws-filter-toggle zur Verfügung.Komponente für Custom-Filter
Die einzelnen<ws-filter> für die Filter-Elemente müssen immer innerhalb von <ws-filters> liegen.
Die Komponente kann wie folgt auf der Kategorie- und Suchergebnisseite eingebunden werden:
- Attribute
type: Gibt den Filtertyp an.checkbox: Auswahl über Checkboxen (beispielsweise Kategorien oder Farben)negate: Aktiviert den Ausschluss-Filter. Produkte, die die gewählten Filterwerte enthalten, werden nicht angezeigt. Nur beitype="checkbox"verfügbar
name: Definiert das Produktdatenfeld, auf das der Filter angewendet wird, beispielsweisecatidsfür Kategorienpricefür Preis
disable-style: Gibt an, wie sich der Filter verhalten soll, wenn er keine Werte enthält:hide: Filter verschwindet grafisch. Nur dieser Wert blendet den Filter tatsächlich ausinactive: Filter bleibt sichtbar und ist inaktiv → reagiert nichtgray-out: Filter bleibt sichtbar, wird ausgegraut und ist inaktivline-through: Filter bleibt sichtbar, wird durchgestrichen und ist inaktivblur: Filter bleibt sichtbar, wird geblurred (2px) und ist inaktivdisable-style="disable-style": Abseits der vordefinierten Styles kann man auch die Klassedisable-styleanlegen und diese in der eigenen CSS-Datei entsprechend mit Anweisungen belegen. Der Filter bleibt dabei sichtbar
static-label: Optionaler Label-Text zur Anzeige eines benutzerdefinierten Textes für einen Custom-Filter
<ws-filter>-Instanzen müssen immer innerhalb von <ws-filters> platziert werden. Ist <ws-filters> bereits vorhanden, können die Custom-Filter dort ergänzt werden.Bildbasierte Filter (type="image")
Wenn Sie die Option type="image" auswählen, werden die Filteroptionen als anklickbare Bilder statt als Text dargestellt. Sie können beispielsweise Farbfelder, Materialproben oder Muster verwenden. Die Funktionsweise des Filters entspricht der eines Checkbox-Filters: Ein Klick auf das Bild wählt den Wert aus, ein weiterer Klick hebt die Auswahl wieder auf.
- Attribute
image-path: Pflichtfeld. Pfad zum Verzeichnis, in dem die Bilder der Filteroptionen liegen. Details siehe „Bildpfad“ weiter unten.image-format: Dateiformat der Bilder. Möglich sindjpg,pngundwebp. Default:jpgimage-map: JSON-Mapping von Filterwert zu Dateiname, für Bildnamen, die von der automatischen Namens-Normalisierung abweichen.label-class: CSS-Klasse für das Label-Element.multiple: Erlaubt die Mehrfachauswahl. Default:false
image-path, dem normalisierten Filterwert und image-format. Für den Dateinamen wird der Filterwert normalisiert:
- Kleinbuchstaben
- Leerzeichen werden zu Unterstrichen
- Alle Zeichen außer
abisz,0bis9,_und-werden entfernt. Umlaute undßfallen dabei ersatzlos weg.
Weicht ein Bildname von dieser Konvention ab, kann die Zuordnung über
image-map definiert werden. Dies ist besonders bei Werten mit Umlauten oder dem Buchstaben ß wichtig. Ordnen Sie solchen Werte über image-map den passenden Dateinamen zu, damit die Komponente das richtige Bild lädt.
Bildpfad
Der Wert von image-path lässt sich auf zwei Arten angeben:
- Pfad ohne Domain wie
/images/colors/oderimages/colors/: Der Pfad wird immer vom Domain-Root des Shops aus aufgelöst. Beide Schreibweisen ergeben also dieselbe URL, beispielsweisehttps://ihr-shop.de/images/colors/. - Vollständige URL wie
https://example.com/colors/: lädt die Bilder von der angegebenen Domain.
- Die Komponente fügt das Bild als
<img>-Element in das Label der Filteroption ein. - Ein Tooltip zeigt den ursprünglichen Wert der Option an.
- Ausgewählte Optionen erhalten die CSS-Klasse
.checkedam Label. - Kann ein Bild nicht geladen werden, zeigt die Komponente automatisch den Text der Option an. Ein fehlendes Bild führt also nicht zu einer leeren Fläche.
Label-Filter (type="label")
Mit type="label" werden Filteroptionen als klickbare Labels mit verstecktem Checkbox-Input dargestellt, beispielsweise für Größen, die als Buttons statt als Checkbox-Liste angeboten werden sollen.
- Attribute
label-map: JSON-Mapping von Filterwert zu Anzeige-Label (beispielsweise{"xl": "Extra Large"}), für Anzeigetexte, die vom technischen Wert abweichen.data-template: Vorlage für den Label-Inhalt, beispielsweise{%value%} ({%count%})für den Wert mit Trefferanzahl. Details siehe Trefferanzahl pro Filterwert anzeigen.label-class: CSS-Klasse für das Label-Element.multiple: Erlaubt die Mehrfachauswahl. Default:false
- Der Checkbox-Input wird versteckt gerendert. Die Auswahl erfolgt über das klickbare Label.
- Ausgewählte Optionen erhalten die CSS-Klasse
.activeam Label.
Trefferanzahl pro Filterwert anzeigen (data-template)
Das Suchmodul liefert zu jedem Filterwert die Anzahl der Produkte im aktuellen Ergebnis, die diesen Wert haben. Mit dem Attributdata-template wird diese Zahl neben dem Filterwert angezeigt. Ohne dieses Attribut zeigt der Filter wie bisher nur den Wert.
In der Vorlage stehen zwei Platzhalter zur Verfügung:
{%value%}: der Filterwert{%count%}: die Anzahl der Produkte mit diesem Wert
Rot (150).
Den Text rund um die Platzhalter legen Sie frei fest:
Größe 'S' → 20 Ergebnisse.
Wie gezählt wird
- Gezählt werden Produkte, nicht Varianten. Ein Produkt, von dem es mehrere Varianten mit dem Wert “Rot” gibt, wird nur einmal gezählt.
- Ein Wert, den der Kunde über einen Ausschlussfilter (
negate) ausgeschlossen hat, wird im positiven Filter desselben Feldes nicht mehr als Option angeboten. Im Ausschluss-Filter bleibt er stehen und behält in der Regel seine echte Anzahl, weil die Filteroptionen eines Feldes die Filter auf demselben Feld nicht berücksichtigen, auch nicht den Ausschluss. Nur wenn der ausgeschlossene Wert dort sonst fehlen würde, ergänzt das Suchmodul ihn mit der Anzahl0.
Die Trefferanzahl liefert das Suchmodul nur, wenn
values_with_counts in der Filterkonfiguration aktiv ist. Das ist standardmäßig der Fall. Aufbau der Daten im Response siehe ws-search-result.Reihenfolge der Filterwerte (use-sort)
Das Suchmodul liefert die Filterwerte alphabetisch sortiert. Mit dem Attributuse-sort legen Sie eine andere Reihenfolge fest:
data-template kombinieren. So sieht der Kunde, warum ein Wert weiter oben steht.
Sortierung der Filterwerte innerhalb eines Filters (benutzerdefinierte Reihenfolge)
Fachliche Reihenfolgen wie „Junior, Adult, Senior” oder Größen wie “S, M, L, XL, XXL” lassen sich weder alphabetisch noch überuse-sort abbilden.
Dafür kann zum Beispiel pro Filter eine Sortierliste bereitgestellt werden, die per Javascript im Template hinterlegt wird.
Statische Sortierliste (manuell gepflegt)
Der Filter „Lebensphase” enthält die Werte Adult, Junior und Senior, die aber in folgender Reihenfolge sortiert werden sollen: Junior, Adult, Senior.- Attribute
sort-list-= technischer Name des Produktdatenfelds/Filters, immer lowercase (beispielsweiselebensphase)- Kommen neue Werte hinzu, muss die Liste manuell erweitert werden.
Sortierliste aus dem Import (Wawi/ERP)
Der Filter „Lebensphase” enthält die Werte Adult, Junior und Senior, die aber in folgender Reihenfolge sortiert werden sollen: Junior, Adult, Senior.WS-FilterSortList() die über den Import bereitgestellte Sortierliste aus.
- Attribute
WS-FilterSortList(Feldname)ist case-sensitive → Feldname muss genau wie im Original verwendet werden (beispielsweiseLebensphase).- In der Script-ID bleibt
sort-list-trotzdem lowercase (sort-list-lebensphase) - Die Bereitstellung dieser Importliste muss mit Wawi/ERP abgestimmt werden.
Sichtbarkeit von dynamischen und Custom-Filtern (Ausblenden)
Ob ein Filter sichtbar bleibt, entscheiden zwei Angaben gemeinsam: das Attributdisable-style am einzelnen <ws-filter> und das Attribut filter-container am umgebenden HTML-Element. Beide greifen nur ineinander, wenn sie zusammenpassen.
disable-style steuert den einzelnen Filter
disable-style legt fest, wie sich ein Filter verhält, wenn er keine Werte liefert oder für das aktuelle Suchergebnis beziehungsweise die aktuelle Kategorie nicht zutrifft. Nur der Wert hide entfernt den Filter aus der Anzeige. Alle anderen Werte (inactive, gray-out, line-through, blur sowie eine eigene CSS-Klasse) sind genau dafür gedacht, die Filteroption weiterhin anzuzeigen, beispielsweise ausgegraut oder durchgestrichen.
filter-container steuert den umgebenden Wrapper
filter-container blendet das komplette HTML-Element aus, in dem der Filter liegt, also auch Überschriften und weitere Elemente innerhalb dieses Wrappers. Ein ausgeblendeter Container würde jedoch im Widerspruch zu einer bewusst sichtbar gehaltenen Filteroption stehen. Deshalb greift filter-container nur dann, wenn am enthaltenen <ws-filter> disable-style="hide" gesetzt ist.
Bei jedem anderen Wert von disable-style bleibt der Container sichtbar, und der Filter wird lediglich im gewählten Stil deaktiviert dargestellt.
Filterwerte ohne Auswirkung auf das Ergebnis
Wenn alle Produkte im aktuellen Ergebnis einen bestimmten Filterwert erfüllen, wird das Ergebnis nicht weiter eingegrenzt. Solche Werte können ausgeblendet werden. Setzen Sie dazu das Attributhide-universal-options="true" am umgebenden <ws-filters>. Standardmäßig ist diese Option deaktiviert und die Werte werden weiterhin angezeigt. Details siehe ws-filters.
Beispiel:In der Kategorie “Hundefutter” haben alle Produkte beim Filter “Tierart” den Wert “Hund”. Die Auswahl “Hund” würde das Ergebnis nicht verändern. Mit
hide-universal-options="true" wird der Wert “Hund” im Filter “Tierart” deshalb nicht angezeigt.
Bei Ausschlussfiltern (negate) gilt das unabhängig von dieser Option. Ein Wert, den alle Produkte gemeinsam haben, lässt sich nicht ausschließen, ohne dass das Ergebnis leer wird. Er erscheint deshalb nicht als Option. Werte, die bereits positiv ausgewählt wurden, stehen im Ausschlussfilter ebenfalls nicht zur Wahl.
HTML & CSS
CSS & Styling für Checkboxen
Die Komponente mit dem Attributtype="checkbox" generiert keine spezifischen CSS-Klassen.
Innerhalb der Komponente können keine zusätzlichen CSS-Anweisungen oder HTML-Elemente eingebunden werden.
HTML-Elemente und zusätzliche CSS-Stile können jedoch um die Komponente herum ergänzt werden, um das Layout flexibel anzupassen.
Die Komponente erzeugt zum Beispiel für type="checkbox" den folgenden Quellcode:
CSS & Styling für Image-Filter
Beim Filtertypimage wird das Bild als <img>-Element in das Label eingefügt. Größe und Zuschnitt des Bildes steuern Sie deshalb über das img im Label, nicht über background-size am Label. Das Label selbst kann über das Attribut label-class mit einer eigenen CSS-Klasse versehen werden, über die sich auch das Bild ansprechen lässt (beispielsweise .color-swatch img). Ausgewählte Optionen tragen zusätzlich die Klasse .checked und können darüber markiert werden (beispielsweise durch einen Rahmen oder ein Haken-Overlay).
CSS & Styling für Label-Filter
Beim Filtertyplabel wird der Checkbox-Input versteckt. Sichtbar ist nur das Label, das über das Attribut label-class mit einer eigenen CSS-Klasse gestaltet werden kann (beispielsweise als Button). Ausgewählte Optionen tragen zusätzlich die Klasse .active und können darüber hervorgehoben werden.
CSS & Styling für Range-Slider
Für die Range-Slider wird noUiSlider verwendet, eine JavaScript-Bibliothek, die benutzerfreundliche Schieberegler bereitstellt:type="range" wird zum Beispiel folgender Quellcode erzeugt:
noUiSlider:
- Dynamische Bereichsauswahl mit zwei Griffen (beispielsweise Preisfilter von 0 bis 259 €)
- Anzeige von Tooltips mit den aktuellen Werten
- Anpassbares Styling über CSS
noUi-base: Basis-Container des SlidersnoUi-connect: Bereich zwischen den beiden Griffen des Sliders (zeigt den ausgewählten Bereich)noUi-origin: Position des jeweiligen Slider-GriffsnoUi-tooltip: Tooltip, der den aktuellen Wert des Griffs anzeigtnoUi-handle: Der tatsächliche Griff, der bewegt werden kann
