# Nettoyage HTML des descriptions produits et catégories

> Installation Téléchargez l'archive dfhtmlcleaner.zip depuis votre compte client DataFirefly. Dans le back-office, ouvrez Modules → Gestionnaire de modules, cliquez sur Installer un module et déposez l'archive. Une fois l'installation terminée,…

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

## Installation

1. Téléchargez l'archive `dfhtmlcleaner.zip` depuis votre compte client DataFirefly.
2. Dans le back-office, ouvrez **Modules → Gestionnaire de modules**, cliquez sur **Installer un module** et déposez l'archive.
3. Une fois l'installation terminée, un onglet **HTML Cleaner** apparaît sous le menu **Catalogue**.

L'installation crée la table `ps_dfhtmlcleaner_backup`, qui stocke les valeurs remplacées. Elle est supprimée à la désinstallation.

Faites une sauvegarde de votre base de données avant le premier nettoyage réel. Le module conserve les valeurs écrasées et sait les restaurer, mais une sauvegarde complète reste le filet de sécurité de référence.

## Prérequis

- PrestaShop 8.0 à 9.x
- PHP 7.4 à 8.3
- Extensions PHP `dom` et `mbstring` activées

## Premier passage : simuler avant d'écrire

Ouvrez **Catalogue → HTML Cleaner**. Le panneau _Lancer un nettoyage_ se trouve en haut de la page.

1. Cochez les contenus à traiter. **Produits** et **Catégories** le sont par défaut ; vous pouvez ajouter les pages CMS, les marques et les fournisseurs.
2. Choisissez une langue, ou laissez _Toutes les langues_. En multiboutique, un sélecteur de boutique apparaît également.
3. Cliquez sur **Simuler**. Rien n'est écrit en base.

À la fin du parcours, trois informations vous sont rendues : le nombre d'enregistrements analysés, le nombre d'enregistrements que le nettoyage modifierait, et le poids total économisé. En dessous, jusqu'à dix comparaisons avant/après sont affichées côte à côte, chacune avec un lien direct vers la fiche concernée.

Si le nombre de fiches concernées vous surprend, ouvrez deux ou trois exemples et vérifiez le résultat avant d'aller plus loin. C'est précisément le rôle de ce mode.

## Nettoyer pour de vrai

Une fois la simulation validée, cliquez sur **Nettoyer réellement** et confirmez. Le parcours reprend à l'identique, mais les valeurs sont cette fois écrites.

Le traitement se fait par lots successifs en AJAX. Une barre de progression indique l'avancement, un journal liste les lots traités, et le bouton **Arrêter** interrompt proprement à la fin du lot en cours. Laissez l'onglet ouvert pendant l'opération.

### Taille des lots

Par défaut, 50 enregistrements sont traités par requête. Sur un hébergement mutualisé lent, descendez à 10 ou 20 dans les réglages généraux. Sur un serveur dédié, vous pouvez monter jusqu'à 500.

## Les règles en détail

Les règles sont regroupées en quatre familles, plus bas dans la page. Toute modification enregistrée est prise en compte immédiatement, y compris par le bac à sable.

### Balisage ancien et non sûr

- **Markup Microsoft Word / Office** : commentaires conditionnels, îlots XML, balises ``, ``, `` et attributs `mso-*`.
- **Commentaires HTML**.
- **Éléments script, style, object et form**. Les gestionnaires d'événements `onclick` et assimilés sont retirés dans tous les cas, quelle que soit l'option.
- **Iframes**. Trois modes : tout garder, garder uniquement les fournisseurs de confiance (défaut), tout supprimer. La liste par défaut couvre YouTube, Vimeo, Dailymotion, Google Maps, SoundCloud, Spotify et OpenStreetMap. Ajoutez vos propres domaines dans le champ prévu, un par ligne ou séparés par des virgules. La vérification porte sur le domaine réel : une adresse du type `youtube.com.exemple.tld` est rejetée.

### Attributs

- **Styles inline** : _Conserver_, _Filtrer_ (défaut) ou _Supprimer_. Le mode Filtrer retire `mso-*`, `font-family`, `font-size`, `line-height`, `color` et quelques autres, et conserve ce qui relève de la mise en page.
- **Classes** : _Conserver_, _Retirer les classes d'éditeur_ (défaut : `MsoNormal`, `ql-`, `gmail_`, `x_`, `western`) ou _Supprimer_.
- **Attributs id** : désactivé par défaut, car des ancres internes peuvent en dépendre.
- **Attributs data-*** : désactivé par défaut, certains thèmes et modules s'en servent.
- **Attributs de présentation dépréciés** : `align`, `bgcolor`, `border`, `cellpadding`, `face`, `valign`, etc.
- **Attributs non reconnus** : seule une liste sûre est conservée (`href`, `src`, `alt`, `title`, `colspan`…), complétée par les attributs propres aux médias sur `iframe`, `video`, `audio` et `source`.
- **width et height sur les images**. Désactivé par défaut, car ces attributs limitent le décalage de mise en page (CLS).

