Le WordPress d'aujourd'hui, décodé pour les développeurs

E-commerce

wp_kses et une description produit enrichie par un vendeur : ce qu’il faut autoriser ou non

Un vendeur tiers peut coller une description mise en forme depuis un traitement de texte. wp_kses() décide ce qui reste, mais la liste de balises autorisées se pense avec soin.

Par WordPress Développement • 4 février 2022 • 4 min de lecture • Aucun commentaire
wp_kses et une description produit enrichie par un vendeur : ce qu'il faut autoriser ou non

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

L'essentiel à retenir : wp_kses() filtre selon un tableau explicite de balises et d'attributs ; wp_kses_post() est souvent trop permissif pour une fiche produit multi-vendeur ; Les attributs style et les balises de script doivent toujours être exclus

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.
  • target sur les ancres : à n’autoriser qu’accompagné d’un attribut rel="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.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Partager :

À propos de l'auteur

WordPress Développement

Développeur WordPress, passionné par Elementor, le FSE et l’automatisation par IA.

Voir tous ses articles

Dans la même veine

À lire aussi