npx pa11y https://exemple.fr audite une seule page. C’est utile pour un test ponctuel, mais insuffisant pour un site WordPress qui compte des dizaines de gabarits différents : page d’accueil, article, page produit WooCommerce, archive de catégorie, formulaire de contact. Pour couvrir tout cela sans payer un outil SaaS, il suffit d’un script qui lit le sitemap et lance Pa11y sur chaque URL trouvée.
Cette approche convient particulièrement aux développeurs freelances ou en petite agence : pas d’abonnement mensuel, pas de compte à créer, uniquement Node.js et quelques lignes de script réutilisables d’un projet à l’autre.
Pourquoi passer par le sitemap XML
La plupart des sites WordPress exposent un sitemap généré automatiquement, que ce soit via le cœur de WordPress depuis la version 5.5 (sortie en août 2020) à l’adresse /wp-sitemap.xml, ou via une extension SEO qui produit sa propre structure. Ce fichier liste déjà toutes les URLs publiques du site, classées par type de contenu : c’est exactement l’inventaire dont un audit multi-pages a besoin, sans avoir à le construire à la main.
L’astuce consiste à ne pas tester les 40 pages une par une, mais à en sélectionner un échantillon représentatif : une page par gabarit plutôt que chaque article individuellement, ce qui réduit le temps d’exécution sans perdre en couverture réelle des composants.
Écrire le script d’audit

Le script ci-dessous récupère un sitemap, en extrait les URLs, puis lance Pa11y sur chacune avec le standard WCAG2AA :
const fetch = require('node-fetch');
const pa11y = require('pa11y');
const { parseStringPromise } = require('xml2js');
const fs = require('fs');
async function getUrlsFromSitemap(sitemapUrl) {
const xml = await (await fetch(sitemapUrl)).text();
const result = await parseStringPromise(xml);
return result.urlset.url.map((u) => u.loc[0]);
}
async function run() {
const urls = await getUrlsFromSitemap('https://exemple.fr/wp-sitemap-posts-page-1.xml');
const rapport = [];
for (const url of urls) {
const resultat = await pa11y(url, { standard: 'WCAG2AA', timeout: 30000 });
resultat.issues.forEach((issue) => {
rapport.push({ url, code: issue.code, message: issue.message, type: issue.type });
});
console.log(url, '->', resultat.issues.length, 'anomalies');
}
const csv = ['url,type,code,message']
.concat(rapport.map((r) => `"${r.url}","${r.type}","${r.code}","${r.message.replace(/"/g, '""')}"`))
.join('\n');
fs.writeFileSync('rapport-accessibilite.csv', csv);
}
run();
Ce script s’exécute avec un simple node audit.js, après installation de pa11y, node-fetch et xml2js via npm. Le fichier CSV produit peut être ouvert dans un tableur pour trier les anomalies par gravité ou par gabarit.
Interpréter les résultats sans se noyer
Pa11y remonte des dizaines d’anomalies potentielles sur un site WordPress classique, mais toutes n’ont pas le même poids. Il est utile de les classer en trois familles :
- Erreurs structurelles présentes sur tous les gabarits (souvent liées au thème) : à corriger une seule fois, dans le fichier source commun.
- Erreurs propres à un contenu précis (image sans texte alternatif dans un article) : à corriger contenu par contenu.
- Faux positifs liés à des composants dynamiques non encore chargés au moment du test : à vérifier manuellement avant correction.
Automatiser la sélection des pages à tester
Sur un site avec plusieurs centaines d’articles, tester chaque URL individuellement serait trop long. Une astuce simple consiste à grouper les URLs par motif d’adresse (/produit/, /blog/, /page/) et à n’en garder que deux ou trois par groupe, pris aléatoirement. Cela suffit à détecter les problèmes de gabarit sans multiplier inutilement les exécutions de Pa11y, chacune prenant plusieurs secondes.
Limites de cette méthode
Pa11y, comme tout outil automatisé, ne détecte qu’une partie des critères RGAA : contrastes, structure des titres, attributs manquants, rôles ARIA mal formés. Il ne remplace pas un test au clavier ni un test avec un lecteur d’écran, et il ne comprend pas si le contenu d’un texte alternatif est pertinent. Ce script est un filet de sécurité automatisé, pas un audit RGAA complet.
Notre verdict
Pour un développeur sans budget outillage, un script Pa11y branché sur le sitemap donne une couverture large en quelques minutes d’exécution, réutilisable de projet en projet. Il gagne à être relancé après chaque mise à jour de thème, pour détecter rapidement une régression avant qu’elle n’atteigne la production.