Shopware Administration & Productivité

Dynamic Product Groups Sous-catégories Shopware 6 — DfStreamCategoryTree : filtre catégorie récursif incluant les catégories enfants

Un filtre catégorie qui descend enfin dans l'arborescence, sans ressaisir chaque sous-catégorie à la main.

Vous créez un groupe de produits dynamique sur la catégorie Homme, vous sauvegardez, et le stream ne retourne que 12 produits au lieu des 138 attendus. Rien de cassé : le filtre Categories de Shopware s'appuie sur les affectations directes, et vos produits sont rangés dans Sneakers, Boots, Vestes, pas dans la catégorie parente. La seule sortie native consiste à cocher les vingt sous-catégories une par une, puis à recommencer à chaque fois que le catalogue évolue. DfStreamCategoryTree expose le champ product.categoryTree dans le constructeur de conditions : ce champ contient le chemin complet des ancêtres de chaque produit, donc sélectionner la catégorie parente attrape l'intégralité du sous-arbre, y compris les catégories créées après coup.

En un coup d'œil
  • Nouveau champ Category (including subcategories) dans les Dynamic Product Groups
  • Filtrer une catégorie parente inclut automatiquement tous les produits des sous-catégories, à n'importe quelle profondeur
  • S'appuie sur le champ natif product.categoryTree du DAL Shopware, aucune requête additionnelle et aucun impact sur les performances d'indexation
  • Aucune configuration : installer, activer, le champ apparaît dans le sélecteur de conditions
  • Interface administration traduite en anglais, allemand et français
Shopware 6.7 PHP 8.2+ Zéro configuration 3 langues admin Code source inclus
  • Remboursement 30 jours
  • 12 mois de mises à jour
  • Support 24h
www.datafirefly.com/
Constructeur de conditions d'un groupe de produits dynamique Shopware 6 affichant le champ Catégorie sous-catégories incluses et l'arborescence de catégories capturée
v1.0.0 · mis à jour 2026-08-08
Ce que ça fait

La version courte.

01

Filtre catégorie récursif

Sélectionnez une catégorie parente avec l'opérateur Is equal to any of : tous les produits rangés dans ses enfants, petits-enfants et niveaux inférieurs entrent dans le groupe dynamique.

02

Appuyé sur un champ natif du DAL

Le plugin n'ajoute ni table, ni index, ni requête. Il se contente d'exposer product.categoryTree, un champ que Shopware maintient déjà pour chaque produit via le CategoryIndexer.

03

Suit l'évolution du catalogue

Une sous-catégorie créée après la configuration du groupe est prise en compte immédiatement. Plus besoin de rouvrir chaque stream après une réorganisation de l'arborescence.

04

Les variantes suivent aussi

Le champ categoryTree tient compte de l'héritage parent-enfant des produits variables : les variantes d'un produit rangé dans une sous-catégorie remontent correctement dans le groupe.

05

Cohabite avec le filtre natif

Le champ Categories d'origine reste disponible. Vous choisissez au cas par cas entre affectation directe stricte et sous-arbre complet, dans le même constructeur de conditions et sur le même stream.

06

Installation sans effet de bord

Le plugin se limite à une entrée dans la liste d'autorisation du service productStreamConditionService de l'administration. Aucune surcharge de service, aucune migration en base, désinstallation neutre.

La version longue

Tout ce que vous voudriez savoir avant d'installer.

Un regard détaillé sur le fonctionnement de Dynamic Product Groups Sous-catégories Shopware 6 — DfStreamCategoryTree : filtre catégorie récursif incluant les catégories enfants, pourquoi nous l'avons conçu ainsi, et la réflexion derrière les fonctionnalités ci-dessus.

§ 01

Pourquoi le filtre catégorie natif ne descend pas dans l'arborescence

