Shopware Administration & Produktivität

Dynamic Product Groups Unterkategorien Shopware 6 — DfStreamCategoryTree: rekursiver Kategoriefilter inklusive untergeordneter Kategorien

Ein Kategoriefilter, der endlich in den Baum hinabsteigt, ohne jede Unterkategorie von Hand nachzutragen.

Sie legen eine dynamische Produktgruppe auf der Kategorie Herren an, speichern, und der Stream liefert 12 statt der erwarteten 138 Produkte. Nichts ist kaputt: der Categories-Filter von Shopware stützt sich auf direkte Zuordnungen, und Ihre Produkte liegen in Sneaker, Stiefel oder Jacken, nicht in der übergeordneten Kategorie. Der einzige native Ausweg besteht darin, zwanzig Unterkategorien einzeln anzuhaken und das bei jeder Katalogänderung zu wiederholen. DfStreamCategoryTree stellt das Feld product.categoryTree im Bedingungs-Builder bereit: dieses Feld enthält den vollständigen Vorfahrenpfad jedes Produkts, sodass die Auswahl der übergeordneten Kategorie den gesamten Teilbaum erfasst, einschließlich später angelegter Kategorien.

Auf einen Blick
  • Neues Feld Category (including subcategories) in den Dynamic Product Groups
  • Ein Filter auf eine übergeordnete Kategorie schließt automatisch alle Produkte der Unterkategorien ein, in jeder Tiefe
  • Stützt sich auf das native DAL-Feld product.categoryTree von Shopware, ohne Zusatzabfragen und ohne Auswirkung auf die Indizierungsleistung
  • Keine Konfiguration: installieren, aktivieren, und das Feld erscheint im Bedingungsselektor
  • Administrationsoberfläche in Englisch, Deutsch und Französisch übersetzt
Shopware 6.7 PHP 8.2+ Keine Konfiguration 3 Admin-Sprachen Quellcode inklusive
  • 30 Tage Rückgaberecht
  • 12 Monate Updates
  • 24-h-Support
www.datafirefly.com/de/
Bedingungs-Builder einer dynamischen Produktgruppe in Shopware 6 mit dem Feld Kategorie inklusive Unterkategorien und dem erfassten Kategorie-Teilbaum
v1.0.0 · aktualisiert 2026-08-08
Was es leistet

Die Kurzfassung.

01

Rekursiver Kategoriefilter

Wählen Sie eine übergeordnete Kategorie mit dem Operator Is equal to any of: alle Produkte in ihren Kindern, Enkeln und tieferen Ebenen gelangen in die dynamische Gruppe.

02

Auf einem nativen DAL-Feld aufgebaut

Das Plugin fügt weder Tabelle noch Index noch Abfrage hinzu. Es stellt lediglich product.categoryTree bereit, ein Feld, das Shopware über den CategoryIndexer ohnehin für jedes Produkt pflegt.

03

Folgt der Katalogentwicklung

Eine nach der Konfiguration der Gruppe angelegte Unterkategorie wird sofort berücksichtigt. Kein erneutes Öffnen jedes Streams nach einer Umstrukturierung des Kategoriebaums.

04

Varianten folgen ebenfalls

Das Feld categoryTree berücksichtigt die Eltern-Kind-Vererbung bei Variantenprodukten: Varianten eines in einer Unterkategorie abgelegten Produkts erscheinen korrekt in der Gruppe.

05

Koexistiert mit dem nativen Filter

Das ursprüngliche Feld Categories bleibt verfügbar. Sie entscheiden von Fall zu Fall zwischen strikter Direktzuordnung und vollständigem Teilbaum, im selben Bedingungs-Builder und am selben Stream.

06

Installation ohne Nebenwirkungen

Das Plugin beschränkt sich auf einen Eintrag in der Allow-Liste des Services productStreamConditionService der Administration. Kein Service-Override, keine Datenbankmigration, neutrale Deinstallation.

Die ausführliche Fassung

Alles, was Sie vor der Installation wissen wollen.

Ein detaillierter Blick darauf, wie Dynamic Product Groups Unterkategorien Shopware 6 — DfStreamCategoryTree: rekursiver Kategoriefilter inklusive untergeordneter Kategorien funktioniert, warum wir es so gebaut haben und der Gedanke hinter den Funktionen oben.

§ 01

Warum der native Kategoriefilter nicht in den Baum hinabsteigt

