Skip to content

Latest commit

 

History

History
329 lines (240 loc) · 10.9 KB

File metadata and controls

329 lines (240 loc) · 10.9 KB

URL Canonique pour les Variantes - Plugin Shopware 6

🇩🇪 Deutsch | 🇬🇧 English

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é.

📋 Fonctionnalités

  • 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

🎯 Pourquoi ce Plugin?

Le Problème

Les variantes de produits (par exemple, T-shirt dans différentes couleurs/tailles) ont chacune leurs propres URLs:

  • https://boutique.fr/tshirt-bleu-m
  • https://boutique.fr/tshirt-bleu-l
  • https://boutique.fr/tshirt-rouge-m
  • ...

Cela conduit à du contenu dupliqué et peut affecter négativement la performance SEO.

La Solution

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.

📦 Installation

Prérequis

  • 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

Via Composer (recommandé)

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

Installation Manuelle

  1. Décompresser l'archive du plugin
  2. Télécharger le dossier vers custom/plugins/WSCPluginSWCanonicalURLVariant/
  3. Dans l'administration Shopware, aller à ExtensionsMes Extensions et installer
  4. Activer le plugin
  5. Vider le cache: bin/console cache:clear
  6. Compiler le thème: bin/console theme:compile

🚀 Configuration & Utilisation

Étape 1: Trouver les CustomFields

Après l'installation, de nouveaux CustomFields sont automatiquement disponibles dans l'éditeur de produits:

CustomField Set: P. SEO

Champs Disponibles:

  1. Définir la balise canonique sur le produit principal (Boolean/Switch)
  2. Nouvelle URL (Champ texte pour les URLs personnalisées)

Étape 2: Configurer le Produit

⚠️ Important: Les CustomFields doivent toujours être définis sur le produit principal (parent), pas sur les variantes individuelles!

  1. Naviguer vers CataloguesProduits dans l'administration Shopware
  2. Ouvrir un produit principal avec des variantes
  3. Faire défiler jusqu'à l'onglet "Spécifications" ou "Champs Personnalisés"
  4. Trouver le CustomField Set "P. SEO"

Option A: URL Parent Automatique (Recommandé)

Utilisation:

  1. ✅ Activer "Définir la balise canonique sur le produit principal"
  2. Laisser le champ "Nouvelle URL" vide
  3. 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">

Option B: URL Personnalisée

Utilisation:

  1. ✅ Optionnel: Activer "Définir la balise canonique sur le produit principal"
  2. ✏️ Entrer l'URL complète dans le champ "Nouvelle URL"
    • par exemple, https://boutique.fr/categorie-speciale/produit
  3. 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">

Logique de Priorité

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)

🔧 Détails Techniques

Architecture

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

CustomFields

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énements & Hooks

  • Événement: ProductPageLoadedEvent
  • Priorité d'Événement: -100 (exécuté parmi les derniers)
  • Priorité de Template: 100 (poids élevé)

Flux de Travail

  1. La page produit se chargeProductPageLoadedEvent est déclenché
  2. Le plugin vérifie: Le produit actuel est-il une variante?
  3. Si OUI: Charger le produit parent depuis la base de données
  4. Vérifier les CustomFields:
    • URL personnalisée définie? → L'utiliser
    • Sinon: Boolean actif? → Générer l'URL parent
  5. Définir les méta-informations: page.metaInformation.canonical
  6. Le template génère: Balise canonique dans <head>

🧪 Développement & Tests

Développement Local

# 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

Exécuter les Tests

# Tests PHPUnit
vendor/bin/phpunit

# Avec couverture
vendor/bin/phpunit --coverage-html coverage/

Créer un ZIP de Production

# Avec numéro de version
./build.sh 1.0.0

# Crée: WSCPluginSWCanonicalURLVariant-1.0.0.zip

🔄 Mise à Jour

composer update wsc/plugin-sw-canonical-url-variant
bin/console plugin:update WSCPluginSWCanonicalURLVariant
bin/console cache:clear
bin/console theme:compile

🗑️ Désinstallation

bin/console plugin:deactivate WSCPluginSWCanonicalURLVariant
bin/console plugin:uninstall WSCPluginSWCanonicalURLVariant
bin/console cache:clear

⚠️ Note: Les CustomFields ne sont pas automatiquement supprimés lors de la désinstallation pour éviter la perte de données. Si souhaité, ils peuvent être supprimés manuellement dans l'administration sous ParamètresSystèmeChamps Personnalisés.

🐛 Débogage & Dépannage

Activer les Logs de Débogage

Les logs de débogage sont présents dans le code et écrivent dans:

var/log/canonical_debug.log

Surveiller le fichier de log:

tail -f var/log/canonical_debug.log

Problèmes Courants

Problème: La balise canonique n'est pas définie

Solutions:

  1. Vider le cache: bin/console cache:clear
  2. Recompiler le thème: bin/console theme:compile
  3. CustomField activé sur le produit principal? (pas sur la variante!)
  4. Plugin activé? bin/console plugin:list
  5. Vérifier les logs de débogage

Problème: Template non chargé

Solutions:

  1. Vérifier la priorité du template (devrait être 100)
  2. Réinstaller le plugin après une mise à jour du thème
  3. Vider le cache du navigateur

📊 Performance

  • 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

🔒 Sécurité

  • ✅ 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

🤝 Support & Contact

📝 Journal des Modifications

Voir CHANGELOG.md pour les détails sur tous les changements.

📄 Licence

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.

👥 Auteur

Christian Säum Web SEO Consulting Web-SEO-Consulting.eu

💖 Soutien

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:

Buy Me a Coffee GitHub Sponsors PayPal


⭐ Si ce plugin vous aide, donnez-nous une étoile sur GitHub!