Un site associatif vieux de neuf ans, avec plusieurs équipes de bénévoles s’étant succédé sans consigne éditoriale stricte, comptait plus de 2 000 images dans sa médiathèque, un grand nombre sans texte alternatif renseigné. Réécrire cela à la main aurait représenté un chantier de plusieurs semaines pour une équipe déjà peu disponible. Nous avons construit un script d’audit qui ne corrige rien lui-même, mais priorise le travail humain qui suit.
L’objectif n’était pas de générer automatiquement les textes manquants, mais de distinguer les images réellement porteuses de sens (nécessitant un texte alternatif descriptif) de celles purement décoratives, pour concentrer l’effort humain là où il compte.
Étape 1 : lister toutes les images sans texte alternatif
Une commande WP-CLI personnalisée parcourt la table postmeta à la recherche des pièces jointes de type image dont le champ _wp_attachment_image_alt est vide ou absent.
class Audit_Accessibilite_Command {
public function scanner( $args, $assoc_args ) {
$images = get_posts( array(
'post_type' => 'attachment',
'post_mime_type' => 'image',
'posts_per_page' => -1,
'meta_query' => array(
array(
'key' => '_wp_attachment_image_alt',
'compare' => 'NOT EXISTS',
),
),
) );
WP_CLI::log( count( $images ) . ' images sans texte alternatif trouvées.' );
// suite du traitement image par image
}
}
WP_CLI::add_command( 'audit-a11y scanner', array( new Audit_Accessibilite_Command(), 'scanner' ) );
Sur ce site, la commande a remonté 2 140 images concernées, un volume qui confirmait l’ampleur réelle du chantier d’accessibilité à mener.
Étape 2 : faire évaluer chaque image par un modèle de vision
Pour chaque image identifiée, le script appelle l’API GPT-4 avec capacités de vision, avec un prompt demandant explicitement de distinguer une image porteuse d’information d’une image purement décorative, et d’attribuer un score de priorité.
$prompt = "Cette image nécessite-t-elle un texte alternatif descriptif "
. "(photo informative, graphique, capture d'écran) ou est-elle "
. "purement décorative (texture, bordure, séparateur visuel) ? "
. "Réponds au format JSON : "
. '{"type": "informative|decorative", "priorite": 1-5}.';

Étape 3 : produire un rapport priorisé, pas des corrections automatiques
Le script enregistre les résultats dans une table personnalisée et génère, en fin de traitement, un export CSV trié par priorité décroissante, exploitable directement par l’équipe de bénévoles. Aucun texte alternatif n’est écrit automatiquement : le script identifie et classe, l’humain rédige.
- 312 images classées « informatives » avec une priorité de 4 ou 5
- 891 images classées « informatives » avec une priorité plus faible
- 937 images classées « décoratives », pouvant recevoir un attribut alt vide en toute légitimité
Ce tri a permis à l’équipe de concentrer son effort de rédaction sur les 312 images les plus critiques en priorité, plutôt que de s’éparpiller sur l’ensemble des 2 140 images sans distinction d’importance.
Pourquoi ne pas générer directement les textes
Nous avons délibérément choisi de ne pas faire générer les textes alternatifs eux-mêmes par la même occasion. Sur ce site associatif, de nombreuses photos représentent des personnes identifiables lors d’événements, et un texte alternatif pertinent nécessite souvent un contexte que seul un humain connaît (le nom de l’événement, la fonction de la personne présente). Un texte généré automatiquement sur ce type d’image aurait probablement produit une description générique, moins utile qu’une rédaction humaine informée.
Trier 2 000 images par priorité en une nuit de script vaut mieux que de laisser un chantier d’accessibilité sans point de départ clair pendant des mois.
En résumé
Un script WP-CLI couplé à un modèle de vision permet d’auditer rapidement l’ampleur réelle d’un déficit d’accessibilité sur un site ancien, en distinguant les images qui méritent un effort de rédaction prioritaire de celles qui peuvent légitimement rester décoratives. Ce type d’audit gagne à rester un outil de priorisation, laissant la rédaction elle-même à l’humain qui connaît le contexte de chaque image.