Un plugin Shopware 6 qui définit automatiquement une balise canonique sur les variantes de produits pointant vers le produit principal ou une URL personnalisée - pour une meilleure performance SEO et éviter le contenu dupliqué.
- ✅ URL canonique automatique vers le produit principal pour toutes les variantes
- ✅ URL canonique personnalisée par produit possible
- ✅ Contrôle flexible via CustomFields directement dans l'éditeur de produits
- ✅ Optimisé SEO pour un meilleur classement dans les moteurs de recherche
- ✅ Logique de priorité pour une flexibilité maximale
- ✅ Facile à utiliser sans connaissances en programmation
Les variantes de produits (par exemple, T-shirt dans différentes couleurs/tailles) ont chacune leurs propres URLs:
https://boutique.fr/tshirt-bleu-mhttps://boutique.fr/tshirt-bleu-lhttps://boutique.fr/tshirt-rouge-m- ...
Cela conduit à du contenu dupliqué et peut affecter négativement la performance SEO.
Ce plugin définit une balise canonique sur toutes les variantes pointant vers le produit principal:
<link rel="canonical" href="https://boutique.fr/tshirt">Ainsi, les moteurs de recherche reconnaissent que toutes les variantes appartiennent au même produit.
- Version Shopware: 6.5.x, 6.6.x ou 6.7.x
- Version PHP: 8.4 ou supérieure
- Serveur: Apache ou Nginx avec mod_rewrite
composer require wsc/plugin-sw-canonical-url-variant
bin/console plugin:refresh
bin/console plugin:install --activate WSCPluginSWCanonicalURLVariant
bin/console cache:clear
bin/console theme:compile- Décompresser l'archive du plugin
- Télécharger le dossier vers
custom/plugins/WSCPluginSWCanonicalURLVariant/ - Dans l'administration Shopware, aller à Extensions → Mes Extensions et installer
- Activer le plugin
- Vider le cache:
bin/console cache:clear - Compiler le thème:
bin/console theme:compile
Après l'installation, de nouveaux CustomFields sont automatiquement disponibles dans l'éditeur de produits:
CustomField Set: P. SEO
Champs Disponibles:
- Définir la balise canonique sur le produit principal (Boolean/Switch)
- Nouvelle URL (Champ texte pour les URLs personnalisées)
- Naviguer vers Catalogues → Produits dans l'administration Shopware
- Ouvrir un produit principal avec des variantes
- Faire défiler jusqu'à l'onglet "Spécifications" ou "Champs Personnalisés"
- Trouver le CustomField Set "P. SEO"
Utilisation:
- ✅ Activer "Définir la balise canonique sur le produit principal"
- ⬜ Laisser le champ "Nouvelle URL" vide
- Enregistrer le produit
Résultat: Toutes les variantes référencent automatiquement le produit principal via la balise canonique.
Exemple:
Produit Principal: https://boutique.fr/tshirt
Variante Bleu/M: https://boutique.fr/tshirt-bleu-m
→ <link rel="canonical" href="https://boutique.fr/tshirt">
Variante Rouge/L: https://boutique.fr/tshirt-rouge-l
→ <link rel="canonical" href="https://boutique.fr/tshirt">Utilisation:
- ✅ Optionnel: Activer "Définir la balise canonique sur le produit principal"
- ✏️ Entrer l'URL complète dans le champ "Nouvelle URL"
- par exemple,
https://boutique.fr/categorie-speciale/produit
- par exemple,
- Enregistrer le produit
Résultat: Toutes les variantes référencent l'URL personnalisée saisie.
Exemple:
Nouvelle URL: https://boutique.fr/bestsellers/tshirt-premium
Toutes variantes → <link rel="canonical" href="https://boutique.fr/bestsellers/tshirt-premium">Le plugin fonctionne avec l'ordre de priorité suivant:
1. PRIORITÉ LA PLUS ÉLEVÉE: Nouvelle URL
├─ Champ rempli? → OUI → Utiliser cette URL ✓
└─ Champ rempli? → NON ↓
2. PRIORITÉ MOYENNE: Champ Boolean
├─ Activé? → OUI → Générer automatiquement l'URL parent ✓
└─ Activé? → NON ↓
3. PRIORITÉ LA PLUS BASSE: Shopware Standard
└─ La variante se référence elle-même (comportement par défaut)WSCPluginSWCanonicalURLVariant/
├── src/
│ ├── Installer/
│ │ └── CustomFieldInstaller.php # Installation des CustomFields
│ ├── Resources/
│ │ ├── config/
│ │ │ ├── services.xml # Conteneur de services Symfony
│ │ │ └── custom_fields/
│ │ │ ├── custom_field_sets.php # Définition du set CustomField
│ │ │ └── products/
│ │ │ └── products_canonical.php
│ │ └── views/
│ │ └── storefront/
│ │ └── page/product-detail/
│ │ └── meta.html.twig # Surcharge de template
│ ├── Subscriber/
│ │ └── CanonicalSubscriber.php # Logique d'événement
│ └── WSCPluginSWCanonicalURLVariant.php # Classe principale du plugin
├── tests/
│ └── Unit/ # Tests PHPUnit
├── .github/
│ └── workflows/
│ └── ci.yml # Pipeline CI/CD
├── composer.json
├── build.sh # Script de build pour ZIP
└── README.md| Nom du Champ | Type | Description |
|---|---|---|
custom_produkte_wsc_seo_canonical_variant_aktiv |
Boolean | Active/Désactive l'URL parent automatique |
custom_produkte_wsc_seo_canonical_variant_newurl |
Texte | URL canonique personnalisée |
- Événement:
ProductPageLoadedEvent - Priorité d'Événement:
-100(exécuté parmi les derniers) - Priorité de Template:
100(poids élevé)
- La page produit se charge →
ProductPageLoadedEventest déclenché - Le plugin vérifie: Le produit actuel est-il une variante?
- Si OUI: Charger le produit parent depuis la base de données
- Vérifier les CustomFields:
- URL personnalisée définie? → L'utiliser
- Sinon: Boolean actif? → Générer l'URL parent
- Définir les méta-informations:
page.metaInformation.canonical - Le template génère: Balise canonique dans
<head>
# Cloner le dépôt
git clone https://github.com/your-repo/WSCPluginSWCanonicalURLVariant.git
cd WSCPluginSWCanonicalURLVariant
# Installer les dépendances
composer install
# Exécuter les tests
composer test
# Vérifier le style de code
composer cs-check# Tests PHPUnit
vendor/bin/phpunit
# Avec couverture
vendor/bin/phpunit --coverage-html coverage/# Avec numéro de version
./build.sh 1.0.0
# Crée: WSCPluginSWCanonicalURLVariant-1.0.0.zipcomposer update wsc/plugin-sw-canonical-url-variant
bin/console plugin:update WSCPluginSWCanonicalURLVariant
bin/console cache:clear
bin/console theme:compilebin/console plugin:deactivate WSCPluginSWCanonicalURLVariant
bin/console plugin:uninstall WSCPluginSWCanonicalURLVariant
bin/console cache:clearLes logs de débogage sont présents dans le code et écrivent dans:
var/log/canonical_debug.logSurveiller le fichier de log:
tail -f var/log/canonical_debug.logProblème: La balise canonique n'est pas définie
Solutions:
- Vider le cache:
bin/console cache:clear - Recompiler le thème:
bin/console theme:compile - CustomField activé sur le produit principal? (pas sur la variante!)
- Plugin activé?
bin/console plugin:list - Vérifier les logs de débogage
Problème: Template non chargé
Solutions:
- Vérifier la priorité du template (devrait être 100)
- Réinstaller le plugin après une mise à jour du thème
- Vider le cache du navigateur
- ⚡ Surcharge minimale: Un seul abonné d'événement supplémentaire
- 🎯 Mise en cache efficace: Utilise le cache d'entité de Shopware
- 🚀 Pas de JavaScript: Solution purement côté serveur
- 💾 Léger: < 50 KB taille du plugin
- ✅ Pas de dépendances externes
- ✅ Validation des entrées pour les URLs personnalisées
- ✅ Sûr contre l'injection SQL via EntityRepository
- ✅ Protection XSS via l'échappement automatique Twig
- ✅ Pas de données sensibles dans le code
- Email: Christian.Saeum@Web-SEO-Consulting.eu
- Site Web: Web-SEO-Consulting.eu
- Support: Page de Support
Voir CHANGELOG.md pour les détails sur tous les changements.
GPL-3.0-or-later - voir le fichier LICENSE pour les détails.
Ce plugin est un logiciel libre: vous pouvez le redistribuer et/ou le modifier selon les termes de la GNU General Public License telle que publiée par la Free Software Foundation.
Christian Säum Web SEO Consulting Web-SEO-Consulting.eu
Made with ❤️ by WSC - Web SEO Consulting
Ce plugin est gratuit et Open Source (GPL-3.0-or-later). S'il vous a aidé, j'apprécie votre soutien:
⭐ Si ce plugin vous aide, donnez-nous une étoile sur GitHub!