Compteur de Paniers Shopware 6 : installation et configuration
Installer, amorcer l'index et configurer le badge « Dans + de 20 paniers » sur Shopware 6.5, 6.6 et 6.7.
Le plugin DfCartPopularity affiche sur la fiche produit un badge indiquant le nombre de paniers contenant actuellement le produit, par exemple « Dans + de 20 paniers ». Le comptage repose sur vos vraies données de panier.
Prérequis
- Shopware 6.5, 6.6 ou 6.7 en installation auto-hébergée (le SaaS Shopware Cloud n’accepte pas les plugins serveur)
- PHP 8.1 ou supérieur
- Accès SSH pour les commandes console et la compilation du thème
Installation
Déposez le ZIP via Extensions puis Mes extensions, ou copiez le dossier dans custom/plugins/, puis lancez :
bin/console plugin:refresh
bin/console plugin:install --activate DfCartPopularity
bin/console cache:clear
./bin/build-storefront.sh
La compilation du storefront est nécessaire une fois, pour intégrer la feuille de style du badge. Sur un environnement piloté par un pipeline de déploiement, cette étape fait généralement déjà partie du processus standard.
Amorcer l’index
À l’installation, l’index est vide : les compteurs partent de zéro et se remplissent à mesure que les clients modifient leur panier. Pour afficher des chiffres crédibles dès le premier jour, lancez la reconstruction :
bin/console df:cart-popularity:rebuild
La commande lit les paniers déjà stockés dans la boutique et alimente l’index. Elle est idempotente et peut être relancée sans risque. L’option --truncate vide l’index avant reconstruction.
Les paniers déjà transformés en commande sont supprimés par Shopware de la table des paniers. La reconstruction ne voit donc que les paniers actifs, ce qui est exactement le périmètre attendu.
Configuration
Paramètres, Système, Plugins, DataFirefly Cart Popularity, puis Configurer. Chaque option est surchargeable canal de vente par canal de vente.
Affichage
- Activer le badge : le suivi des paniers continue même badge désactivé, les données sont donc prêtes le jour où vous l’activez.
- Seuil minimum (défaut 5) : en dessous de ce nombre de paniers, rien ne s’affiche.
- Mode d’affichage : palier arrondi ou nombre exact.
- Pas du palier (défaut 10) : un comptage de 23 s’affiche en « + de 20 ». Si le comptage est inférieur au pas, le plugin bascule automatiquement sur le nombre exact plutôt que d’annoncer un palier faux.
- Emplacement : au-dessus ou sous le bloc d’achat.
- Style du badge : fond léger, contour ou texte simple.
Règles de comptage
- Fenêtre temporelle (défaut 7 jours) : seuls les paniers mis à jour dans cette fenêtre sont comptés. La valeur 0 désactive la fenêtre.
- Paniers actifs uniquement : exclut les paniers déjà transformés en commande.
- Limiter au canal de vente : évite qu’un pic sur une boutique gonfle le compteur d’une autre.
- Agréger les déclinaisons : toutes les variantes d’un produit partagent le compteur du parent. Désactivez cette option si chaque déclinaison doit avoir son propre compteur.
Performance et rétention
- Durée de vie du cache (défaut 900 secondes) : la requête de comptage n’est exécutée qu’une fois par durée de vie et par produit. La valeur 0 désactive le cache. Le cache est vidé automatiquement à chaque enregistrement de la configuration.
- Rétention (défaut 60 jours) : les enregistrements plus anciens sont supprimés. Le nettoyage s’exécute automatiquement, au maximum une fois par heure, sans dépendre du message queue.
Personnaliser le texte
Le libellé du badge vit dans les snippets Shopware. Paramètres, Snippets, puis recherchez dfCartPopularity. Trois clés sont disponibles :
dfCartPopularity.badge.textTier: mode palier, contient le placeholder du nombredfCartPopularity.badge.textExact: mode exact, contient le placeholder du nombredfCartPopularity.badge.textSingular: mode exact avec un seul panier
Le placeholder s’écrit %count% et doit être conservé dans votre formulation. Les traductions anglaise, allemande, française, espagnole, italienne et polonaise sont fournies.
Comment fonctionne le comptage
Shopware sérialise le panier complet dans une colonne payload de la table cart, souvent compressée. Aucune requête SQL ne peut donc savoir ce que contient un panier sans le désérialiser. Le plugin maintient sa propre table df_cart_popularity associant un jeton de panier, un produit, un canal de vente, une quantité et un indicateur de commande.
Cette table est synchronisée à chaque persistance de panier via CartSavedEvent, en deux requêtes indexées. L’événement CartConvertedEvent marque les lignes comme commandées au moment du passage en commande. L’affichage effectue alors un simple comptage distinct sur un index composite, mis en cache.
Aucune donnée personnelle n’est enregistrée : l’index ne contient que le jeton de panier, qui est un identifiant technique pseudonyme, la référence produit, le canal de vente et des horodatages.
Commandes CLI
bin/console df:cart-popularity:rebuild
bin/console df:cart-popularity:rebuild --truncate
bin/console df:cart-popularity:cleanup
bin/console df:cart-popularity:cleanup --days=30
Dépannage
Le badge ne s’affiche pas
Vérifiez dans l’ordre : le badge est activé pour le canal de vente concerné, le nombre de paniers atteint le seuil, la fenêtre temporelle n’exclut pas tous les paniers, et le storefront a bien été recompilé après l’installation. Videz aussi le cache HTTP si la page est servie depuis le cache.
Le badge s’affiche sans style
La feuille de style du plugin est intégrée à la compilation du thème. Relancez ./bin/build-storefront.sh ou bin/console theme:compile.
La commande de reconstruction indique des paniers ignorés
Ces paniers utilisent un format de payload que la commande ne sait pas lire, typiquement un stockage de panier externalisé. Ils seront indexés normalement dès la prochaine modification par le client, le suivi par événement fonctionnant indépendamment du mode de stockage.
Désinstallation
La désinstallation avec suppression des données utilisateur supprime la table df_cart_popularity et la configuration du plugin. En conservant les données utilisateur, la table reste en place et les compteurs repartent tels quels en cas de réinstallation.