wp_kses( $description, $regles_autorisees ) : cette fonction se retrouve au cœur de toute marketplace WooCommerce qui laisse un vendeur tiers rédiger sa propre fiche produit. La question n’est jamais « faut-il filtrer », mais « quelles balises autoriser sans ouvrir la porte à une mise en forme qui casse la charte graphique du site ».
Sur une marketplace où chaque vendeur peut coller sa description depuis un traitement de texte ou un ancien site, ce filtrage devient vite un point sensible : trop permissif, il laisse passer des styles en ligne qui écrasent le design ; trop restrictif, il frustre des vendeurs habitués à une mise en forme simple.
Pourquoi wp_kses_post() ne convient pas toujours
La fonction wp_kses_post(), utilisée par défaut pour le contenu d’un article WordPress, autorise un ensemble de balises assez large : images, tableaux, mise en forme de texte, ancres avec plusieurs attributs. Sur une fiche produit gérée par un vendeur tiers, cette permissivité pose un problème concret : rien n’empêche un vendeur de coller une image externe non optimisée, ou un tableau qui déborde du gabarit de la fiche produit sur mobile.
Construire un jeu de règles dédié aux fiches produit

La bonne pratique consiste à définir un tableau de règles propre au contexte « description produit vendeur », plus restreint que wp_kses_post() mais plus permissif qu’un filtrage en texte brut.
function regles_description_vendeur() {
return array(
'p' => array(),
'strong' => array(),
'em' => array(),
'ul' => array(),
'ol' => array(),
'li' => array(),
'a' => array(
'href' => true,
'title' => true,
'target' => true,
),
);
}
$description_filtree = wp_kses( $description_brute, regles_description_vendeur() );
Ce jeu volontairement restreint exclut les images, les tableaux et les titres <h2> ou <h3>, réservés à la structure éditoriale décidée par la marketplace elle-même plutôt qu’au vendeur.
Les attributs oubliés qui posent problème
Trois attributs méritent une vigilance particulière sur une marketplace multi-vendeurs :
style: à exclure systématiquement, car il permet d’imposer une couleur ou une taille de police qui casse la cohérence visuelle du catalogue.targetsur les ancres : à n’autoriser qu’accompagné d’un attributrel="noopener"ajouté automatiquement après filtrage, pour éviter qu’une fenêtre ouverte par un vendeur ne conserve un accès à la fenêtre d’origine.class: à exclure également, car un vendeur pourrait réutiliser une classe CSS du thème pour produire un rendu trompeur, par exemple un badge visuel imitant un message officiel de la marketplace.
Où appliquer ce filtrage
Le filtrage doit intervenir à l’enregistrement, jamais uniquement à l’affichage : enregistrer la description brute en base et filtrer seulement au moment du rendu expose à un affichage incohérent si les règles évoluent plus tard, mais surtout laisse la donnée non filtrée disponible pour tout autre usage du contenu, comme un export ou un flux Google Shopping.
add_filter( 'woocommerce_product_description_data', function ( $description ) {
return wp_kses( $description, regles_description_vendeur() );
} );
Ce filtre reste un exemple simplifié : selon l’extension multi-vendeurs utilisée, le hook exact qui intercepte la sauvegarde de la description diffère et doit être vérifié dans la documentation de l’extension concernée.
Le cas des espaces et retours à la ligne
Un défaut fréquent après filtrage strict : le texte collé depuis un traitement de texte perd sa mise en forme en paragraphes si le vendeur n’a pas utilisé de vraies balises <p>. Passer le résultat dans wpautop() après le filtrage restaure une présentation lisible sans avoir à élargir le jeu de balises autorisées.
Une règle que je applique systématiquement sur une marketplace : mieux vaut un jeu de balises trop restreint corrigé après retour des vendeurs, qu’un jeu trop permissif découvert après qu’un vendeur ait détourné une balise pour tromper des acheteurs.
Ce que wp_kses() ne remplace pas
Ce filtrage technique ne dispense pas d’une modération éditoriale humaine sur le fond du texte : un contenu trompeur écrit en texte brut, sans aucune balise suspecte, passera sans problème à travers wp_kses(). Le filtrage protège la structure et la sécurité du rendu, pas la véracité des informations commerciales publiées par le vendeur.
En résumé
Sur une marketplace multi-vendeurs, un jeu de règles wp_kses() sur mesure, plus restreint que wp_kses_post(), appliqué à l’enregistrement plutôt qu’à l’affichage, avec exclusion systématique des attributs style et class, constitue la base la plus solide pour laisser une liberté de mise en forme raisonnable sans exposer la marketplace à des rendus incontrôlés.