2 400 photos sur 6 000 : c’est le nombre de visuels qui se sont retrouvés avec un attribut alt vide après un import massif de fiches immobilières chez une agence spécialisée dans la location saisonnière, un incident détecté trois semaines après coup, lors d’un audit d’accessibilité de routine plutôt qu’au moment de l’import lui-même.
L’agence gérait un catalogue de plusieurs centaines de biens, chacun avec une dizaine de photos, importées via un flux automatisé depuis le logiciel de gestion locative utilisé par les agences partenaires. Ce flux, mis à jour chaque nuit, créait ou mettait à jour les fiches WordPress correspondantes.
Symptôme : des images sans description dans la médiathèque
L’audit a d’abord révélé le problème visuellement, dans l’inspecteur du navigateur : de nombreuses balises <img> affichaient alt="" sur des photos de biens qui, quelques semaines plus tôt, portaient encore une description correcte du type « Salon avec vue sur mer, canapé d’angle gris ». Le nombre de biens concernés augmentait chaque jour, ce qui indiquait un problème récurrent plutôt qu’un incident isolé.
Diagnostic : une requête pour mesurer l’ampleur réelle
Avant de chercher la cause, il fallait mesurer précisément l’ampleur du problème. Une requête WP-CLI a permis de compter les images sans texte alternatif dans la médiathèque, en croisant la table wp_postmeta avec les pièces jointes de type image.
wp db query "
SELECT COUNT(*)
FROM wp_posts p
LEFT JOIN wp_postmeta m
ON p.ID = m.post_id AND m.meta_key = '_wp_attachment_image_alt'
WHERE p.post_type = 'attachment'
AND p.post_mime_type LIKE 'image%'
AND (m.meta_value IS NULL OR m.meta_value = '');
"
Le résultat, 2 400 images sur environ 6 000 dans la médiathèque, correspondait presque exactement aux photos rattachées aux biens mis à jour depuis le dernier déploiement du script d’import, ce qui orientait immédiatement les recherches vers ce script plutôt que vers une cause externe.

Diagnostic approfondi : le script d’import fautif
L’examen du script d’import, écrit en PHP et exécuté via une tâche planifiée WP-CLI, a révélé la cause exacte : une mise à jour récente du script avait modifié la fonction de mise à jour des pièces jointes existantes pour gagner en performance, en remplaçant un appel à wp_update_post() ciblé par un appel plus générique à wp_insert_attachment() qui recréait l’entrée sans reprendre les métadonnées existantes, dont le texte alternatif.
// Avant : mise à jour ciblée qui préserve les métadonnées existantes
wp_update_post(array(
'ID' => $attachment_id,
'post_title' => $nouveau_titre,
));
// Après (fautif) : recréation qui écrase le texte alternatif
$nouvel_id = wp_insert_attachment($donnees_piece_jointe, $chemin_fichier);
Ce changement, introduit pour accélérer le traitement d’un gros volume d’images, avait été testé sur un petit échantillon de nouvelles fiches, jamais sur une fiche existante déjà pourvue de textes alternatifs, ce qui explique pourquoi l’incident n’avait pas été détecté avant sa mise en production.
Correctif : revenir à une mise à jour ciblée et réimporter les descriptions manquantes
Le script a été corrigé pour revenir à wp_update_post() lorsqu’une pièce jointe existe déjà, en vérifiant sa présence via l’identifiant externe du logiciel de gestion locative stocké en métadonnée. Pour les 2 400 images déjà affectées, un script de réimport ponctuel a régénéré les textes alternatifs à partir des descriptions encore disponibles côté logiciel source, plutôt que de les recréer manuellement bien par bien.
- Le script de réimport a traité les biens par lots de cinquante pour limiter la charge sur la base de données.
- Chaque texte alternatif régénéré a été comparé à l’ancienne valeur archivée dans les journaux de l’import précédent, pour vérifier la cohérence du résultat.
- Une trentaine de biens sans description source disponible ont nécessité une saisie manuelle, faute d’archive exploitable.
Prévention : une validation obligatoire avant publication
Le script d’import inclut désormais une étape de validation qui bloque la publication d’une fiche si l’une de ses images ne porte pas de texte alternatif renseigné, avec un message d’erreur loggé et une alerte envoyée à l’équipe technique plutôt qu’une publication silencieuse d’un contenu incomplet.
Un script d’import qui gagne en vitesse au prix des métadonnées existantes ne fait pas gagner de temps : il déplace le travail vers un audit correctif, toujours plus coûteux que la prévention.
En résumé
Deux mille quatre cents photos sur six mille ont perdu leur texte alternatif à cause d’une optimisation de performance mal testée sur les fiches existantes. Le diagnostic par requête ciblée a permis de mesurer l’ampleur exacte avant d’agir, et la prévention mise en place bloque désormais toute publication incomplète à la source, plutôt que de compter sur un audit périodique pour rattraper l’incident après coup.