Le constructeur de conditions des groupes de produits dynamiques expose un champ Categories qui interroge la relation product.categoriesRo. Cette relation liste uniquement les catégories auxquelles un produit est explicitement rattaché dans son onglet Categories. Un catalogue correctement organisé range ses produits dans les catégories feuilles : un modèle de sneakers est dans Homme, Chaussures, Sneakers, pas dans Homme. La conséquence est mécanique : un filtre sur Homme ne retourne que les rares produits affectés directement à ce niveau. Ce n'est pas un bug, c'est le comportement documenté de la relation, mais il surprend systématiquement au moment de créer un stream de merchandising sur une famille entière.

§ 02

Ce que fait product.categoryTree

Shopware maintient déjà, pour chaque produit, un champ JSON nommé categoryTree qui contient l'identifiant de toutes les catégories du chemin, de la racine jusqu'à la catégorie d'affectation. Ce champ est recalculé par le CategoryIndexer à chaque déplacement de catégorie et à chaque changement d'affectation produit. Il est utilisé en interne par le storefront pour les listings de catégorie. Un filtre equalsAny sur ce champ avec l'identifiant d'une catégorie parente remonte donc tous les produits dont le chemin passe par elle, quelle que soit la profondeur. Le champ existe et fonctionne dans le DAL, mais l'administration ne le propose pas dans le sélecteur du constructeur de conditions : il n'est pas dans la liste d'autorisation du service productStreamConditionService.

§ 03

Le rôle exact du plugin

DfStreamCategoryTree ajoute une ligne à cette liste d'autorisation et fournit les libellés traduits associés. C'est tout, et c'est volontaire. Il n'introduit aucun décorateur de service, aucun listener sur les événements produit, aucune table, aucune migration. Le filtre construit dans l'interface est un filtre DAL parfaitement standard, évalué par le même moteur que les autres conditions du stream. Cela signifie aussi qu'un stream configuré avec ce plugin reste lisible et exploitable même si le plugin est désactivé plus tard : le filtre continue de fonctionner côté DAL, seul l'affichage du champ dans l'interface disparaît.

§ 04

Cas d'usage typiques

Une page de catégorie de navigation alimentée par un groupe dynamique sur toute une famille produit, sans lister les sous-catégories à la main. Une règle de promotion qui applique une remise sur l'ensemble d'un rayon, sous-rayons compris. Un bloc de cross-selling automatique construit sur le rayon d'appartenance du produit consulté. Un flux export ou un bloc Shopping Experience alimenté par un stream qui doit refléter une branche entière du catalogue. Dans tous ces cas, la version native impose de rouvrir la configuration à chaque nouvelle sous-catégorie. La version categoryTree ne demande aucune maintenance.

§ 05

Installation et rebuild administration

Le plugin s'installe par upload de ZIP dans Extensions, Mes extensions, ou par dépôt du dossier dans custom slash plugins puis plugin:refresh et plugin:install --activate. Comme il modifie le comportement de l'administration, un rebuild du bundle admin est nécessaire une fois après l'installation via la commande build-administration ou bin slash console bundle:dump suivi de la compilation. Sur un environnement de production géré par un pipeline de déploiement, ce rebuild fait généralement déjà partie des étapes standard. Une fois l'administration recompilée, le champ apparaît immédiatement dans le sélecteur de conditions, sans configuration plugin à renseigner.

§ 06

Ce que le plugin ne fait pas

Il ne remplace pas le filtre Categories natif, il s'ajoute à côté. Il ne modifie pas l'algorithme d'indexation des catégories ni le calcul du categoryTree, il consomme ce que Shopware produit déjà. Il ne s'applique pas aux filtres de listing du storefront ni à la navigation à facettes, qui relèvent d'un autre mécanisme. Il ne fonctionne pas sur Shopware Cloud, la version SaaS hébergée par Shopware n'autorisant pas l'installation de plugins serveur. Enfin, il ne prétend pas accélérer l'évaluation des streams : le champ étant natif et indexé, le coût d'évaluation est celui d'un filtre standard, ni plus ni moins.