Der Bedingungs-Builder der dynamischen Produktgruppen bietet ein Feld Categories, das die Association product.categoriesRo abfragt. Diese Association listet ausschließlich die Kategorien, denen ein Produkt im Reiter Categories ausdrücklich zugeordnet ist. Ein sauber strukturierter Katalog legt Produkte in Blattkategorien ab: ein Sneaker-Modell liegt in Herren, Schuhe, Sneaker, nicht in Herren. Die Folge ist mechanisch: ein Filter auf Herren liefert nur die wenigen direkt auf dieser Ebene zugeordneten Produkte. Das ist kein Bug, sondern das dokumentierte Verhalten der Association, es überrascht aber regelmäßig beim Anlegen eines Merchandising-Streams über eine ganze Warengruppe.

§ 02

Was product.categoryTree leistet

Shopware pflegt bereits für jedes Produkt ein JSON-Feld namens categoryTree, das die ID aller Kategorien des Pfades von der Wurzel bis zur Zuordnungskategorie enthält. Der CategoryIndexer berechnet es bei jeder Kategorieverschiebung und jeder geänderten Produktzuordnung neu. Die Storefront nutzt es intern für Kategorie-Listings. Ein equalsAny-Filter auf dieses Feld mit der ID einer übergeordneten Kategorie liefert daher alle Produkte, deren Pfad durch sie verläuft, unabhängig von der Tiefe. Das Feld existiert und funktioniert im DAL, wird von der Administration jedoch nicht im Feldselektor des Bedingungs-Builders angeboten: es fehlt in der Allow-Liste des Services productStreamConditionService.

§ 03

Die genaue Rolle des Plugins

DfStreamCategoryTree fügt dieser Allow-Liste eine Zeile hinzu und liefert die passenden übersetzten Beschriftungen. Mehr nicht, und das ist Absicht. Es bringt keinen Service-Decorator mit, keinen Listener auf Produkt-Events, keine Tabelle, keine Migration. Der in der Oberfläche gebaute Filter ist ein völlig regulärer DAL-Filter, ausgewertet von derselben Engine wie alle anderen Stream-Bedingungen. Das bedeutet auch: ein mit diesem Plugin konfigurierter Stream bleibt lesbar und nutzbar, selbst wenn das Plugin später deaktiviert wird. Der Filter arbeitet auf DAL-Ebene weiter, nur die Anzeige des Feldes in der Oberfläche verschwindet.

§ 04

Typische Einsatzfälle

Eine Navigationskategorieseite, die von einer dynamischen Gruppe über eine ganze Produktfamilie gespeist wird, ohne Unterkategorien von Hand aufzulisten. Eine Promotion-Regel, die einen Rabatt auf eine gesamte Abteilung samt Unterabteilungen anwendet. Ein automatischer Cross-Selling-Block auf Basis der Abteilung des betrachteten Produkts. Ein Export-Feed oder ein Shopping-Experience-Block, gespeist von einem Stream, der einen ganzen Zweig des Katalogs abbilden soll. In all diesen Fällen zwingt die native Variante dazu, die Konfiguration bei jeder neuen Unterkategorie erneut zu öffnen. Die categoryTree-Variante erfordert überhaupt keine Pflege.

§ 05

Installation und Administration-Rebuild

Das Plugin wird per ZIP-Upload unter Extensions, My extensions installiert oder durch Ablegen des Ordners in custom Schrägstrich plugins mit anschließendem plugin:refresh und plugin:install --activate. Da es das Verhalten der Administration verändert, ist nach der Installation einmalig ein Rebuild des Admin-Bundles nötig, über den Befehl build-administration oder bin Schrägstrich console bundle:dump gefolgt von der Kompilierung. In einer über eine Deployment-Pipeline verwalteten Produktivumgebung gehört dieser Rebuild in der Regel bereits zu den Standardschritten. Nach der Neukompilierung erscheint das Feld sofort im Bedingungsselektor, ohne dass eine Plugin-Konfiguration auszufüllen wäre.

§ 06

Was das Plugin nicht tut

Es ersetzt den nativen Categories-Filter nicht, sondern tritt daneben. Es verändert weder den Algorithmus der Kategorieindizierung noch die Berechnung von categoryTree, sondern nutzt, was Shopware ohnehin erzeugt. Es wirkt nicht auf Listing-Filter der Storefront oder die Facettennavigation, die auf einem anderen Mechanismus beruhen. Es läuft nicht auf Shopware Cloud, da die von Shopware gehostete SaaS-Version keine Server-Plugins zulässt. Und es beansprucht nicht, die Auswertung von Streams zu beschleunigen: da das Feld nativ und indiziert ist, entspricht der Auswertungsaufwand dem eines Standardfilters, nicht mehr und nicht weniger.