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

Blocs Gutenberg

WP_HTML_Tag_Processor pour ajouter un attribut ARIA à un carrousel en bloc

Plutôt que de reconstruire par concaténation le HTML d'un bloc carrousel, WP_HTML_Tag_Processor permet d'ajouter un attribut ARIA précis, sans risque de casser le balisage.

Par WordPress Développement • 19 juillet 2023 • 4 min de lecture • Aucun commentaire
WP_HTML_Tag_Processor pour ajouter un attribut ARIA à un carrousel en bloc

$html = str_replace('<div class="carrousel-slide"', '<div class="carrousel-slide" role="group" aria-roledescription="diapositive"', $html); — c’est ce genre de ligne qu’on retrouve encore dans certains filtres de rendu de bloc, et c’est exactement le genre de ligne qui casse dès qu’un attribut supplémentaire apparaît dans le balisage généré par un bloc carrousel tiers.

Depuis WordPress 6.2, la classe WP_HTML_Tag_Processor propose une alternative bien plus sûre : parcourir le HTML balise par balise et modifier précisément celle qu’on cible, sans reconstruire une chaîne de caractères à la main et sans charger un analyseur DOM complet côté serveur.

Le problème posé par la concaténation de chaînes

Un bloc carrousel, qu’il soit natif ou fourni par une extension, génère un balisage qui peut changer d’une version à l’autre : une classe CSS renommée, un attribut data-* ajouté, un ordre d’attributs différent. Un filtre basé sur str_replace ou une expression régulière suppose que ce balisage restera identique indéfiniment, ce qui n’est jamais garanti.

Le symptôme typique : le filtre fonctionne à l’installation, puis une mise à jour du bloc carrousel change légèrement sa structure HTML, et l’attribut ARIA censé être ajouté disparaît silencieusement, sans qu’aucune erreur ne remonte. C’est une régression d’accessibilité invisible dans les journaux d’erreurs habituels.

Utiliser WP_HTML_Tag_Processor pour cibler une balise précise

La classe fonctionne comme un curseur qui avance dans le HTML, balise après balise, et permet d’interroger ou de modifier les attributs de la balise courante sans toucher au reste du document :

function carrousel_ajouter_attributs_aria( $bloc_html ) {
    $processeur = new WP_HTML_Tag_Processor( $bloc_html );

    while ( $processeur->next_tag( array( 'class_name' => 'carrousel-slide' ) ) ) {
        $processeur->set_attribute( 'role', 'group' );
        $processeur->set_attribute( 'aria-roledescription', 'diapositive' );
    }

    return $processeur->get_updated_html();
}
L'essentiel à retenir : WP_HTML_Tag_Processor modifie le balisage sans le reparser en DOM complet ; Cibler une balise précise évite les remplacements de chaînes fragiles ; Le résultat reste compatible avec un carrousel généré par un bloc tiers

Brancher le filtre sur le rendu du bloc

Ce traitement s’accroche naturellement au filtre render_block, qui reçoit le HTML final d’un bloc juste avant son affichage :

add_filter( 'render_block', function ( $contenu, $bloc ) {
    if ( 'core/gallery' !== $bloc['blockName'] ) {
        return $contenu;
    }

    return carrousel_ajouter_attributs_aria( $contenu );
}, 10, 2 );

Le filtre ne s’applique qu’au nom de bloc concerné, ce qui évite de parcourir inutilement le HTML des blocs sans rapport avec le carrousel.

Pourquoi ne pas simplement modifier le composant React du bloc

Quand le carrousel provient d’une extension tierce, son code source côté éditeur n’est pas toujours accessible à la modification, et le republier reviendrait à maintenir un correctif à chaque mise à jour de l’extension. Intervenir sur le rendu final, côté PHP, découple la correction d’accessibilité du code du bloc lui-même.

Ce que la classe apporte par rapport à un DOMDocument

  • Aucun chargement d’extension PHP supplémentaire, contrairement à DOMDocument qui dépend de l’extension libxml ;
  • Un comportement tolérant aux fragments de HTML incomplets, fréquents dans le rendu partiel d’un bloc ;
  • Une API pensée pour des modifications ciblées (ajout, remplacement, suppression d’attribut), pas pour une réécriture complète du document.

Une limite à connaître avant de s’en servir partout

WP_HTML_Tag_Processor ne permet pas de naviguer dans l’arborescence (savoir qu’une balise est l’enfant d’une autre, par exemple) ; il avance de balise en balise, dans l’ordre du document. Pour des besoins de navigation hiérarchique plus fins, la classe WP_HTML_Processor, apparue plus tard dans le cœur de WordPress, répond à un besoin différent et sort du périmètre de cet article.

Modifier un attribut ARIA ne justifie pas de reconstruire tout le balisage d’un bloc : autant utiliser l’outil qui cible exactement l’attribut concerné.

En résumé

Pour ajouter un attribut ARIA à un carrousel généré par un bloc, qu’il soit natif ou tiers, WP_HTML_Tag_Processor évite la fragilité d’une concaténation de chaînes et le poids d’un analyseur DOM complet. Le filtre render_block reste le point d’accroche naturel, et la correction survit aux mises à jour du bloc carrousel tant que la classe CSS ciblée ne change pas radicalement de nom.

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