# Un relecteur a trouvé trois critères WCAG erronés dans mon extension d'accessibilité. J'ai vérifié, et j'en ai trouvé huit.

> Source: <https://dev.to/grounded/un-relecteur-a-trouve-trois-criteres-wcag-errones-dans-mon-extension-daccessibilite-jai-verifie-4cnl>
> Published: 2026-08-12 10:26:16+00:00

Je développe un scanner d'accessibilité pour WordPress. La semaine dernière, le

relecteur d'une place de marché l'a rejeté, et parmi les motifs figurait celui-ci :

Les règles de conformité doivent être corrigées. « Langue des passages » ne

valide que les attributs lang déjà présents et ne peut pas détecter les

passages en langue étrangère non balisés ; la règle du landmark principal est

WCAG 1.3.6 de niveau AAA mais elle est présentée comme un contrôle AA ; et les

id en double ne devraient pas être présentés comme un manquement WCAG 2.2 au

titre du 4.1.1.

Trois constats. Tous les trois justes. Ce qui suit est ce qui s'est passé quand

j'ai cessé de corriger les trois et vérifié les vingt-deux autres.

Je commence par le troisième, parce que c'est le plus facile à vérifier et le

plus largement faux.

**Le critère de succès 4.1.1 Parsing a été retiré des WCAG 2.2.** Ni déprécié ni

