WooCommerce Produkttabelle: Kategoriefilter, Logik und Begriffsreihenfolge
Ein Kategoriefilter für die WooCommerce Produkttabelle macht aus jeder vom Besucher gewählten Kategorie eine Bedingung einer WordPress-Taxonomie-Abfrage und verknüpft die gewählten Kategorien mit der Logik, die Sie für dieses Filterelement festlegen. Die meisten Überraschungen entstehen durch diese Logik, zum Beispiel wenn eine Unterkategorie weiterhin alle Produkte ihrer übergeordneten Kategorie zeigt. Im Folgenden erfahren Sie, wie der Filter seine Abfrage aufbaut, wie Sie ihn für übergeordnete und untergeordnete Kategorien einrichten, wie Sie die Reihenfolge der Begriffe in den Dropdowns ändern und zwei verwandte Fälle: den Filter Im Angebot (On Sale) und Filter während Produktimporten.
Wie der Kategoriefilter einer Produkttabelle seine Abfrage aufbaut
Taxonomie-Filter werden im Tab Filter einer Tabelle hinzugefügt. Jede Produkt-Taxonomie kann ein Filterelement sein: Produktkategorien (Product categories), Produkt-Schlagwörter (Product tags), jedes globale Attribut (pa_color, pa_size und so weiter) und benutzerdefinierte Produkt-Taxonomien. Ein Klick auf die Zahnrad-Schaltfläche eines Elements öffnet dessen Optionen (das Popup trägt den Titel Table #12; filter field: product_cat). Vier Optionen sind hier wichtig:
| Option | Was sie bewirkt |
|---|---|
| Mehrfachauswahl (MultiSelect) | Aus: ein normales Dropdown, jeweils ein Begriff. Ein: eine Mehrfachauswahl, der Besucher kann mehrere Begriffe wählen. |
| Logik (Logic) | IN, AND oder NOT IN: wie die gewählten Begriffe dieses Elements verknüpft werden. |
| Ausschließen (Exclude) | Durch Kommas getrennte Begriffs-IDs, die aus dem Dropdown entfernt werden. |
| Einschließen (Include) | Durch Kommas getrennte Begriffs-IDs: Nur diese Begriffe werden aufgelistet. |
Wählt der Besucher Begriffe aus, fügt das Plugin der Produktabfrage für dieses Element eine Bedingung hinzu: die gewählten Begriffs-IDs mit dem Operator aus Logik (Logic).
- IN (der Standard, die „ODER“-Logik): Produkte in mindestens einem der gewählten Begriffe.
- AND: Produkte, die gleichzeitig in allen gewählten Begriffen enthalten sind.
- NOT IN: Produkte, die in keinem der gewählten Begriffe enthalten sind. Nützlich für einen Filter im Stil „ausschließen“.
Verschiedene Filterelemente werden immer mit AND verknüpft: Kategorie, Farbe und Preisspanne müssen alle zutreffen. Der Filter arbeitet außerdem nur innerhalb der Produkte, die die Tabelle ohnehin anzeigt, daher gelten zuerst die Regeln des Tabs Vordefinition (Predefinition). Die Option Logik (Logic) gehört zu einer unter WOOT → Tabellen erstellten Tabelle; eine Tabelle, die aus Shortcode-Attributen ohne Tabellen-ID erzeugt wird, verwendet immer IN.
Übergeordnete und untergeordnete Kategorien im Kategoriefilter
Produktkategorien sind hierarchisch, und in einer Taxonomie-Abfrage behandelt WordPress eine Kategorie standardmäßig als „diese Kategorie und alle ihre Unterkategorien“. Genau so fragt auch der Filter ab. Das erklärt die typische Beschwerde: Ein Besucher wählt in einer Mehrfachauswahl Gesicht und dann Akne, und die Tabelle zeigt weiterhin alles aus Gesicht. Mit IN trifft die übergeordnete Kategorie allein bereits alle Produkte aller ihrer Unterkategorien, sodass eine zusätzliche Unterkategorie nichts eingrenzen kann.
Die Umstellung von Logik (Logic) auf AND ist bei Kategorien selten die Lösung. WordPress erweitert jede gewählte Kategorie um alle ihre Unterkategorien und verlangt dann, dass ein Produkt in jeder davon enthalten ist. Wird eine übergeordnete Kategorie mit AND gewählt, werden also Produkte verlangt, die der übergeordneten Kategorie und jeder ihrer Unterkategorien zugeordnet sind, und das trifft meist auf kein Produkt zu. Zwei Unterkategorien mit AND zeigen nur die Produkte, die beiden zugeordnet sind. Pro Filterelement gibt es nur eine Logik; Sie können nicht für einige Begriffe einer Taxonomie IN und für andere AND verwenden.
Was in der Praxis funktioniert:
- Ein einzelnes Dropdown. Lassen Sie Mehrfachauswahl (MultiSelect) ausgeschaltet. Der Besucher wählt genau eine Kategorie, und die Wahl von Akne ersetzt Gesicht, sodass die Tabelle nur Akne (und alle darunterliegenden Kategorien) zeigt.
- Eine Mehrfachauswahl mit IN für Kategorien derselben Ebene. Die Wahl von Akne und Trockene Haut zeigt Produkte aus einer von beiden. Es geht nur dann schief, wenn zusätzlich eine übergeordnete Kategorie gewählt wird.
- Eine kürzere Liste mit Ausschließen oder Einschließen. Das Dropdown wird als Baum von der obersten Ebene abwärts aufgebaut, und eine Unterkategorie wird nur aufgelistet, wenn ihre übergeordnete Kategorie aufgelistet ist. Das Ausschließen einer übergeordneten Kategorie entfernt ihren gesamten Zweig, und Einschließen (Include) muss auch die IDs der übergeordneten Kategorien enthalten, sonst erscheinen deren Unterkategorien nie. Die ID eines Begriffs finden Sie unter Produkte → Kategorien (oder Produkte → Attribute → Begriffe konfigurieren (Configure terms)): Bewegen Sie den Mauszeiger über den Begriff und lesen Sie
tag_ID=im Bearbeiten-Link ab. - Eine eigene Tabelle für jeden Bereich des Shops. Wenn eine Seite von einer übergeordneten Kategorie handelt, beschränken Sie ihre Tabelle in der Vordefinition auf diese Kategorie und filtern nur nach deren Unterkategorien. Siehe unterschiedliche Tabellen für unterschiedliche Kategorien.
Attribute und Schlagwörter sind flach, daher funktioniert AND dort wie erwartet: Farbe mit AND und den Begriffen Rot und Blau zeigt Produkte, die beides haben. Ein variables Produkt „hat“ jeden Attributbegriff, der in seinen Attributen aufgeführt ist, unabhängig davon, welche Variation auf Lager ist.
Reihenfolge der Begriffe in den Filter-Dropdowns
Die Dropdowns listen die Begriffe jeder Ebene alphabetisch nach Namen auf, wobei Unterkategorien unter ihrer übergeordneten Kategorie stehen und pro Ebene mit einem Bindestrich gekennzeichnet sind. Begriffe ohne veröffentlichte Produkte werden nicht aufgelistet. Die in WooCommerce festgelegte Reihenfolge, per Ziehen der Kategorien unter Produkte → Kategorien oder mit Standardsortierung (Default sort order) → Benutzerdefinierte Sortierung (Custom ordering) eines Attributs, wird nicht verwendet, und auch Einschließen (Include) ändert die Reihenfolge nicht: Es bestimmt nur, welche Begriffe erscheinen.
Um Kategorien und Attribute in der WooCommerce-Reihenfolge aufzulisten, fügen Sie diesen Code hinzu. Er ändert nur die Abfragen, die den Tabellenfilter aufbauen, nicht andere Begriffslisten der Website.
/*
* WOOT table filter: list product categories and attribute terms in the
* order set in WooCommerce instead of alphabetically.
* Child theme functions.php or a code snippets plugin.
*/
add_filter('woot_profile_extend', function ($profile) {
foreach ($profile as $key => $field) {
if (!is_array($field) || empty($field['get_filter_draw_data']) || !taxonomy_exists($key)) {
continue;
}
if ('product_cat' !== $key && !taxonomy_is_product_attribute($key)) {
continue;
}
$draw = $field['get_filter_draw_data'];
$profile[$key]['get_filter_draw_data'] = function ($table_id) use ($draw) {
$shop_order = function ($query) {
$taxonomy = current((array) $query->query_vars['taxonomy']);
$query->query_vars['orderby'] = taxonomy_is_product_attribute($taxonomy) ? wc_attribute_orderby($taxonomy) : 'menu_order';
};
add_action('pre_get_terms', $shop_order, 5);
$data = $draw($table_id);
remove_action('pre_get_terms', $shop_order, 5);
return $data;
};
}
return $profile;
});
Bei Attributen folgt der Code der Standardsortierung (Default sort order) des jeweiligen Attributs (Benutzerdefinierte Sortierung (Custom ordering), Name, Name (numerisch) (Name (numeric)) oder Begriffs-ID (Term ID)); Kategorien folgen ihrer Drag-and-drop-Reihenfolge. Der Code nutzt woot_profile_extend, den Hook, der die Felder der Tabelle bereitstellt. Die Begriffsliste wird beim Erzeugen der Seite in diese geschrieben, leeren Sie daher nach dem Hinzufügen des Codes den Seitencache.
Der Filter „Im Angebot“ und variable Produkte
Das Filterelement Im Angebot (On Sale) ist ein Schalter. Ist er eingeschaltet, zeigt die Tabelle nur die Produkte aus der eigenen Liste der Angebotsprodukte von WooCommerce. Diese Liste enthält jedes Produkt mit einem aktiven Angebotspreis sowie das übergeordnete Produkt jeder Variation mit aktivem Angebotspreis, sodass ein variables Produkt erscheint, sobald mindestens eine seiner Variationen im Angebot ist.
WooCommerce hält diese Liste in einem Cache (dem Transient wc_products_onsale) und aktualisiert ihn, wenn ein Produkt gespeichert wird und wenn ein geplantes Angebot beginnt oder endet. Wurden Angebotspreise direkt in die Datenbank geschrieben, zum Beispiel durch einen Import, der WooCommerce umgeht, kann der Filter diese Produkte übersehen. Leeren Sie den Cache unter WooCommerce → Status → Werkzeuge → WooCommerce-Transients (WooCommerce transients) → Transients löschen (Clear transients).
Filter während Produktimporten
Alles im Filter wird aus der Datenbank gelesen: die Begriffe in den Dropdowns (nur Begriffe, die Produkte haben) und die Grenzen von Bereichsschiebereglern. Während ein Import (WP All Import oder ein anderer) läuft, ändern sich Produkte, Begriffe und ihre Anzahlen, sodass in den Dropdowns Begriffe fehlen und die Grenzen der Schieberegler falsch sein können. Das ist kein Filterfehler und endet mit dem Import. Zwei praktische Hinweise:
- Führen Sie große Importe bei wenig Traffic oder auf einer Staging-Kopie durch.
- Die Begriffsliste des Filters ist Teil des Seiten-HTML. Wenn Sie einen Seitencache verwenden, leeren Sie ihn nach dem Import, sonst sehen Besucher weiterhin die Liste vom Zeitpunkt des Cachings der Seite.
Wenn der Filter weiterhin die falschen Produkte zeigt
- Öffnen Sie die Zahnrad-Optionen des Elements und prüfen Sie Logik (Logic):
INfür „eines von“,ANDfür „alle von“,NOT INfür „keines von“. - Testen Sie bei Kategorien mit einer gewählten Unterkategorie und ohne übergeordnete Kategorie: Ist das Ergebnis dann korrekt, war die übergeordnete Kategorie in der Auswahl die Ursache.
- Prüfen Sie das Produkt selbst: Ein Produkt, das direkt der übergeordneten Kategorie zugeordnet ist, trifft auf die übergeordnete Kategorie zu, nicht auf eine Unterkategorie.
- Denken Sie an die Regeln der Vordefinition: Der Filter zeigt nie Produkte, die die Tabelle ausschließt.
- Leeren Sie nach Änderungen an Begriffen oder am Reihenfolge-Code den Seitencache und laden Sie die Seite ausgeloggt neu.
Wenn das Ergebnis weiterhin nicht zu den Kategorien Ihrer Produkte passt, eröffnen Sie im WOOT-Support-Forum ein Thema mit dem Shortcode der Tabelle, den Filtereinstellungen und einem Beispielprodukt, dann prüfen wir es.