### Structure

- **Dégrouper les span sans attribut** et, en option plus agressive, **les div sans attribut**.
- **Dégrouper les balises font**.
- **Moderniser les balises dépréciées** : `b` vers `strong`, `i` vers `em`, `center` vers `div`, `strike` vers `s`, `tt` vers `code`.
- **Supprimer les balises vides**. Les cellules de tableau, les lignes et les éléments de structure sont exclus de cette règle pour ne pas déformer la mise en page.
- **Liste blanche de balises** : désactivée par défaut. Activée, toute balise hors liste est dégroupée et son contenu texte conservé.

### Typographie et médias

- **Espaces insécables** : les séries sont réduites à un seul.
- **Sauts de ligne consécutifs** : trois `` ou plus deviennent deux, et les `` collés à une fermeture de bloc sont retirés.
- **Espaces et indentation**. Le contenu des balises `pre`, `code` et `textarea` échappe à cette normalisation.
- **Sécuriser les liens** : ajout de `rel="noopener noreferrer"` sur les liens en `target="_blank"`, suppression des URL `javascript:`.
- **Attribut alt manquant** sur les images, et **loading="lazy"** en option.

## Sauvegardes et restauration

Tant que l'option **Sauvegarder avant écriture** est active, chaque valeur remplacée est copiée dans la table du module avec un identifiant d'exécution. Le panneau **Sauvegardes et restauration** liste les exécutions par date et par type de contenu.

Le bouton **Restaurer** remet en place tous les champs d'une exécution, puis supprime les entrées correspondantes. La rétention se règle en jours dans les réglages généraux ; laissez 0 pour conserver l'historique indéfiniment. Les entrées expirées sont purgées à l'ouverture de la page.

Le nettoyage automatique à l'enregistrement ne crée pas d'entrée de sauvegarde, contrairement au traitement par lots.

## Nettoyage automatique à l'enregistrement

L'option **Nettoyer automatiquement à l'enregistrement** applique les mêmes règles à chaque sauvegarde d'un produit ou d'une catégorie en back-office, via les hooks déclenchés avant écriture de l'objet. Elle couvre aussi bien la page produit v2 que les pages historiques.

Elle est désactivée par défaut. Validez vos règles en simulation avant de l'activer.

## Bac à sable

Le panneau **Bac à sable** applique les règles en vigueur à un extrait HTML collé, et affiche le résultat ainsi que le gain de poids. Rien n'est lu ni écrit en base. C'est le moyen le plus rapide de vérifier l'effet d'un réglage avant de relancer une simulation complète.

## Après un gros nettoyage

- Videz le cache PrestaShop depuis **Paramètres avancés → Performances**.
- Si l'indexation automatique de la recherche est active et que votre index inclut les descriptions, reconstruisez-le depuis **Paramètres de la boutique → Recherche**.

## Dépannage

### Les boutons Simuler et Nettoyer ne réagissent pas

Vérifiez d'abord que vous êtes en version 1.0.1 ou supérieure, puis rechargez la page avec `Ctrl+F5` pour vider le cache du navigateur. Si le problème persiste, ouvrez la console du navigateur : un message `dfHtmlCleanerAjaxUrl is not defined` indique que le fichier JavaScript du module n'a pas été servi, généralement à cause d'un cache serveur ou de droits de lecture sur `modules/dfhtmlcleaner/views/js/`.

### Le traitement s'arrête au bout de quelques lots

Réduisez la taille des lots à 10 ou 20 dans les réglages généraux, puis relancez. Le traitement reprend depuis le début, mais les fiches déjà propres ne sont plus modifiées : le moteur est idempotent, un second passage ne produit aucune écriture inutile. Le journal affiche le code HTTP renvoyé quand un lot échoue, ce qui permet de distinguer un timeout (504) d'une erreur PHP (500) ou d'un souci de jeton (403).

### Une vidéo intégrée a disparu

Le fournisseur n'est probablement pas dans la liste des domaines de confiance. Ajoutez-le, puis restaurez l'exécution concernée depuis le panneau Sauvegardes et relancez.

### Un tableau a perdu sa mise en forme

Les attributs `width`, `border` et `cellpadding` des tableaux relèvent des attributs de présentation dépréciés. Si votre thème n'a pas de style CSS pour les tableaux, désactivez cette règle et restaurez l'exécution.

### Le nettoyage ne modifie rien

C'est le comportement attendu sur un catalogue déjà propre. Vérifiez avec le bac à sable qu'un extrait connu comme problématique est bien transformé, et que les règles correspondantes sont actives.

## Désinstallation

La désinstallation depuis le gestionnaire de modules supprime la table de sauvegarde, les entrées de configuration et l'onglet du menu. Les descriptions déjà nettoyées ne sont pas rétablies : restaurez les exécutions concernées avant de désinstaller si vous souhaitez revenir en arrière.