assoupli : retiré. La [Recommandation du W3C](https://www.w3.org/TR/WCAG22/) le mentionne dans la

section conformité comme « Parsing (Obsolete and removed) ». Il est parti parce

que ce contre quoi il protégeait — les technologies d'assistance qui butaient sur

un balisage mal formé — a cessé d'être un mode de défaillance réel dès lors que

les navigateurs et les API d'accessibilité ont convergé sur la façon de récupérer

un HTML incorrect.

Mon scanner signalait les attributs `id`

en double comme un manquement au WCAG

4.1.1. Au regard des WCAG 2.2, ce critère n'est plus là pour être enfreint.

Les id en double méritent toujours d'être corrigés. Ils cassent les associations

`label for`

et les références `aria-labelledby`

, si bien que c'est le mauvais

élément qui est annoncé, ou aucun. Mais c'est un problème de 4.1.2 *lorsqu'il
casse réellement un nom accessible*, et le détecter est un contrôle différent du

Le relecteur en avait trouvé trois. J'aurais pu en corriger trois. À la place,

j'ai pris les 25 règles et vérifié chacune face à la Recommandation WCAG 2.2 et

face à la manière dont [axe-core](https://github.com/dequelabs/axe-core) classe la règle équivalente — parce

qu'axe-core est l'implémentation de référence sur laquelle repose une grande

partie de ce secteur, et qu'elle fait une distinction que j'avais perdue.

Huit règles étaient fausses.

| Règle | Annonçait | En réalité |
|---|---|---|
| Id en double | 4.1.1 | Retiré des WCAG 2.2 |
Un seul landmark `main`
|
1.3.6 AAA | 1.3.6 est Identify Purpose, un critère sans rapport |
| Langue des passages | 3.1.2 AA
|
3.1.2 est de niveau A — et le contrôle ne faisait pas ce que son titre promettait |
| Texte de lien vague | 2.4.4 | Le 2.4.4 est satisfait par le contexte |
| Niveaux de titre sautés | 1.3.1 | Les WCAG n'imposent pas de niveaux séquentiels |
`h1` manquant |
1.3.1 | Bonne pratique |
| Titre vide | 1.3.1 | Bonne pratique |
`tabindex` positif |
2.4.3 | Bonne pratique |

Certaines méritent une phrase.

**Texte de lien vague.** Le 2.4.4 s'appelle *Link Purpose (In Context)*. En

contexte. Un lien qui dit « en savoir plus » le satisfait si le paragraphe,

l'élément de liste ou la cellule qui l'entoure rend la destination claire — ce

qui est généralement le cas. Le critère qui exige que le texte du lien tienne

seul est le 2.4.9, et il est AAA. « En savoir plus » répété au fil d'une page est

donc un vrai problème d'utilisabilité pour qui parcourt les liens au clavier, et

ce n'est pas un manquement de niveau A.

**Niveaux de titre.** Aucun critère de succès n'exige qu'un `h2`

suive un `h1`

.

Le 1.3.1 *Info and Relationships* exige que la structure véhiculée visuellement

soit disponible par programme — utiliser des titres *tout court* est la façon de

le satisfaire. Passer de `h1`

à `h3`

est brouillon et dégrade la navigation au

lecteur d'écran, mais ce n'est pas ce que dit le 1.3.1. axe-core classe

`heading-order`

en bonne pratique, et ce depuis des années.

**Langue des passages.** Celle-ci était fausse deux fois. Le 3.1.2 est de niveau

A, pas AA — je m'étais trompé de niveau. Et le contrôle s'intitulait « Les

passages en langue étrangère doivent déclarer leur langue », ce qui promettait

une chose qu'aucun contrôle automatique ne peut faire : savoir qu'un passage est

dans une autre langue quand rien ne le signale. Ce que le code faisait vraiment,

c'était valider les attributs `lang`

déjà présents. C'est un contrôle utile. Ce

n'est pas le contrôle qu'annonçait le titre.

25 contrôles. **Dix-huit correspondent à un critère de succès WCAG 2.2**,

répartis sur quatorze critères distincts de niveaux A et AA : 1.1.1, 1.3.1,

1.3.5, 1.4.2, 1.4.3, 1.4.4, 2.4.1, 2.4.2, 2.4.4, 2.5.8, 3.1.1, 3.1.2, 3.3.2 et

4.1.2.

**Sept relèvent des bonnes pratiques.** À corriger, mais pas des manquements à la

conformité.

Avant l'audit, la page produit annonçait « 25 contrôles automatisés sur les

niveaux A et AA des WCAG 2.2 » et listait le 4.1.1 parmi les critères couverts.

Les deux affirmations étaient fausses, et la seconde était vérifiablement fausse

par quiconque avait lu la Recommandation 2.2.

Voici la partie qui m'a fait cesser de traiter cela comme un problème

d'étiquettes.

L'extension comporte un générateur pour les informations d'accessibilité

qu'exige l'Acte européen sur l'accessibilité. Il pré-remplit la section des

« obstacles connus » à partir de la dernière analyse et — c'était l'argument de

vente — associe à chaque obstacle son critère de succès WCAG.

Huit règles citant des critères erronés, obsolètes ou sans rapport écrivaient

donc ces numéros dans un document que le propriétaire du site publie comme une

déclaration juridique sur son propre service.

Une déclaration de conformité n'est pas un rapport. Un rapport qui exagère vous

gâche l'après-midi. Une déclaration publiée qui cite un critère inexistant, dans

un document que vous êtes légalement tenu de maintenir, relève d'une autre

catégorie d'erreur — et de celles que découvre votre client, pas vous.

C'est l'argument en faveur de la distinction, et c'est le seul qui compte. Un

outil qui présente chaque signalement comme un manquement WCAG gonfle deux

chiffres : le sien — *25 contrôles WCAG* se lit mieux que *18* — et le vôtre. Et

c'est votre chiffre gonflé qui devient public.

Chaque règle déclare désormais ce qu'elle est :

```
{
    id: 'heading_order',
    wcag: '',
    level: '',
    standard: 'best-practice',
    ...
}
```

Le rapport affiche le critère là où il en existe un, et **Bonne pratique** là où

il n'y en a pas, au lieu d'un `WCAG ()`

vide.

Le générateur exige maintenant **deux conditions indépendantes** avant d'écrire

un critère dans un document juridique : la règle doit être marquée comme

rattachée aux WCAG, *et* sa valeur doit correspondre à `^\d+\.\d+\.\d+$`

. L'une

ou l'autre aurait suffi à empêcher ce qui s'est produit. Je voulais celle qui

survit à quelqu'un modifiant l'autre.

Et les textes commerciaux disent désormais 18 et 7, dans le readme, la

documentation et la fiche de la place de marché. Ce fut le commit le moins

agréable de la semaine, et celui que je referais.

Trois questions qui valent la peine, dont aucune n'exige de me croire.

**Signale-t-il encore le 4.1.1 ?** Trente secondes de vérification, et cela vous

dit quand le jeu de règles a été lu face à la norme plutôt que copié d'un autre

outil.

**Distingue-t-il les critères de succès des bonnes pratiques ?** Si chaque

signalement porte un numéro de critère, une partie au moins de ces numéros est

décorative. L'implémentation de référence sur laquelle tourne ce secteur classe

environ un quart de ses règles en bonne pratique. Un outil qui n'en a aucune

n'est pas plus strict : il est moins rigoureux.

**Où va le critère après le rapport ?** S'il alimente une déclaration, un badge,

un PDF ou quoi que ce soit qu'un client publie, son exactitude cesse d'être une

affaire de qualité interne.

Les tests automatisés trouvent environ un tiers des obstacles réels

d'accessibilité. Corriger les étiquettes ne déplace pas ce chiffre. Un rapport

propre est bon signe, pas une déclaration de conformité, et les tests au clavier

et au lecteur d'écran par une personne restent le seul moyen de savoir.

Ce que l'audit a changé est plus étroit et valait, je crois, la semaine :

quand mon outil dit WCAG, désormais, il le pense.

Il est écrit par la personne qui développe l'extension dont il parle. C'est dit clairement plutôt que caché, pour que vous puissiez en tenir compte.

[Accessibility Audit — WCAG & EAA Compliance Checker](https://wpbay.com/product/accessibility-audit/)

*Publié à l’origine sur groundedwp.com.*
