# DataFirefly All in One SEO — Documentation complète

> Documentation complète du module DataFirefly All in One SEO pour PrestaShop 8 et 9 : installation, templates de méta, schémas JSON-LD, sitemap XML, redirections, monitoring 404, robots.txt, tracking GA4/GTM, analyseur de contenu.

- Page: <https://www.datafirefly.com/documentation/dfallinoneseo/>
- Langue: fr
- Mis à jour le: 2026-06-28
- Autres langues: [en](https://www.datafirefly.com/en/documentation/dfallinoneseo/index.md), [es](https://www.datafirefly.com/es/documentation/dfallinoneseo/index.md), [de](https://www.datafirefly.com/de/documentation/dfallinoneseo/index.md), [it](https://www.datafirefly.com/it/documentation/dfallinoneseo/index.md), [pl](https://www.datafirefly.com/pl/documentation/dfallinoneseo/index.md), [pt](https://www.datafirefly.com/pt/documentation/dfallinoneseo/index.md), [nl](https://www.datafirefly.com/nl/documentation/dfallinoneseo/index.md)
- Index: <https://www.datafirefly.com/documentation/llms.txt>

Suite SEO premium tout-en-un pour PrestaShop 8 et 9 : templates de méta dynamiques, schémas JSON-LD complets, sitemap XML multilingue, redirections, monitoring 404, Open Graph et Twitter Cards, GA4 et GTM, robots.txt intelligent avec blocage des crawlers IA et analyseur de contenu — tout dans un seul module.

## Prérequis

- **PrestaShop** : 8.0 à 9.x
- **PHP** : 8.1 ou supérieur (8.2 et 8.3 recommandés)
- **MySQL** : 5.7+ ou MariaDB 10.3+
- **Module productcomments** (officiel PrestaShop) : optionnel, requis uniquement pour AggregateRating sur les produits
- **mod_rewrite** activé sur le serveur Apache (ou équivalent Nginx) pour les URL réécrites

Le module est conscient du contexte multi-boutique nativement : toutes les tables sont scopées par `id_shop`. Vous pouvez avoir des configurations totalement différentes par boutique.

## Installation

1. Téléchargez le fichier `dfallinoneseo-vX.Y.Z.zip` depuis votre compte client DataFirefly.
2. Connectez-vous à votre back-office PrestaShop.
3. Allez dans **Modules → Module Manager**.
4. Cliquez sur **Installer un module** en haut à droite.
5. Glissez-déposez le fichier ZIP ou cliquez sur **Sélectionner un fichier**.
6. L'installation crée automatiquement les 11 tables SQL, enregistre les hooks et ajoute le menu **Améliorer → DataFirefly SEO**.

Après installation, ouvrez le **Dashboard** du module pour un aperçu du score SEO global et des points à corriger en priorité.

## Premier paramétrage en 10 minutes

Ce parcours rapide vous permet de configurer l'essentiel avant la première crawl Google.

1. **Réglages → Général** : activez le module, renseignez le nom du site et le libellé "Accueil" pour le fil d'Ariane.
2. **Méta & templates** : définissez au minimum un template _Produit_ et un template _Catégorie_ (voir section dédiée).
3. **Schema → Identité de l'organisation** : renseignez logo, téléphone, email, adresse et URLs des réseaux sociaux (`sameAs`).
4. **Sitemap** : activez le sitemap et cliquez sur **Régénérer maintenant**.
5. **Tracking** : ajoutez votre GA4 Measurement ID et/ou GTM ID.
6. **Tracking → Vérifications** : collez la valeur de vérification Google Search Console.
7. **Robots.txt** : cliquez sur **Charger les défauts (PS + blocage AI)** pour partir d'une base saine.

## Templates de méta

Le module remplace la saisie manuelle de `meta_title` et `meta_description` par des templates dynamiques par type d'entité. À l'enregistrement d'une fiche dont les méta sont vides, le template correspondant est appliqué automatiquement.

### Types d'entités supportés

- **Produit** : fiches produit (tous types confondus, y compris virtuels et pack)
- **Catégorie** : pages catégorie
- **Page CMS** : pages de contenu statique
- **Marque / Fabricant** : pages fabricant
- **Fournisseur** : pages fournisseur
- **Accueil** : page d'accueil de la boutique
- **Pages génériques** : `/contact`, `/sitemap`, etc.

### Tokens disponibles

Les tokens sont remplacés par les valeurs réelles au rendu de la page. Tous les tokens ne sont pas disponibles sur tous les types d'entité.

- `{shop_name}` — nom de la boutique
- `{sep}` — séparateur (par défaut `|`)
- `{product_name}` — nom du produit (langue courante)
- `{product_reference}` — référence interne
- `{product_sku}` — alias de référence
- `{product_ean13}` — code-barres EAN13
- `{product_brand}`, `{brand}` — marque/fabricant
- `{category}` — catégorie par défaut (produit) ou nom de la catégorie (page catégorie)
- `{category_parent}` — nom de la catégorie parente
- `{category_description}` — description courte (160 car. max)
- `{short_description}` — description courte du produit (160 car. max)
- `{price}` — prix TTC formaté avec devise
- `{price_tax_excl}` — prix HT formaté
- `{title}` — titre de la page CMS
- `{summary}` — extrait du contenu CMS (160 car. max)

### Blocs conditionnels

Pour ne pas afficher un token vide, utilisez la syntaxe conditionnelle :

```
{?product_brand}{product_brand} | {/?}{product_name} - {shop_name}
```

Si `product_brand` est vide (produit sans marque), tout le bloc entre `{?token}` et `{/?}` est supprimé. Sinon, son contenu est rendu et les tokens à l'intérieur sont remplacés normalement.

### Exemples de templates recommandés

**Produit** :

```
Title : {?product_brand}{product_brand} {/?}{product_name} - {category} | {shop_name}
Description : Découvrez {product_name}{?product_brand} signé {product_brand}{/?}. {short_description} Livraison rapide sur {shop_name}.
```

**Catégorie** :

```
Title : {category} - {?category_parent}{category_parent} - {/?}{shop_name}
Description : Tous les produits de la catégorie {category} sur {shop_name}. {category_description}
```

**Accueil** :

```
Title : {shop_name} - Boutique en ligne
Description : Bienvenue sur {shop_name}. Découvrez notre catalogue, livraison rapide, paiement sécurisé.
```

### Surcharge par entité

Pour surcharger une fiche spécifique (par exemple un produit phare), cliquez sur l'icône **Surcharge méta** dans le menu **Édition en masse** ou utilisez l'URL :

```
?controller=AdminDfSeoMeta&entity=product&entity_id=42
```

La page de surcharge permet de définir `meta_title`, `meta_description`, la directive robots (`noindex,follow` par exemple) et un canonical custom par langue.

La directive robots définie sur une entité spécifique a priorité sur les réglages globaux d'indexation. Utilisez-la avec parcimonie pour éviter de désindexer accidentellement vos meilleures pages.

## Schémas JSON-LD

Le module génère un bloc `@graph` unique regroupant tous les schémas de la page courante, validé Google Rich Results Test.

### Schémas générés automatiquement

- **Organization** — sur toutes les pages, identité de la société
- **WebSite** — sur l'accueil, avec `SearchAction` pour activer le sitelinks search box
- **LocalBusiness** — si une adresse physique est renseignée
- **BreadcrumbList** — fil d'Ariane
- **Product** — sur les fiches produit, avec `offers`, `priceValidUntil`, `gtin13`/`isbn`/`mpn`
- **AggregateRating** — agrégée depuis le module productcomments officiel
- **Article** — sur les pages CMS
- **FAQPage** — depuis les blocs FAQ produit ou page

### Identité de l'organisation

Onglet **Schema → Identité de l'organisation**. Champs à renseigner :

- **Type** : Organization, Corporation, LocalBusiness, Store, OnlineStore, OnlineBusiness
- **Logo** : URL absolue (recommandé 600x60 minimum, ratio carré ou paysage)
- **Téléphone**, **Email** : utilisés dans `contactPoint`
- **Adresse postale** : rue, code postal, ville, pays (ISO-2)
- **sameAs** : une URL par ligne (Facebook, Instagram, LinkedIn, Twitter/X, etc.)

### Validité des offres produit

Le champ _Validité des offres produit (jours)_ contrôle la valeur de `priceValidUntil` dans `Product.offers`. Par défaut : 60 jours. Google exige ce champ pour afficher le prix dans les résultats enrichis.

### Schémas personnalisés

Onglet **Schema → Schémas personnalisés**. Permet d'ajouter des blocs JSON-LD sur mesure (HowTo, Recipe, Event, JobPosting, VideoObject, Course, etc.) sur une portée précise :

- **global** : toutes les pages
- **home** : accueil uniquement
- **product** : toutes les pages produit
- **product_id** : un produit spécifique (utilise le champ ID)
- **category**, **category_id** : idem catégorie
- **cms**, **cms_id** : idem page CMS

Variables disponibles dans le JSON personnalisé : `{shop_name}`, `{base_url}`, `{entity_id}`, `{entity_type}`.

Le JSON-LD personnalisé est inséré tel quel dans le `@graph`. Validez-le avec le [Rich Results Test](https://search.google.com/test/rich-results) avant publication. Un JSON invalide est rejeté silencieusement.

## Sitemap XML

Le module génère un sitemap XML conforme à la [spécification sitemaps.org](https://www.sitemaps.org/protocol.html), avec hreflang sur chaque URL et support des images. Architecture : un _sitemap index_ par boutique, puis un sitemap par type d'entité × langue, découpé en chunks.

### Configuration

Onglet **Sitemap**. Activez le sitemap puis cochez le contenu à inclure :

- Produits (par défaut tous les produits actifs)
- Catégories
- Pages CMS
- Marques / Fabricants
- Fournisseurs
- Images (ajoute `image:image` à chaque URL produit)
- Vidéos (si présentes dans les fiches)

Options supplémentaires :

- **Exclure les ruptures** : retire les produits en out-of-stock
- **Gzip** : génère aussi les variantes `.xml.gz` (réduit 5 à 10x la taille téléchargée par les crawlers)
- **URLs par fichier** : taille de chunk (recommandé 5000-10000, max 50000 par spec XML)

### Régénération

La régénération est manuelle depuis l'admin pour éviter toute charge serveur imprévue. Cliquez sur **Régénérer maintenant**.

Pour automatiser, planifiez un cron qui appelle le script suivant (toutes les 6 ou 12 heures selon la fréquence de mise à jour de votre catalogue) :

```
0 */6 * * * php /var/www/html/index.php fc=module&module=dfallinoneseo&controller=sitemap&action=rebuild
```

### Soumission aux moteurs

Cliquez sur **Pinger les moteurs** pour notifier Google et Bing (endpoints legacy mais toujours actifs). Pour Google Search Console, soumettez l'URL du sitemap index une fois pour toutes dans GSC → Sitemaps. GSC re-crawl automatiquement à chaque modification.

URL du sitemap index : `https://votre-boutique.com/sitemap.xml`

## Sitemap HTML public

Un sitemap HTML lisible par les humains est généré automatiquement à `/plan-du-site`. Il agrège catégories (arbre), pages CMS, marques, fournisseurs et les 200 derniers produits. Utile pour le maillage interne et l'accessibilité.

## Redirections

Le module gère les redirections HTTP 301 (permanent), 302 (temporaire), 307, 308 et 410 (Gone) avec trois types de match.

### Types de match

- **Exact** : l'URL source doit correspondre exactement (sans query string)
- **Préfixe** : l'URL source est un préfixe de l'URL demandée. Le suffixe est conservé dans la destination si _Conserver query string_ est coché. Utile pour migrer des dossiers entiers (`/ancien-dossier/` → `/nouveau-dossier/`).
- **Regex** : expression régulière PHP (mode `~...~i` sensible/insensible). Les groupes de capture sont disponibles dans la destination via `$1`, `$2`, etc.

### Création manuelle

Onglet **Redirections → Nouvelle redirection**. Champs :

- **URL source** : chemin sans le domaine (ex: `/ancienne-page`)
- **URL destination** : chemin ou URL absolue. Laisser vide pour un code 410.
- **Type de match**, **Code HTTP**, **Conserver query string**

### Import / export CSV

Format CSV attendu (avec header) :

```
source,destination,type,code
/ancien-produit,/nouveau-produit,exact,301
/ancien-dossier/,/nouveau-dossier/,prefix,301
/old-(.*),/new-$1,regex,301
```

L'export CSV reprend les redirections actuellement filtrées dans la liste.

### Redirection automatique au changement de slug

Si l'option **Réglages → Monitoring → Redirection 301 auto en cas de changement d'URL** est cochée, le module crée une 301 automatiquement quand vous modifiez le slug d'un produit, d'une catégorie, d'une page CMS, d'une marque ou d'un fournisseur. Le `created_by` est alors marqué `auto:urlchange` pour distinction.

Cette option évite la majorité des 404 SEO classiques liés aux refontes de contenu. Activez-la dès l'installation.

## Monitoring 404

Onglet **Monitor 404**. Capture toutes les URLs en erreur 404 servies par PrestaShop, avec déduplication, comptage des hits, détection des bots et hash des adresses IP (sel `COOKIE_KEY` de PrestaShop pour conformité RGPD).

### Filtres disponibles

- **Non résolues** : URLs sans redirection couvrante (vue par défaut)
- **Résolues** : URLs pour lesquelles une redirection a été créée a posteriori
- **Bots** : hits venant de user-agents identifiés comme bots
- **Toutes**

### Créer une redirection en un clic

Sur chaque ligne, le bouton **Rediriger** ouvre un formulaire inline qui pré-remplit la source. Saisissez la destination, choisissez le code HTTP, validez. La 404 est automatiquement marquée comme résolue.

### Purge et maintenance

Le menu **Réglages → Monitoring** expose un seuil _Nombre maximum d'entrées 404 conservées_ (par défaut 5000). Au-delà, le bouton **Purger les vieux 404** supprime les entrées non résolues les plus anciennes.

## Robots.txt dynamique

Le module sert un fichier `/robots.txt` généré dynamiquement à chaque requête, basé sur les règles définies dans **Robots.txt**.

### Préréglages PrestaShop + blocage AI

Le bouton **Charger les défauts (PS + blocage AI)** écrase toutes les règles actuelles et charge un préréglage sain qui :

- Bloque les répertoires sensibles PrestaShop (`/admin*/`, `/cache/`, `/classes/`, etc.)
- Bloque les pages techniques (`/cart`, `/order`, `/my-account`, etc.)
- Bloque les principaux crawlers IA non respectueux : **GPTBot**, **ClaudeBot**, **CCBot**, **Google-Extended**, **anthropic-ai**
- Pointe vers le sitemap (`Sitemap: /sitemap.xml`)

### Règles personnalisées

Chaque règle a un user-agent, une directive (`Allow`, `Disallow`, `Crawl-delay`), une valeur et une position (ordre dans le fichier). Activez/désactivez une règle sans la supprimer via la pastille ON/OFF.

### Aperçu live

Le bloc **Aperçu du fichier généré** en bas de page rend le robots.txt tel qu'il sera servi, avant publication.

## Fichier llms.txt natif

Le module sert un fichier `/llms.txt` conforme à la [spécification llmstxt.org](https://llmstxt.org/). Ce fichier liste, en markdown, les sections principales du site pour les crawlers IA respectueux qui souhaitent une vue structurée plutôt que de scraper l'intégralité du HTML.

Aucune configuration n'est requise — le module génère automatiquement le fichier depuis votre arborescence de catégories, pages CMS et marques.

## Open Graph et Twitter Cards

Onglet **Social**. Le module injecte les balises `og:*` et `twitter:*` sur toutes les pages.

### Réglages

- **Activer Open Graph et Twitter Cards** : master switch
- **og:locale automatique** : calculé depuis la langue du contexte (ex: `fr_FR`)
- **Image OG par défaut** : URL absolue d'une image 1200×630 (utilisée quand la page n'a pas d'image dédiée)
- **og:site_name**, **og:type** par défaut
- **Twitter @handle** et type de carte (`summary` ou `summary_large_image`)
- **fb:app_id** : Facebook App ID

Pour les fiches produit, le module utilise automatiquement l'image principale de la fiche. Pour les autres pages, l'image OG par défaut est utilisée si aucune image n'est définie.

## Tracking : GA4, GTM, pixels

### GA4 et Enhanced Ecommerce

Champ **GA4 Measurement ID** : format `G-XXXXXXXXXX`. Validation automatique du format.

Cochez **Enhanced Ecommerce** pour activer les événements `view_item`, `view_item_list`, `add_to_cart`, `remove_from_cart`, `begin_checkout`, `add_payment_info`, `purchase`.

Cochez **Respecter Consent Mode v2** pour anonymiser les hits jusqu'au consentement explicite (compatible avec les CMP standards).

### Google Tag Manager

Champ **GTM ID** : format `GTM-XXXXXXX`. Le module injecte le snippet GTM dans le `head` et le fallback `noscript` juste après l'ouverture du `body`.

### Pixels publicitaires

- **Facebook Pixel ID** : 15 chiffres
- **TikTok Pixel ID** : alphanumérique

Si Consent Mode v2 est actif, ces pixels ne se déclenchent qu'après consentement.

### Vérifications de propriété

Collez les valeurs des balises de vérification (sans la balise `meta` complète, uniquement le contenu de l'attribut `content`) :

- Google Search Console
- Bing Webmaster Tools
- Yandex Webmaster
- Pinterest
- Baidu

### Code personnalisé head et body-end

Deux champs libres acceptent du HTML/JS arbitraire :

- **Code injecté dans head** : pour scripts tiers, méta complémentaires
- **Code injecté juste avant la fermeture du body** : idéal pour widgets de chat, retargeting tardif, scripts asynchrones

Ces champs n'effectuent aucune validation. Une erreur de syntaxe HTML peut casser le rendu de la page. Testez en pré-production avant publication.

## Analyseur de contenu

Onglet **Analyseur**. Soumettez un produit, une catégorie, une page CMS ou du HTML brut à l'analyseur pour obtenir un score SEO global et un détail des métriques.

### Métriques calculées

- **Score SEO global** (0-100) — pondération weighted des checks
- **Lisibilité Flesch** — approximation multilingue (vowel-group syllable count)
- **Nombre de mots**, **nombre de phrases**
- **Densité du mot-clé principal** (en %)
- **Liens internes / externes / nofollow**
- **Images sans attribut alt**
- **Structure des titres H1 à H6**
- Présence du mot-clé dans **slug** et **premier paragraphe**

### Vérifications (checks)

L'analyseur retourne une liste de checks avec statut `good` / `warn` / `bad` :

- Longueur du title (50-60 caractères)
- Longueur de la meta description (140-160 caractères)
- Présence et longueur du slug
- Longueur du corps (mini 300 mots)
- Présence d'au moins une image avec alt
- Mot-clé dans le title, dans le premier paragraphe, dans le slug
- Densité du mot-clé entre 0,5 % et 2,5 %
- Au moins un H1 et plusieurs H2/H3

L'analyseur est un guide, pas une vérité absolue. Un score de 80+ est excellent. En dessous de 50, revoyez la structure et le wording. Ne sacrifiez jamais la qualité éditoriale pour un score.

## Édition en masse

Onglet **Édition en masse**. Grille paginée (30 entrées/page) avec filtres pour modifier rapidement `meta_title`, `meta_description` et `link_rewrite` sur produits, catégories ou pages CMS.

### Filtres disponibles

- **Toutes**
- **Sans title** : seules les entrées avec meta_title vide
- **Sans description** : seules les entrées avec meta_description vide
- **Recherche par nom**

### Appliquer les templates en masse

Le bouton **Appliquer les templates** applique automatiquement le template défini pour le type d'entité courant aux fiches correspondant aux filtres. Cochez **Appliquer uniquement aux champs vides** pour éviter d'écraser les méta déjà saisies.

## Métabox SEO sur la fiche produit

Sur la page d'édition d'un produit en back-office, un encart **DataFirefly SEO** est ajouté avec :

- Un **score SEO live** (7 checks : longueur title, description, slug, body, image, EAN13, marque)
- Un **aperçu SERP Google** rendu fidèlement
- Le mot-clé principal détecté

## Réglages avancés

### Indexation

Onglet **Réglages → Indexation** :

- **hreflang multilingue** : génère les balises `link rel="alternate"` sur toutes les pages
- **Stratégie x-default** : _Langue par défaut_ (recommandé), _Anglais_, ou _Désactivé_
- **URL canonical** : injecte `link rel="canonical"`
- **Canonical sur les paginations** : _Sur la page courante_ (recommandé), _Toujours sur la page 1_, ou _Pas de canonical_
- **noindex automatiques** : pages /search, panier, mon compte, nouveautés, meilleures ventes, promos, facettes
- **Canonical vers la page mère sur facettes** : évite le duplicate content de la navigation à facettes

### Images

- **Génération automatique des attributs alt** : à l'enregistrement d'une image sans alt, applique le template
- **Template alt** : par défaut `{product_name} - {shop_name}`
- **Lazyload images natif** : ajoute `loading="lazy"` et `decoding="async"` à toutes les images, avec fallback IntersectionObserver pour les images `data-src`

### Maintenance

- **Vider le cache** : purge le cache Smarty + cache PrestaShop
- **Purger les vieux 404** : applique le seuil configuré
- **Exporter toutes les données (JSON)** : télécharge un fichier JSON avec toutes les tables SEO de la boutique courante (utile pour migration entre environnements ou backup avant désinstallation)

## Multi-boutique

Toutes les fonctionnalités sont scopées par `id_shop`. En passant d'une boutique à une autre via le sélecteur de contexte PrestaShop, vous voyez et modifiez uniquement les données de cette boutique.

Cas particuliers à connaître :

- **Templates** : un template par couple (type d'entité, boutique). Définissez explicitement les templates pour chaque boutique.
- **Sitemap** : un sitemap_index distinct par boutique, accessible à `https://boutique-1.com/sitemap.xml`, `https://boutique-2.com/sitemap.xml`, etc.
- **Robots.txt** : règles par boutique, servies sur le domaine correspondant
- **Redirections** : par boutique
- **Schémas personnalisés** : par boutique

## Dépannage

### Le sitemap ne se génère pas

- Vérifiez que le dossier `modules/dfallinoneseo/sitemaps/` est accessible en écriture par PHP
- Vérifiez les permissions : `chmod 755 modules/dfallinoneseo/sitemaps/`
- Augmentez `max_execution_time` dans php.ini si vous avez plus de 50 000 produits

### Les schémas JSON-LD n'apparaissent pas

- Vérifiez que le module est activé (**Réglages → Général**)
- Vérifiez que le type de schéma concerné est activé (**Schema → Types de schémas générés**)
- Videz le cache PrestaShop
- Inspectez la source HTML : les schémas sont injectés dans un bloc `script type="application/ld+json"`

### Les redirections 301 ne fonctionnent pas

- Vérifiez que le module est installé et activé
- Vérifiez que les redirections sont marquées **actives** (pastille ON)
- Pour les regex, testez votre expression sur [regex101.com](https://regex101.com/) en mode PCRE
- L'ordre de priorité est : exact → préfixe → regex (par `hit_count` décroissant)

### GA4 / GTM ne s'injecte pas

- Vérifiez le format de l'ID (`G-XXXXXXX` ou `GTM-XXXXXXX`)
- Si Consent Mode v2 est actif, le snippet est en mode "denied" par défaut jusqu'au consentement. Vérifiez la couche CMP.
- Inspectez le `head` de la page : le snippet GA4/GTM est injecté juste avant la fermeture

### Le robots.txt ne change pas

- Vérifiez qu'aucun fichier `robots.txt` statique n'existe à la racine du site (il prendrait priorité sur le module). Supprimez-le.
- Le module sert le robots.txt via une route PrestaShop — vérifiez que les _URL réécrites_ sont activées

### Erreur lors de la création des tables SQL à l'installation

- Vérifiez que l'utilisateur MySQL a les droits `CREATE` et `ALTER`
- Vérifiez l'encodage : MySQL doit supporter `utf8mb4` avec collation `utf8mb4_unicode_ci`
- Si le préfixe de table custom de PrestaShop dépasse 5 caractères, certains noms d'index peuvent dépasser la limite MySQL de 64 caractères. Contactez le support.

## Référence technique

### Hooks utilisés

Le module enregistre 18 hooks :

- `displayHeader` — injection des balises méta, canonical, hreflang, OG, Twitter, JSON-LD, GA4/GTM, vérifications
- `displayBeforeBodyClosingTag` — injection GTM noscript, FB Pixel noscript, custom body-end code
- `displayBackOfficeHeader` — CSS/JS du back-office
- `displayAdminProductsExtra` — métabox SEO sur la fiche produit
- `actionDispatcherBefore`, `actionDispatcherAfter` — routing des redirections et capture 404
- `actionObjectProductAddAfter`, `actionObjectProductUpdateAfter` — auto-fill méta + auto-301
- `actionObjectCategoryAddAfter`, `actionObjectCategoryUpdateAfter` — idem catégorie
- `actionObjectCmsAddAfter`, `actionObjectCmsUpdateAfter` — idem CMS
- `actionObjectManufacturerUpdateAfter`, `actionObjectSupplierUpdateAfter` — auto-301 sur changement de slug
- `actionAdminControllerSetMedia`, `actionFrontControllerSetMedia` — assets CSS/JS
- `displayProductExtraContent` — réservé pour usages futurs
- `moduleRoutes` — routes `/sitemap.xml`, `/plan-du-site`, `/robots.txt`, `/llms.txt`

### Tables SQL ajoutées

Toutes les tables utilisent le préfixe `df_seo_`, charset `utf8mb4`, collation `utf8mb4_unicode_ci` :

- `df_seo_meta`, `df_seo_meta_lang` — surcharges méta par entité
- `df_seo_template`, `df_seo_template_lang` — templates par type
- `df_seo_redirect` — redirections 301/302/307/308/410
- `df_seo_404` — journal des 404
- `df_seo_score` — snapshots de score (analyseur)
- `df_seo_keyword` — focus keywords
- `df_seo_robots_rule` — règles robots.txt
- `df_seo_schema_custom` — schémas JSON-LD personnalisés
- `df_seo_log` — log diagnostic interne

### Désinstallation

La désinstallation supprime les hooks et les onglets back-office, mais **conserve les tables SQL et les données**. Pour purger complètement :

```
DROP TABLE ps_df_seo_meta, ps_df_seo_meta_lang, ps_df_seo_template, ps_df_seo_template_lang,
           ps_df_seo_redirect, ps_df_seo_404, ps_df_seo_score, ps_df_seo_keyword,
           ps_df_seo_robots_rule, ps_df_seo_schema_custom, ps_df_seo_log;
DELETE FROM ps_configuration WHERE name LIKE 'DFSEO_%';
```

Avant désinstallation, utilisez **Réglages → Maintenance → Exporter toutes les données (JSON)** pour conserver une archive complète. Le format JSON permet de réimporter les redirections, templates et schémas sur une autre installation.

## Mises à jour et support

- **Mises à jour** : 12 mois inclus dès l'achat. Renouvellement annuel optionnel à 49 €.
- **Support** : 12 mois par email, réponse sous 48h ouvrées.
- **Changelog** et téléchargement des dernières versions sur [votre compte client DataFirefly](https://www.datafirefly.com/product/dfallinoneseo/).
