Corrections d’accessibilité dans le code de votre thème WooCommerce

Validiscan corrige les échecs d’accessibilité de votre thème WordPress ou thème enfant : ses templates PHP, y compris les templates WooCommerce qu’il surcharge, ses feuilles de style et ses scripts. Rien n’atteint votre boutique en ligne avant que vous ou votre développeur ayez fusionné ou appliqué les modifications et mis le thème en ligne.

Dernière mise à jour :

Que modifie Validiscan dans un thème WooCommerce ?

Validiscan modifie les fichiers propres de votre thème, et rien d’autre : templates PHP, y compris les templates WooCommerce qu’il surcharge, functions.php, feuilles de style et scripts. Une modification d’autres types de fichiers que PHP, CSS, SCSS, JavaScript, HTML et JSON échoue aux contrôles de Validiscan, et aucune correction n’ajoute de plugin ni d’overlay.

Les recettes sont écrites pour les thèmes WordPress classiques, construits à partir de templates PHP, et non pour les thèmes de blocs, dont les templates sont des fichiers HTML. Sur un thème de blocs, un échec qu’aucune recette ne corrige est laissé à une personne, et un template modifié dans l’éditeur de site est enregistré dans la base de données du site : une modification des fichiers du thème ne l’atteint donc pas (Theme Handbook de WordPress sur les templates). Les recettes ne modifient le balisage que là où les fichiers du thème que reçoit Validiscan le produisent. Le balisage produit par d’autres fichiers, comme ceux de WordPress, de WooCommerce, d’un autre plugin ou d’un thème parent qui ne fait pas partie de cette source, est laissé à une personne ; un bandeau cookies ajouté par un plugin de consentement en est un exemple. Les champs de facturation et de livraison de WooCommerce font exception : un filtre dans le functions.php de votre thème définit leurs valeurs autocomplete (voir la recette ci-dessous).

Détails : les fichiers qu’une modification peut toucher, les contrôles de chaque modification et ce qu’une correction peut ajouter

Validiscan modifie les fichiers propres de votre thème, et rien d’autre : les templates PHP, y compris les templates WooCommerce que votre thème surcharge dans son dossier woocommerce (documentation de WooCommerce sur la surcharge des templates), functions.php, ainsi que les feuilles de style et les scripts du thème. Une modification ne peut toucher que des fichiers PHP, CSS, SCSS, JavaScript, HTML et JSON, et jamais un fichier d’un dossier vendor, node_modules, wp-admin ou wp-includes situé à la racine. Une modification de tout autre fichier échoue aux contrôles de Validiscan et ne peut pas être approuvée. Chaque fichier PHP modifié passe aussi par le contrôle de syntaxe propre à PHP (php -l), qui lit le fichier sans l’exécuter. Les recettes ne modifient jamais un fichier minifié .min.css ou .min.js, qui est un produit de la compilation.

Chaque changement est une modification ordinaire d’un fichier du thème, que votre développeur peut lire ligne par ligne. Quelques corrections ajoutent des lignes au script propre du thème, par exemple pour relier un bouton de pause à un diaporama ou pour annoncer un changement dans le panier. Aucune correction n’ajoute de plugin ni d’overlay, et rien n’est injecté qui corrige vos pages dans le navigateur du visiteur. Les contenus tiers intégrés, comme les widgets de paiement ou de chat, ne sont pas compris dans un projet.

Comment Validiscan accède-t-il à votre thème WooCommerce ?

Validiscan accède à votre thème WooCommerce de l’une de ces deux façons : par le dépôt GitHub qui le contient, ou à partir d’un ZIP du dossier du thème que vous téléversez. Le choix dépend de l’endroit où se trouve le code de votre thème, et il détermine aussi la façon dont les modifications vous reviennent.

Les deux voies d’accès à un thème WooCommerce
Voie d’accès Ce que vous fournissez Les modifications reviennent sous forme de
Par votre dépôt GitHub L’accès au dépôt qui contient votre thème ou votre thème enfant, par l’application GitHub de Validiscan ou un jeton d’accès Une pull request
À partir d’un ZIP du dossier de votre thème Le dossier de votre thème sous wp-content/themes, y compris le thème enfant si vous en utilisez un, en un seul fichier ZIP de 100 Mo au maximum, téléversé dans le portail client par un administrateur de votre organisation Un lot de correctifs

Par votre dépôt GitHub

Si votre thème ou votre thème enfant est conservé dans un dépôt GitHub, vous donnez à Validiscan l’accès à ce dépôt. Vous installez l’application GitHub de Validiscan sur le dépôt, ou vous donnez à Validiscan un jeton d’accès, que Validiscan conserve chiffré. L’application demande un accès en lecture et en écriture au contenu du dépôt et à ses pull requests, et un accès en lecture à ses métadonnées. Les recettes attendent le style.css et le functions.php du thème à la racine du dépôt : le dépôt doit donc contenir le dossier du thème lui-même, et non une installation WordPress entière. Les modifications arrivent alors sous forme de pull request.

À partir d’un ZIP du dossier de votre thème

Si votre thème n’est pas conservé dans un dépôt, le portail client vous demande de faire préparer par votre développeur un ZIP du dossier de votre thème sous wp-content/themes, y compris le thème enfant si vous en utilisez un. Un administrateur de votre organisation le téléverse ensuite dans le portail client, sous la forme d’un seul fichier ZIP de 100 Mo au maximum. Validiscan prépare les modifications sur cette copie de votre thème et envoie le résultat à votre développeur sous forme de lot de correctifs. Où placer les corrections dans un thème WooCommerce, et ce qu’une mise à jour du thème peut défaire

Comment les modifications parviennent-elles à votre boutique ?

Validiscan ne livre que des modifications relues et approuvées, sous forme de pull request ou de lot de correctifs, et aucune des deux ne touche à la version en ligne de votre boutique WooCommerce. Les appliquer et les mettre en ligne revient à vous ou à votre développeur ; la livraison d’une copie non publiée du thème n’existe que sur Shopify.

De la livraison à votre boutique en ligne, en cinq étapes
  1. Validiscan livre les modifications qu’il a relues et approuvées : une pull request sur une nouvelle branche, ou un lot de correctifs pour votre développeur.
  2. Votre développeur ou votre agence relit les modifications. Pour une pull request, la liste de contrôle demande un environnement de préproduction ou de prévisualisation, et non la version en ligne de la boutique, et de manipuler les éléments modifiés au clavier seul.
  3. Vous ou votre développeur fusionnez la pull request, ou appliquez le lot de correctifs et testez les modifications.
  4. Vous ou votre développeur mettez le thème en ligne.
  5. Une fois les modifications en ligne, un scan de vérification contrôle de nouveau les pages concernées.

Une pull request

Avec l’accès à votre dépôt, Validiscan crée une nouvelle branche nommée validiscan/a11y-<date>-<id>, enregistre chaque correction dans un commit distinct et ouvre une seule pull request, avec un tableau récapitulatif, une explication de chaque modification et une liste de contrôle pour la relecture. Rien n’est poussé vers votre branche par défaut. La liste de contrôle demande à votre développeur de déployer la branche dans un environnement de préproduction ou de prévisualisation, et non sur la version en ligne de la boutique, et de manipuler les éléments modifiés au clavier seul. La fusion et le déploiement vous reviennent.

Un lot de correctifs

À partir d’un dossier de thème téléversé, Validiscan prépare une archive zip pour votre développeur. Elle contient PATCH.md, avec chaque modification et la façon de l’appliquer, toutes les modifications dans un seul fichier de correctif qui s’applique avec git apply, un fichier de correctif par correction, les fichiers modifiés en entier et un README.md. Votre développeur applique les modifications, les teste et met le thème en ligne. Ce que contiennent une pull request et un lot de correctifs

Du nouveau texte est-il ajouté dans la langue de votre boutique ?

Seulement en anglais. Les recettes WooCommerce de Validiscan ajoutent le nouveau texte sous forme de chaîne traduisible dans le domaine de texte de votre thème, et n’ajoutent aucune traduction. Si votre boutique est en allemand ou dans une autre langue, la traduction du nouveau texte est une étape qui revient à votre développeur.

Traduire le nouveau texte, en trois étapes
  1. Régénérer le fichier .pot du thème
  2. Ajouter les traductions à ses fichiers .po
  3. Compiler les fichiers .mo que lit WordPress
Détails : le texte qu’ajoutent les recettes, et la façon dont WordPress lit les traductions

Les recettes WooCommerce de Validiscan n’ajoutent du nouveau texte qu’en anglais. Lorsqu’une recette ajoute un texte destiné aux visiteurs, comme les mots d’un lien d’évitement, l’intitulé d’un bouton de pause ou le nom d’un bouton à icône, elle l’ajoute sous forme de chaîne traduisible dans le domaine de texte de votre thème, et n’ajoute aucune traduction. Sur Shopify, Shopware et Magento, les recettes peuvent aussi ajouter un texte allemand ; sur WooCommerce, ce n’est pas le cas.

Si votre boutique est en allemand ou dans une autre langue, la traduction du nouveau texte est une étape qui revient à votre développeur : régénérer le fichier .pot du thème, ajouter les traductions à ses fichiers .po et compiler les fichiers .mo que lit WordPress, comme le décrit la documentation de WordPress sur la localisation. Les recettes ci-dessous indiquent où elles ajoutent du texte.

Que modifient les recettes dans un thème WooCommerce ?

Chacune des 20 recettes de Validiscan pour les thèmes WooCommerce est une modification déterministe pour un type d’échec : le même code reçoit toujours la même modification. Une recette n’intervient que là où le code du thème montre quelle modification est la bonne ; sinon, le constat est laissé à une personne.

Structure de la page et navigation

  • Langue de la page reprise des réglages de WordPress html-lang Un template d’en-tête dont l’élément <html> omet la langue, ou porte une valeur lang fixe non valide, reçoit language_attributes() de WordPress, qui produit la langue du site.

    La recette fait en sorte que l’élément <html> de vos templates d’en-tête prenne sa langue dans la fonction language_attributes() de WordPress, qui produit la langue du site, ou celle que définit un plugin multilingue, afin que les lecteurs d’écran prononcent correctement la page. Un template d’en-tête qui omet la langue se voit ajouter l’appel, et une valeur lang fixe qui n’est pas valide est remplacée par cet appel. Si la mauvaise valeur vient du réglage Langue du site de votre administration WordPress, la recette ne change rien, car il s’agit d’un réglage et non du code du thème. Lorsque le thème lit déjà un champ de langue pour chaque page, par exemple pour des pages juridiques allemandes dans une boutique anglaise, un filtre dans functions.php déclare la langue de cette page, et l’en-tête et le pied de page du site gardent la langue de la boutique. Sans un tel champ, la recette ne devine pas la langue.

    Règles couvertes
    • html-has-lang AUTO contrôle assuré par vs-lang
    • html-lang-valid AUTO contrôle assuré par vs-lang
    • vs-lang AUTO
    Types de fichiers modifiés
    .php
    adds language_attributes() to the checkout header of the fixture theme Données d’exemple

    header-checkout.php Modifications apportées à header-checkout.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à header-checkout.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    8 8
    9 9 ?><!doctype html>
    10 10 <?php // VALIDISCAN-SEED vs-lang: copied from a landing-page plugin, language_attributes() is missing, so <html> has no lang. ?>
    11 Supprimée <html>
    11 Ajoutée <html <?php language_attributes(); ?>>
    12 12 <head>
    13 13 <meta charset="<?php bloginfo( 'charset' ); ?>">
    14 14 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled. ?>
  • Un titre sur chaque page document-title-template Ce qui, dans le thème, empêche l’apparition du titre de page généré par WordPress est réparé ; un titre issu d’un plugin SEO ou des réglages propres à une page reste tel quel.

    WordPress construit lui-même le titre d’une page, à partir du nom de la page ou du produit, du numéro de page d’une liste paginée et du nom de la boutique. La recette répare ce qui, dans le thème, empêche l’apparition de ce titre. Un filtre de titre qui renvoie un titre personnalisé, par exemple issu d’un champ SEO, se rabat sur le titre généré lorsque le champ est vide. Un texte <title> fixe dans un template d’en-tête est remplacé par le titre que WordPress génère. Dans un thème qui n’est pas un thème enfant et n’affiche aucun titre, la prise en charge des titres de WordPress est activée dans functions.php. Lorsque le titre vient d’un plugin SEO ou des réglages propres à une page, la recette ne change rien.

    Règles couvertes
    • document-title AUTO
    Types de fichiers modifiés
    .php
    lets the empty custom SEO title fall back to the generated title Données d’exemple

    functions.php Modifications apportées à functions.php (lignes ajoutées : 2, lignes supprimées : 1)

    Modifications apportées à functions.php (lignes ajoutées : 2, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    87 87 if ( is_singular() && metadata_exists( 'post', get_the_ID(), '_kb_seo_title' ) ) {
    88 88 // VALIDISCAN-SEED document-title: the Contact page has the field saved empty, and an empty
    89 89 // string wins over the generated title, so <title> is empty there.
    90 Supprimée return (string) get_post_meta( get_the_ID(), '_kb_seo_title', true );
    90 Ajoutée $custom_title = trim( (string) get_post_meta( get_the_ID(), '_kb_seo_title', true ) );
    91 Ajoutée return '' !== $custom_title ? $custom_title : $title;
    91 92 }
    92 93 return $title;
    93 94 }
  • Des titres sans niveau sauté heading-levels Un titre qui saute un niveau reçoit le niveau qui suit celui du titre précédent et garde ses classes, sauf si les styles ou les scripts du thème le sélectionnent par son niveau.

    Un titre qui saute un niveau, comme un h4 juste après un h2, reçoit le niveau qui suit directement celui du titre précédent, dans le template ou dans la chaîne PHP qui l’affiche. Les titres de widgets et les titres du pied de page ou d’une barre latérale deviennent des h2. Lorsque le saut vient d’un template WooCommerce affiché juste après le titre de la page, comme Billing details et Shipping details dans le tunnel de commande, les titres du même niveau dans les templates voisins suivent. Seul le niveau change : chaque titre garde ses classes, et un titre que les styles ou les scripts du thème sélectionnent par son niveau est laissé tel quel. Un titre sans classe prend l’aspect que le thème donne à son nouveau niveau. Sur une page sans titre principal, l’élément qui ressemble déjà à son titre, avec une classe de titre définie à 24 pixels au moins, devient le h1. Si une page n’a aucun élément de ce genre, la recette n’ajoute pas de titre et le cas est laissé à une personne.

    Règles couvertes
    • heading-order AUTO contrôle assuré par vs-headings-landmarks
    • page-has-heading-one AUTO contrôle assuré par vs-headings-landmarks
    • vs-headings-landmarks AUTO
    Types de fichiers modifiés
    .php
    gives the home page its <h1> and fixes the teaser and widget title levels Données d’exemple

    front-page.php Modifications apportées à front-page.php (lignes ajoutées : 2, lignes supprimées : 2)

    Modifications apportées à front-page.php (lignes ajoutées : 2, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    24 24
    25 25 <div class="kb-intro">
    26 26 <?php // VALIDISCAN-SEED vs-headings-landmarks: the page title is a styled <p>, the page has no <h1>. ?>
    27 Supprimée <p class="kb-intro__title"><?php esc_html_e( 'Woollen outdoor clothing, made to last', 'kestrel-birch' ); ?></p>
    27 Ajoutée <h1 class="kb-intro__title"><?php esc_html_e( 'Woollen outdoor clothing, made to last', 'kestrel-birch' ); ?></h1>
    28 28 <p><?php echo esc_html( get_the_excerpt() ); ?></p>
    29 29 <p class="kb-popular">
    30 30 <?php esc_html_e( 'Looking for something warm?', 'kestrel-birch' ); ?>
    44 44 <article class="kb-teaser">
    45 45 <?php echo get_the_post_thumbnail( $kb_post, 'woocommerce_single', array( 'loading' => 'lazy' ) ); ?>
    46 46 <?php // VALIDISCAN-SEED vs-headings-landmarks: teaser titles jump from h2 to h4. ?>
    47 Supprimée <h4 class="kb-teaser__title"><?php echo esc_html( get_the_title( $kb_post ) ); ?></h4>
    47 Ajoutée <h3 class="kb-teaser__title"><?php echo esc_html( get_the_title( $kb_post ) ); ?></h3>
    48 48 <p><?php echo esc_html( get_the_excerpt( $kb_post ) ); ?></p>
    49 49 <?php // VALIDISCAN-SEED vs-link-purpose: three identical "Read more" links to different targets. ?>
    50 50 <a class="kb-teaser__more" href="<?php echo esc_url( get_post_meta( $kb_post->ID, '_kb_teaser_url', true ) ); ?>"><?php esc_html_e( 'Read more', 'kestrel-birch' ); ?></a>

    functions.php Modifications apportées à functions.php (lignes ajoutées : 2, lignes supprimées : 2)

    Modifications apportées à functions.php (lignes ajoutées : 2, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    53 53 'after_widget' => '</div>',
    54 54 // VALIDISCAN-SEED vs-headings-landmarks: footer widget titles are h4, directly after
    55 55 // the h2 sections of the page (skipped heading level).
    56 Supprimée 'before_title' => '<h4 class="widget-title">',
    57 Supprimée 'after_title' => '</h4>',
    56 Ajoutée 'before_title' => '<h2 class="widget-title">',
    57 Ajoutée 'after_title' => '</h2>',
    58 58 )
    59 59 );
    60 60 }
    moves the checkout section headings from h3 to h2, as in the fixed checkout Données d’exemple

    woocommerce/checkout/form-billing.php Modifications apportées à woocommerce/checkout/form-billing.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à woocommerce/checkout/form-billing.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    15 15 defined( 'ABSPATH' ) || exit;
    16 16 ?>
    17 17 <div class="woocommerce-billing-fields">
    18 Supprimée <h3><?php esc_html_e( 'Billing details', 'woocommerce' ); ?></h3>
    18 Ajoutée <h2><?php esc_html_e( 'Billing details', 'woocommerce' ); ?></h2>
    19 19
    20 20 <div class="woocommerce-billing-fields__field-wrapper">
    21 21 <?php

    woocommerce/checkout/form-checkout.php Modifications apportées à woocommerce/checkout/form-checkout.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à woocommerce/checkout/form-checkout.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    26 26 </div>
    27 27 </div>
    28 28
    29 Supprimée <h3 id="order_review_heading"><?php esc_html_e( 'Your order', 'woocommerce' ); ?></h3>
    29 Ajoutée <h2 id="order_review_heading"><?php esc_html_e( 'Your order', 'woocommerce' ); ?></h2>
    30 30
    31 31 <div id="order_review" class="woocommerce-checkout-review-order">
    32 32 <?php do_action( 'woocommerce_checkout_order_review' ); ?>

    woocommerce/checkout/form-shipping.php Modifications apportées à woocommerce/checkout/form-shipping.php (lignes ajoutées : 2, lignes supprimées : 2)

    Modifications apportées à woocommerce/checkout/form-shipping.php (lignes ajoutées : 2, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    16 16 defined( 'ABSPATH' ) || exit;
    17 17 ?>
    18 18 <div class="woocommerce-shipping-fields">
    19 Supprimée <h3><?php esc_html_e( 'Shipping details', 'kestrel-birch' ); ?></h3>
    19 Ajoutée <h2><?php esc_html_e( 'Shipping details', 'kestrel-birch' ); ?></h2>
    20 20 <div class="shipping_address">
    21 21 <div class="woocommerce-shipping-fields__field-wrapper">
    22 22 <?php
    29 29 </div>
    30 30
    31 31 <div class="woocommerce-additional-fields">
    32 Supprimée <h3><?php esc_html_e( 'Additional information', 'woocommerce' ); ?></h3>
    32 Ajoutée <h2><?php esc_html_e( 'Additional information', 'woocommerce' ); ?></h2>
    33 33 <div class="woocommerce-additional-fields__field-wrapper">
    34 34 <?php
    35 35 foreach ( $checkout->get_checkout_fields( 'order' ) as $kb_key => $kb_field ) {

Utilisation au clavier et focus

  • Un contour de focus visible focus-visible-styles Un seul contour pour le focus clavier, dans une couleur du thème ou une nuance de celle-ci, dont le contraste avec l’arrière-plan de la page est d’au moins 3:1.

    La feuille de style principale du thème reçoit un seul contour pour le focus clavier : 2 pixels, en trait plein, à 2 pixels de l’élément, dans une couleur que le thème utilise déjà. Il s’agit d’une variable de couleur dont le nom contient focus, accent, brand, primary ou link, ou à défaut de la couleur des liens ou du texte courant. La première de ces couleurs dont le contraste avec l’arrière-plan de la page est d’au moins 3:1 est utilisée ; si aucune ne l’atteint, la première est éclaircie ou assombrie dans la même teinte jusqu’à ce qu’elle l’atteigne. Sur les zones sombres à texte clair, comme une barre supérieure sombre, le contour prend la couleur claire du texte. Un outline: none au focus qui ne laisse rien à sa place est retiré des règles du thème ; les règles qui ne masquent le contour que pour les clics de souris restent. Un thème qui a déjà un contour de focus visible, et aucune règle qui le masque, est laissé tel quel.

    Règles couvertes
    • vs-focus-visible AUTO
    Types de fichiers modifiés
    .css
    replaces the outline reset of the fixture theme with a brand-coloured outline Données d’exemple

    assets/css/main.css Modifications apportées à assets/css/main.css (lignes ajoutées : 9, lignes supprimées : 3)

    Modifications apportées à assets/css/main.css (lignes ajoutées : 9, lignes supprimées : 3)
    Ligne avant Ligne après Modification Code
    137 137 box-shadow: 0 0 0 2px var(--kb-ink);
    138 138 }
    139 139
    140 Supprimée /* VALIDISCAN-SEED vs-focus-visible: "remove the ugly focus ring" - nothing replaces it. */
    141 Supprimée :focus {
    142 Supprimée outline: none !important;
    140 Ajoutée /* validiscan:focus-visible-styles */
    141 Ajoutée :focus-visible {
    142 Ajoutée outline: 2px solid var(--kb-focus);
    143 Ajoutée outline-offset: 2px;
    143 144 }
    144 145
    146 Ajoutée .kb-topbar :focus-visible {
    147 Ajoutée outline-color: #fff;
    148 Ajoutée }
    149 Ajoutée /* /validiscan:focus-visible-styles */
    150 Ajoutée
    145 151 /* Buttons ------------------------------------------------------------------ */
    146 152
    147 153 .button,
  • Un ordre de tabulation qui suit la page remove-positive-tabindex Un tabindex supérieur à 0 sur la balise du template qui produit l’élément signalé est retiré ou fixé à 0 ; celui que du code PHP produit ou qu’un script définit est laissé à une personne.

    Un tabindex supérieur à 0 fait passer un élément en tête de l’ordre de tabulation. La recette le retire des liens, des boutons et des champs de formulaire, qui peuvent de toute façon recevoir le focus, et le fixe à 0 sur les autres éléments, afin qu’ils restent atteignables pendant que la touche Tab suit l’ordre de la page. Seule la balise du template qui produit l’élément signalé est modifiée. Un tabindex que du code PHP produit ou qu’un script définit est laissé à une personne.

    Règles couvertes
    • tabindex AUTO
    • vs-focus-order MANUAL
    Types de fichiers modifiés
    .php
    removes tabindex="1" from the header search field of the fixture theme Données d’exemple

    header.php Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    49 49 <form role="search" method="get" class="woocommerce-product-search" action="<?php echo esc_url( home_url( '/search' ) ); ?>">
    50 50 <label class="screen-reader-text" for="woocommerce-product-search-field-0"><?php esc_html_e( 'Search for:', 'woocommerce' ); ?></label>
    51 51 <?php // VALIDISCAN-SEED vs-focus-order + tabindex: tabindex="1" "so the search is always the first stop". ?>
    52 Supprimée <input type="search" id="woocommerce-product-search-field-0" class="search-field" placeholder="<?php echo esc_attr__( 'Search products&hellip;', 'woocommerce' ); ?>" value="<?php echo get_search_query(); ?>" name="s" tabindex="1">
    52 Ajoutée <input type="search" id="woocommerce-product-search-field-0" class="search-field" placeholder="<?php echo esc_attr__( 'Search products&hellip;', 'woocommerce' ); ?>" value="<?php echo get_search_query(); ?>" name="s">
    53 53 <?php // VALIDISCAN-SEED button-name: icon-only submit button without text. ?>
    54 54 <button type="submit" value="<?php echo esc_attr_x( 'Search', 'submit button', 'woocommerce' ); ?>" class="kb-search-submit"><?php kb_icon( 'search' ); ?></button>
    55 55 <input type="hidden" name="post_type" value="product">
  • Des commandes réservées à la souris transformées en boutons button-semantics Dans un bandeau cookies ou un diaporama de votre thème, les éléments cliquables qui ne fonctionnent qu’à la souris deviennent de vrais boutons, sauf si le thème les met en forme ou les pilote par le nom de leur balise.

    Dans un bandeau cookies ou un diaporama qui fait partie de votre thème, les éléments cliquables <span>, <div>, <li> ou <i> qui ne fonctionnent qu’à la souris deviennent de vrais éléments <button>. Chaque classe et chaque attribut restent, de sorte que les styles et les scripts du thème continuent de fonctionner, et les touches Entrée et Espace font désormais ce que fait un clic. Une courte réinitialisation de style, limitée à ces classes, conserve leur apparence. Un bouton qui n’a qu’une icône, dans le même bandeau ou le même diaporama, reçoit un nom en anglais, comme décrit plus bas à propos des noms d’icônes. Un élément qu’aucun script n’écoute, un élément que le thème met en forme ou pilote par le nom de sa balise, ou un élément vide dont la fonction n’est pas claire, est laissé tel quel.

    Règles couvertes
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Types de fichiers modifiés
    .css.php
    turns the click-only cookie choices into buttons and names the close button Données d’exemple

    assets/css/main.css Modifications apportées à assets/css/main.css (lignes ajoutées : 17, lignes supprimées : 0)

    Modifications apportées à assets/css/main.css (lignes ajoutées : 17, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    766 766 gap: 0.75rem;
    767 767 }
    768 768
    769 Ajoutée /* validiscan:button-semantics */
    770 Ajoutée /* Controls that became <button>s: keep the look of the elements they replace. The theme
    771 Ajoutée rules for these classes follow and still win. */
    769 772 .kb-cookie-bar__settings,
    770 773 .kb-cookie-bar__accept {
    774 Ajoutée margin: 0;
    775 Ajoutée padding: 0;
    776 Ajoutée border: 0;
    777 Ajoutée background: none;
    778 Ajoutée color: inherit;
    779 Ajoutée font: inherit;
    780 Ajoutée line-height: inherit;
    781 Ajoutée text-align: inherit;
    782 Ajoutée cursor: pointer;
    783 Ajoutée }
    784 Ajoutée /* /validiscan:button-semantics */
    785 Ajoutée
    786 Ajoutée .kb-cookie-bar__settings,
    787 Ajoutée .kb-cookie-bar__accept {
    771 788 padding: 0.6em 1.1em;
    772 789 border-radius: 4px;
    773 790 font-size: 0.9rem;

    template-parts/cookie-bar.php Modifications apportées à template-parts/cookie-bar.php (lignes ajoutées : 3, lignes supprimées : 3)

    Modifications apportées à template-parts/cookie-bar.php (lignes ajoutées : 3, lignes supprimées : 3)
    Ligne avant Ligne après Modification Code
    21 21 <a href="<?php echo esc_url( get_privacy_policy_url() ); ?>"><?php esc_html_e( 'Privacy policy', 'kestrel-birch' ); ?></a>
    22 22 </p>
    23 23 <div class="kb-cookie-bar__actions">
    24 Supprimée <span class="kb-cookie-bar__settings" data-kb-consent="settings"><?php esc_html_e( 'Cookie settings', 'kestrel-birch' ); ?></span>
    25 Supprimée <span class="kb-cookie-bar__accept" data-kb-consent="accept"><?php esc_html_e( 'Accept', 'kestrel-birch' ); ?></span>
    26 Supprimée <button type="button" class="kb-cookie-bar__close" data-kb-consent="close"><?php kb_icon( 'close' ); ?></button>
    24 Ajoutée <button class="kb-cookie-bar__settings" data-kb-consent="settings" type="button"><?php esc_html_e( 'Cookie settings', 'kestrel-birch' ); ?></button>
    25 Ajoutée <button class="kb-cookie-bar__accept" data-kb-consent="accept" type="button"><?php esc_html_e( 'Accept', 'kestrel-birch' ); ?></button>
    26 Ajoutée <button type="button" class="kb-cookie-bar__close" data-kb-consent="close"><?php kb_icon( 'close' ); ?><span class="screen-reader-text"><?php esc_html_e( 'Close', 'kestrel-birch' ); ?></span></button>
    27 27 </div>
    28 28 </div>

Zoom, cibles tactiles et contraste

  • Zoom autorisé sur téléphone meta-viewport-zoom La balise viewport perd user-scalable=no et un maximum-scale inférieur à 2, afin que les visiteurs puissent de nouveau zoomer avec deux doigts, sauf si PHP calcule le contenu de la balise ou si un plugin la produit.

    La recette retire user-scalable=no et tout maximum-scale inférieur à 2 de la balise viewport, dans les templates d’en-tête ou dans le code PHP qui produit la balise, de sorte que les visiteurs puissent de nouveau zoomer avec deux doigts sur votre boutique. Pour la règle plus stricte meta-viewport-large d’axe-core, tout maximum-scale inférieur à 5 est retiré. Les autres réglages du viewport restent exactement tels quels. Une balise viewport dont PHP calcule le contenu, ou qu’un plugin produit, est laissée à une personne.

    Règles couvertes
    • meta-viewport AUTO
    • meta-viewport-large AUTO
    Types de fichiers modifiés
    .php
    re-enables zoom in every header template of the fixture theme Données d’exemple

    header-checkout.php Modifications apportées à header-checkout.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à header-checkout.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    12 12 <head>
    13 13 <meta charset="<?php bloginfo( 'charset' ); ?>">
    14 14 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled. ?>
    15 Supprimée <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    15 Ajoutée <meta name="viewport" content="width=device-width, initial-scale=1">
    16 16 <?php wp_head(); ?>
    17 17 </head>
    18 18

    header.php Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    14 14 <head>
    15 15 <meta charset="<?php bloginfo( 'charset' ); ?>">
    16 16 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled ("stops iOS zooming into inputs"). ?>
    17 Supprimée <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    17 Ajoutée <meta name="viewport" content="width=device-width, initial-scale=1">
    18 18 <?php wp_head(); ?>
    19 19 </head>
    20 20
  • Des cibles tactiles plus grandes target-size-padding Les largeurs ou hauteurs fixes inférieures à 24 pixels des commandes que le scan a trouvées trop petites sont portées à 24 pixels.

    Les commandes que le scan a trouvées plus petites que 24 × 24 pixels, comme les icônes de réseaux sociaux, les pastilles de couleur ou les boutons de quantité, reçoivent cette taille minimale. La recette repère les règles des feuilles de style qui donnent à ces éléments précis une largeur ou une hauteur fixe inférieure à 24 pixels et la portent à 24 pixels ; lorsque l’élément dispose son icône avec flexbox ou grid, l’icône est centrée pour ne pas se retrouver dans un coin. Une commande dont la taille vient de la marge intérieure (padding) ou de son contenu ne peut pas être mesurée à partir des feuilles de style et est laissée à une personne.

    Règles couvertes
    • vs-target-size AUTO
    Types de fichiers modifiés
    .css
    raises the social icons, quantity steppers and swatches of the fixture theme to 24 × 24 px Données d’exemple

    assets/css/main.css Modifications apportées à assets/css/main.css (lignes ajoutées : 4, lignes supprimées : 2)

    Modifications apportées à assets/css/main.css (lignes ajoutées : 4, lignes supprimées : 2)
    Ligne avant Ligne après Modification Code
    710 710 /* VALIDISCAN-SEED vs-target-size: 18 x 18 px icon links, 4 px apart. */
    711 711 .kb-social__link {
    712 712 display: inline-flex;
    713 Supprimée width: 18px;
    714 Supprimée height: 18px;
    713 Ajoutée width: 24px;
    714 Ajoutée height: 24px;
    715 715 color: var(--kb-ink);
    716 Ajoutée align-items: center;
    717 Ajoutée justify-content: center;
    716 718 }
    717 719
    718 720 .site-info {

    assets/css/woocommerce.css Modifications apportées à assets/css/woocommerce.css (lignes ajoutées : 4, lignes supprimées : 4)

    Modifications apportées à assets/css/woocommerce.css (lignes ajoutées : 4, lignes supprimées : 4)
    Ligne avant Ligne après Modification Code
    421 421
    422 422 /* VALIDISCAN-SEED vs-target-size: 18 x 18 px colour swatches, 4 px apart. */
    423 423 .kb-swatch {
    424 Supprimée width: 18px;
    425 Supprimée height: 18px;
    424 Ajoutée width: 24px;
    425 Ajoutée height: 24px;
    426 426 padding: 0;
    427 427 border: 1px solid rgba(0, 0, 0, 0.2);
    428 428 border-radius: 50%;
    489 489 /* VALIDISCAN-SEED vs-target-size: 18 x 18 px quantity steppers glued to the input. */
    490 490 .kb-qty-minus,
    491 491 .kb-qty-plus {
    492 Supprimée width: 18px;
    493 Supprimée height: 18px;
    492 Ajoutée width: 24px;
    493 Ajoutée height: 24px;
    494 494 padding: 0;
    495 495 border: 1px solid #b9b3aa;
    496 496 border-radius: 2px;
  • Des couleurs de texte suffisamment contrastées contrast-tokens Une couleur de texte qui échoue au contrôle du contraste, définie à un seul endroit et non utilisée aussi pour des arrière-plans, des bordures ou des éléments que le scan n’a pas mesurés, passe à la nuance la plus proche de la même teinte qui atteint le contraste requis.

    Lorsqu’un texte échoue au contrôle du contraste et que sa couleur est définie à un seul endroit dans les feuilles de style du thème, comme variable CSS ou comme couleur de la règle qui met ce texte en forme, cette couleur passe à la nuance la plus proche, plus claire ou plus foncée, de la même teinte, qui atteint le contraste que le scan a mesuré comme requis, sur chaque arrière-plan qu’il a mesuré. Une couleur définie à plusieurs endroits, qui modifierait aussi des éléments dont le scan n’a pas mesuré le contraste, ou que le thème utilise aussi pour des arrière-plans ou des bordures, est laissée à une personne.

    Règles couvertes
    • color-contrast ASSISTED
    Types de fichiers modifiés
    .css
    darkens the footer text colour when every element it styles was measured Données d’exemple

    assets/css/main.css Modifications apportées à assets/css/main.css (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à assets/css/main.css (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    676 676 .kb-footer-about,
    677 677 .kb-footer-newsletter-intro,
    678 678 .site-info {
    679 Supprimée color: #888;
    679 Ajoutée color: #6e6e6e;
    680 680 }
    681 681
    682 682 .site-footer ul.menu {

Mouvement, diaporamas et son

  • Moins de mouvement lorsque le visiteur le demande reduced-motion-guard Pour les visiteurs dont l’appareil demande de réduire les mouvements, les animations s’arrêtent dans leur état final et le défilement automatique que lancent les scripts du thème ne démarre pas ; le mouvement d’un plugin ou d’un script inline n’est pas modifié.

    Lorsque l’appareil d’un visiteur est réglé pour réduire les mouvements, un bloc placé à la fin de la feuille de style principale du thème laisse chaque animation s’exécuter une seule fois, trop brièvement pour qu’on la voie, de sorte qu’elle s’arrête dans son état final ; les transitions deviennent instantanées et le défilement fluide est désactivé. Lorsque les scripts du thème lancent le défilement automatique d’un diaporama, avec Slick, Swiper, Splide, Owl ou Flickity, celui-ci ne démarre que pour les visiteurs qui n’ont pas demandé de réduire les mouvements. Le mouvement qui vient d’un plugin ou d’un script inline n’est pas modifié.

    Règles couvertes
    • vs-motion AUTO
    Types de fichiers modifiés
    .css
    guards the looping hero slide and sale badge animations of the fixture theme Données d’exemple

    assets/css/main.css Modifications apportées à assets/css/main.css (lignes ajoutées : 13, lignes supprimées : 0)

    Modifications apportées à assets/css/main.css (lignes ajoutées : 13, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    794 794 color: #999;
    795 795 cursor: pointer;
    796 796 }
    797 Ajoutée
    798 Ajoutée /* validiscan:reduced-motion-guard */
    799 Ajoutée @media (prefers-reduced-motion: reduce) {
    800 Ajoutée *,
    801 Ajoutée *::before,
    802 Ajoutée *::after {
    803 Ajoutée animation-duration: 0.01ms !important;
    804 Ajoutée animation-iteration-count: 1 !important;
    805 Ajoutée transition-duration: 0.01ms !important;
    806 Ajoutée scroll-behavior: auto !important;
    807 Ajoutée }
    808 Ajoutée }
    809 Ajoutée /* /validiscan:reduced-motion-guard */
  • Un bouton de pause pour les diaporamas animés slider-pause-control Un diaporama des templates de votre thème qui défile tout seul reçoit un bouton visible de pause et de lecture, intitulé en anglais, sauf si un plugin ou un script inline le pilote.

    Un diaporama des templates de votre thème qui défile tout seul reçoit un bouton visible pour le mettre en pause et le relancer, intitulé « Pause slideshow » et « Play slideshow » en anglais. Le bouton devient le premier élément du diaporama : les personnes qui naviguent au clavier l’atteignent donc avant les diapositives. Un court script du fichier de script principal du thème relie le bouton au défilement automatique propre au slider : une animation CSS du thème, Slick, Swiper ou Flickity. Pour les visiteurs dont l’appareil demande de réduire les mouvements, le diaporama démarre en pause. Un slider qu’un plugin ou un script inline pilote est laissé à une personne.

    Règles couvertes
    • vs-carousel AUTO
    Types de fichiers modifiés
    .css.js.php
    adds a pause button to the CSS-animated hero slider of the fixture theme Données d’exemple

    assets/css/main.css Modifications apportées à assets/css/main.css (lignes ajoutées : 28, lignes supprimées : 0)

    Modifications apportées à assets/css/main.css (lignes ajoutées : 28, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    508 508 background: var(--kb-navy);
    509 509 }
    510 510
    511 Ajoutée /* validiscan:slider-pause-control */
    512 Ajoutée .hero-slider.is-paused .hero-slider__track {
    513 Ajoutée animation-play-state: paused;
    514 Ajoutée }
    515 Ajoutée
    516 Ajoutée @media (prefers-reduced-motion: reduce) {
    517 Ajoutée .hero-slider__track {
    518 Ajoutée animation-play-state: paused;
    519 Ajoutée }
    520 Ajoutée }
    521 Ajoutée
    522 Ajoutée .hero-slider__pause {
    523 Ajoutée position: absolute;
    524 Ajoutée top: 1rem;
    525 Ajoutée right: 1rem;
    526 Ajoutée z-index: 2;
    527 Ajoutée min-height: 24px;
    528 Ajoutée padding: 0.4em 0.9em;
    529 Ajoutée border: 2px solid currentColor;
    530 Ajoutée border-radius: 4px;
    531 Ajoutée background: #ffffff;
    532 Ajoutée color: var(--kb-ink);
    533 Ajoutée font: inherit;
    534 Ajoutée font-weight: 600;
    535 Ajoutée cursor: pointer;
    536 Ajoutée }
    537 Ajoutée /* /validiscan:slider-pause-control */
    538 Ajoutée
    511 539 .hero-slide img {
    512 540 width: 100%;
    513 541 aspect-ratio: 5 / 2;

    assets/js/theme.js Modifications apportées à assets/js/theme.js (lignes ajoutées : 20, lignes supprimées : 0)

    Modifications apportées à assets/js/theme.js (lignes ajoutées : 20, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    255 255 initCheckout();
    256 256 initShowPassword();
    257 257 })();
    258 Ajoutée
    259 Ajoutée /* validiscan:slider-pause-control */
    260 Ajoutée (function () {
    261 Ajoutée const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    262 Ajoutée for (const slider of document.querySelectorAll('.hero-slider')) {
    263 Ajoutée const button = slider.querySelector('.hero-slider__pause');
    264 Ajoutée if (!button) continue;
    265 Ajoutée const pauseLabel = button.textContent;
    266 Ajoutée const playLabel = button.getAttribute('data-play-label') || pauseLabel;
    267 Ajoutée const set = (paused) => {
    268 Ajoutée slider.classList.toggle('is-paused', paused);
    269 Ajoutée button.textContent = paused ? playLabel : pauseLabel;
    270 Ajoutée };
    271 Ajoutée button.addEventListener('click', () => {
    272 Ajoutée set(!slider.classList.contains('is-paused'));
    273 Ajoutée });
    274 Ajoutée if (reduce) set(true);
    275 Ajoutée }
    276 Ajoutée })();
    277 Ajoutée /* /validiscan:slider-pause-control */

    template-parts/hero-slider.php Modifications apportées à template-parts/hero-slider.php (lignes ajoutées : 1, lignes supprimées : 0)

    Modifications apportées à template-parts/hero-slider.php (lignes ajoutées : 1, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    37 37 };
    38 38 ?>
    39 39 <div class="hero-slider" data-autoplay="true" data-interval="6000">
    40 Ajoutée <button type="button" class="hero-slider__pause" data-play-label="<?php esc_attr_e( 'Play slideshow', 'kestrel-birch' ); ?>"><?php esc_html_e( 'Pause slideshow', 'kestrel-birch' ); ?></button>
    40 41 <div class="hero-slider__viewport">
    41 42 <div class="hero-slider__track">
    42 43 <?php
  • Aucun son qui démarre tout seul mute-autoplay Une vidéo des templates du thème qui se lance toute seule est rendue muette et un son ne démarre plus tout seul, sauf si un script les lance ; sur WooCommerce, la recette n’est pas utilisée pour les constats de vs-media.

    Une vidéo des templates du thème qui se lance toute seule reçoit muted et playsinline : elle continue ainsi de jouer en silence et se lit dans la page sur iPhone au lieu de passer en plein écran ; lorsque la vidéo a des commandes, les visiteurs peuvent toujours activer le son. Un son qui démarre tout seul ne le fait plus. Les médias qu’un script lance sont laissés à une personne. Dans un scan Validiscan, le son qui démarre tout seul est signalé par le contrôle des médias vs-media de Validiscan, qui remplace la règle d’axe-core que cette recette couvre ; vs-media est MANUAL (voir la liste plus bas) : sur WooCommerce, un tel constat s’accompagne donc d’indications plutôt que de cette modification.

    Règles couvertes
    • no-autoplay-audio AUTO contrôle assuré par vs-media
    Types de fichiers modifiés
    .php
    mutes an autoplaying product video of the fixture theme Données d’exemple

    woocommerce/single-product/tabs/description.php Modifications apportées à woocommerce/single-product/tabs/description.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à woocommerce/single-product/tabs/description.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    48 48 <?php if ( $kb_video ) : ?>
    49 49 <h3><?php esc_html_e( 'The weekender, packed', 'kestrel-birch' ); ?></h3>
    50 50 <figure class="wp-block-video">
    51 Supprimée <video autoplay loop controls preload="none" poster="<?php echo esc_url( get_the_post_thumbnail_url( $kb_video, 'full' ) ); ?>" width="640" height="360">
    51 Ajoutée <video autoplay loop controls preload="none" poster="<?php echo esc_url( get_the_post_thumbnail_url( $kb_video, 'full' ) ); ?>" width="640" height="360" muted playsinline>
    52 52 <source src="<?php echo esc_url( wp_get_attachment_url( $kb_video ) ); ?>" type="video/webm">
    53 53 </video>
    54 54 <figcaption><?php echo esc_html( wp_get_attachment_caption( $kb_video ) ); ?></figcaption>

Formulaires, prix et panier

  • Des étiquettes reliées à leurs champs label-association Une étiquette qui figure déjà dans le template, mais n’est pas reliée à son champ, y est reliée par for ou aria-labelledby.

    Un champ de formulaire dont le texte d’étiquette figure déjà dans le template, mais n’est pas relié au champ, est relié à celui-ci : le <label> placé juste avant le champ, ou juste après une case à cocher ou un bouton radio, reçoit un for qui pointe vers le champ, ou bien un élément de texte désigné comme étiquette est relié par aria-labelledby. Les lecteurs d’écran lisent alors l’étiquette lorsque le champ reçoit le focus, et un clic sur un <label> relié déplace le focus vers le champ. Un champ qui n’a qu’un texte indicatif (placeholder) est laissé à une personne, car rédiger une étiquette est une décision de contenu.

    Règles couvertes
    • label AUTO contrôle assuré par vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    Types de fichiers modifiés
    .php
    ties an unassociated coupon label to its field, as in the fixed cart Données d’exemple

    woocommerce/cart/cart.php Modifications apportées à woocommerce/cart/cart.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à woocommerce/cart/cart.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    62 62 <tr>
    63 63 <td colspan="6" class="actions">
    64 64 <div class="coupon">
    65 Supprimée <label class="screen-reader-text"><?php esc_html_e( 'Coupon:', 'woocommerce' ); ?></label>
    65 Ajoutée <label class="screen-reader-text" for="coupon_code"><?php esc_html_e( 'Coupon:', 'woocommerce' ); ?></label>
    66 66 <input type="text" name="coupon_code" class="input-text" id="coupon_code" value="" placeholder="<?php esc_attr_e( 'Coupon code', 'woocommerce' ); ?>">
    67 67 <button type="submit" class="button" name="apply_coupon" value="<?php esc_attr_e( 'Apply coupon', 'woocommerce' ); ?>"><?php esc_html_e( 'Apply coupon', 'woocommerce' ); ?></button>
    68 68 </div>
  • Des champs de commande et de compte que les navigateurs peuvent remplir autocomplete-tokens Les champs qui demandent des données sur le client reçoivent la valeur autocomplete correspondante lorsque le code montre leur fonction ; pour les champs de facturation et de livraison de WooCommerce, un filtre dans functions.php la définit.

    Les champs des templates du thème qui demandent des données sur le client, comme les champs de connexion, d’inscription et de commande, reçoivent la valeur autocomplete qui correspond à ce qu’ils demandent, comme l’adresse e-mail, le nom d’utilisateur, le mot de passe actuel ou nouveau, le prénom et le nom, la société, l’adresse, le code postal, le pays ou le numéro de téléphone. La valeur est déduite du type, du nom, de l’id et de l’étiquette du champ. Une valeur manquante, off ou non valide est remplacée ; une valeur valide reste. Les champs de facturation et de livraison de WooCommerce sont produits par WooCommerce, et non par le thème : un filtre dans functions.php définit donc leurs valeurs. Il s’exécute après les filtres propres au thème pour ces champs, qui peuvent supprimer les valeurs. Les champs qui ne demandent aucune donnée personnelle, comme les champs de recherche, de code promo ou de quantité, sont laissés tels quels, de même qu’un champ dont le code ne montre pas la fonction.

    Règles couvertes
    • autocomplete-valid AUTO contrôle assuré par vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    Types de fichiers modifiés
    .php
    sets the tokens of the login, registration and checkout fields of the fixture theme Données d’exemple

    functions.php Modifications apportées à functions.php (lignes ajoutées : 44, lignes supprimées : 0)

    Modifications apportées à functions.php (lignes ajoutées : 44, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    308 308 * here; the remediation adds one for pages with the _kb_content_language meta and marks the
    309 309 * English header and footer with lang="en-GB".
    310 310 */
    311 Ajoutée
    312 Ajoutée /* validiscan:autocomplete-tokens */
    313 Ajoutée /**
    314 Ajoutée * Autocomplete tokens for the WooCommerce address fields, so browsers and assistive
    315 Ajoutée * technology know what each field asks for (WCAG 1.3.5). Runs after the theme's own
    316 Ajoutée * field filters.
    317 Ajoutée *
    318 Ajoutée * @param array $fields Checkout fields (grouped by section) or one address section.
    319 Ajoutée * @return array
    320 Ajoutée */
    321 Ajoutée function kb_address_autocomplete( $fields ) {
    322 Ajoutée $tokens = array(
    323 Ajoutée 'first_name' => 'given-name',
    324 Ajoutée 'last_name' => 'family-name',
    325 Ajoutée 'company' => 'organization',
    326 Ajoutée 'country' => 'country',
    327 Ajoutée 'address_1' => 'address-line1',
    328 Ajoutée 'address_2' => 'address-line2',
    329 Ajoutée 'city' => 'address-level2',
    330 Ajoutée 'state' => 'address-level1',
    331 Ajoutée 'postcode' => 'postal-code',
    332 Ajoutée 'phone' => 'tel',
    333 Ajoutée 'email' => 'email',
    334 Ajoutée );
    335 Ajoutée foreach ( $fields as $key => $field ) {
    336 Ajoutée if ( ! is_array( $field ) ) {
    337 Ajoutée continue;
    338 Ajoutée }
    339 Ajoutée if ( 'billing' === $key || 'shipping' === $key ) {
    340 Ajoutée $fields[ $key ] = kb_address_autocomplete( $field );
    341 Ajoutée continue;
    342 Ajoutée }
    343 Ajoutée if ( ! preg_match( '/^(billing|shipping)_(.+)$/', (string) $key, $match ) || ! isset( $tokens[ $match[2] ] ) ) {
    344 Ajoutée continue;
    345 Ajoutée }
    346 Ajoutée $fields[ $key ]['autocomplete'] = ( 'shipping' === $match[1] ? 'shipping ' : '' ) . $tokens[ $match[2] ];
    347 Ajoutée unset( $fields[ $key ]['custom_attributes']['autocomplete'] );
    348 Ajoutée }
    349 Ajoutée return $fields;
    350 Ajoutée }
    351 Ajoutée add_filter( 'woocommerce_checkout_fields', 'kb_address_autocomplete', 99 );
    352 Ajoutée add_filter( 'woocommerce_billing_fields', 'kb_address_autocomplete', 99 );
    353 Ajoutée add_filter( 'woocommerce_shipping_fields', 'kb_address_autocomplete', 99 );
    354 Ajoutée /* /validiscan:autocomplete-tokens */

    woocommerce/myaccount/form-login.php Modifications apportées à woocommerce/myaccount/form-login.php (lignes ajoutées : 3, lignes supprimées : 3)

    Modifications apportées à woocommerce/myaccount/form-login.php (lignes ajoutées : 3, lignes supprimées : 3)
    Ligne avant Ligne après Modification Code
    29 29
    30 30 <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
    31 31 <label for="username"><?php esc_html_e( 'Username or email address', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
    32 Supprimée <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="username" autocomplete="off" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized ?>">
    32 Ajoutée <input type="text" class="woocommerce-Input woocommerce-Input--text input-text" name="username" id="username" autocomplete="username" value="<?php echo ( ! empty( $_POST['username'] ) ) ? esc_attr( wp_unslash( $_POST['username'] ) ) : ''; // phpcs:ignore WordPress.Security.NonceVerification.Missing,WordPress.Security.ValidatedSanitizedInput.InputNotSanitized ?>">
    33 33 </p>
    34 34 <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
    35 35 <label for="password"><?php esc_html_e( 'Password', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
    36 36 <span class="password-input">
    37 Supprimée <input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="off" onpaste="return false;">
    37 Ajoutée <input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="current-password" onpaste="return false;">
    38 38 <button type="button" class="show-password-input"><?php kb_icon( 'eye' ); ?></button>
    39 39 </span>
    40 40 </p>
    63 63 <?php do_action( 'woocommerce_register_form_start' ); ?>
    64 64
    65 65 <p class="woocommerce-form-row woocommerce-form-row--wide form-row form-row-wide">
    66 Supprimée <input type="email" class="woocommerce-Input woocommerce-Input--text input-text" name="email" id="reg_email" autocomplete="off" value="" placeholder="<?php esc_attr_e( 'Email address *', 'kestrel-birch' ); ?>">
    66 Ajoutée <input type="email" class="woocommerce-Input woocommerce-Input--text input-text" name="email" id="reg_email" autocomplete="email" value="" placeholder="<?php esc_attr_e( 'Email address *', 'kestrel-birch' ); ?>">
    67 67 </p>
    68 68 <p><?php esc_html_e( 'A link to set a new password will be sent to your email address.', 'woocommerce' ); ?></p>
    69 69
  • Les changements de prix, de stock et de panier annoncés live-region-cart-variant Les lecteurs d’écran annoncent le nouveau prix et le nouveau stock de la variation choisie, sauf si le script du thème remplace cette zone en bloc, ainsi que, en anglais, un produit ajouté au panier ou retiré du panier.

    Lorsqu’un client choisit une autre taille ou une autre couleur, la zone qui affiche le prix et le stock de la variation choisie est réécrite sur place. Cette zone devient une région live, de sorte que les lecteurs d’écran annoncent le nouveau prix et le nouveau stock sans que le client ait à s’y déplacer. Le lien du panier dans l’en-tête est remplacé en bloc lorsqu’un produit est ajouté : il ne peut donc pas porter lui-même l’annonce. À côté, la recette ajoute un message d’état masqué visuellement, et un court bloc du script du thème y écrit « Product added to your cart. » ou « Product removed from your cart. » lorsque WooCommerce signale le changement. Les deux messages sont ajoutés en anglais. Une zone qui est déjà une région live ou qui se trouve dans l’une d’elles, ou que le script du thème remplace en bloc, est laissée telle quelle.

    Règles couvertes
    • vs-live-updates AUTO
    Types de fichiers modifiés
    .js.php
    adds a status region next to the header cart fragment and wires the theme script Données d’exemple

    assets/js/theme.js Modifications apportées à assets/js/theme.js (lignes ajoutées : 15, lignes supprimées : 0)

    Modifications apportées à assets/js/theme.js (lignes ajoutées : 15, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    255 255 initCheckout();
    256 256 initShowPassword();
    257 257 })();
    258 Ajoutée
    259 Ajoutée /* validiscan:live-region-cart-variant */
    260 Ajoutée // Announces cart changes in the status region next to the header cart (WCAG 4.1.3).
    261 Ajoutée (function () {
    262 Ajoutée const region = document.querySelector('[data-kb-cart-status]');
    263 Ajoutée if (!region || !window.jQuery) return;
    264 Ajoutée window.jQuery(document.body).on('added_to_cart removed_from_cart', (event) => {
    265 Ajoutée const message = region.getAttribute(event.type === 'added_to_cart' ? 'data-added' : 'data-removed');
    266 Ajoutée region.textContent = '';
    267 Ajoutée window.setTimeout(() => {
    268 Ajoutée region.textContent = message || '';
    269 Ajoutée }, 100);
    270 Ajoutée });
    271 Ajoutée })();
    272 Ajoutée /* /validiscan:live-region-cart-variant */

    header.php Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 0)

    Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 0)
    Ligne avant Ligne après Modification Code
    67 67 <?php kb_icon( 'bag' ); ?><span class="kb-cart-amount"><?php echo wp_kses_post( WC()->cart->get_cart_subtotal() ); ?></span>
    68 68 <span class="count"><?php echo esc_html( sprintf( _n( '%d item', '%d items', WC()->cart->get_cart_contents_count(), 'storefront' ), WC()->cart->get_cart_contents_count() ) ); ?></span>
    69 69 </a>
    70 Ajoutée <span class="screen-reader-text" role="status" data-kb-cart-status data-added="<?php esc_attr_e( 'Product added to your cart.', 'kestrel-birch' ); ?>" data-removed="<?php esc_attr_e( 'Product removed from your cart.', 'kestrel-birch' ); ?>"></span>
    70 71 </li>
    71 72 </ul>
    72 73 </div>
    makes the variation price and stock of the fixture theme a polite live region Données d’exemple

    woocommerce/single-product/add-to-cart/variable.php Modifications apportées à woocommerce/single-product/add-to-cart/variable.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à woocommerce/single-product/add-to-cart/variable.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    65 65 </table>
    66 66
    67 67 <div class="single_variation_wrap">
    68 Supprimée <div class="woocommerce-variation single_variation">
    68 Ajoutée <div class="woocommerce-variation single_variation" aria-live="polite" aria-atomic="true">
    69 69 <div class="woocommerce-variation-description"></div>
    70 70 <div class="woocommerce-variation-price"><span class="price"><?php echo wp_kses_post( wc_price( $kb_selected['display_price'] ) ); ?></span></div>
    71 71 <div class="woocommerce-variation-availability"><?php echo wp_kses_post( $kb_selected['availability_html'] ); ?></div>

Noms des icônes, des images et des contenus intégrés

  • Des noms pour les boutons et les liens qui n’ont qu’une icône icon-accessible-name Les boutons et les liens qui n’affichent qu’une icône reçoivent un nom en anglais qui dit ce qu’ils font, lorsque le code montre leur fonction.

    Les boutons et les liens qui n’affichent qu’une icône reçoivent un nom qui dit ce qu’ils font, lorsque le code montre leur fonction : d’après le nom de l’icône elle-même, d’après la classe ou l’id de la commande, ou d’après la destination d’un lien, comme le panier, la page du compte ou un réseau social. Par exemple Search, Cart, My account, Show password, Close et Menu. Le nom est un texte visuellement masqué à l’intérieur de la commande, ou un aria-label lorsque le thème n’a pas de classe pour le texte masqué, et il est ajouté en anglais. Les noms de réseaux sociaux sont des noms de marque et restent tels quels. Une commande dont le code ne montre pas la fonction est laissée à une personne.

    Règles couvertes
    • button-name ASSISTED
    • link-name ASSISTED
    Types de fichiers modifiés
    .php
    names the account link and the social links, and leaves the uncertain gallery link Données d’exemple

    header.php Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    60 60 <ul id="site-header-cart" class="site-header-cart menu">
    61 61 <li class="kb-account">
    62 62 <?php // VALIDISCAN-SEED link-name: icon-only account link. ?>
    63 Supprimée <a class="kb-account-link" href="<?php echo esc_url( wc_get_page_permalink( 'myaccount' ) ); ?>"><?php kb_icon( 'user' ); ?></a>
    63 Ajoutée <a class="kb-account-link" href="<?php echo esc_url( wc_get_page_permalink( 'myaccount' ) ); ?>"><?php kb_icon( 'user' ); ?><span class="screen-reader-text"><?php esc_html_e( 'My account', 'kestrel-birch' ); ?></span></a>
    64 64 </li>
    65 65 <li class="kb-cart<?php echo is_cart() ? ' current-menu-item' : ''; ?>">
    66 66 <a class="cart-contents" href="<?php echo esc_url( wc_get_cart_url() ); ?>" title="<?php esc_attr_e( 'View your shopping cart', 'storefront' ); ?>">

    template-parts/social-links.php Modifications apportées à template-parts/social-links.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à template-parts/social-links.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    17 17 ?>
    18 18 <ul class="kb-social">
    19 19 <?php foreach ( $kb_profiles as $kb_network => $kb_url ) : ?>
    20 Supprimée <a class="kb-social__link" href="<?php echo esc_url( $kb_url ); ?>"><?php kb_icon( $kb_network ); ?></a>
    20 Ajoutée <a class="kb-social__link" href="<?php echo esc_url( $kb_url ); ?>"><?php kb_icon( $kb_network ); ?><span class="screen-reader-text"><?php echo esc_html( ucfirst( $kb_network ) ); ?></span></a>
    21 21 <?php endforeach; ?>
    22 22 </ul>
    names the icon-only search and show-password buttons of the fixture theme Données d’exemple

    header.php Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    51 51 <?php // VALIDISCAN-SEED vs-focus-order + tabindex: tabindex="1" "so the search is always the first stop". ?>
    52 52 <input type="search" id="woocommerce-product-search-field-0" class="search-field" placeholder="<?php echo esc_attr__( 'Search products&hellip;', 'woocommerce' ); ?>" value="<?php echo get_search_query(); ?>" name="s" tabindex="1">
    53 53 <?php // VALIDISCAN-SEED button-name: icon-only submit button without text. ?>
    54 Supprimée <button type="submit" value="<?php echo esc_attr_x( 'Search', 'submit button', 'woocommerce' ); ?>" class="kb-search-submit"><?php kb_icon( 'search' ); ?></button>
    54 Ajoutée <button type="submit" value="<?php echo esc_attr_x( 'Search', 'submit button', 'woocommerce' ); ?>" class="kb-search-submit"><?php kb_icon( 'search' ); ?><span class="screen-reader-text"><?php esc_html_e( 'Search', 'kestrel-birch' ); ?></span></button>
    55 55 <input type="hidden" name="post_type" value="product">
    56 56 </form>
    57 57 </div>

    woocommerce/myaccount/form-login.php Modifications apportées à woocommerce/myaccount/form-login.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à woocommerce/myaccount/form-login.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    35 35 <label for="password"><?php esc_html_e( 'Password', 'woocommerce' ); ?>&nbsp;<span class="required">*</span></label>
    36 36 <span class="password-input">
    37 37 <input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="off" onpaste="return false;">
    38 Supprimée <button type="button" class="show-password-input"><?php kb_icon( 'eye' ); ?></button>
    38 Ajoutée <button type="button" class="show-password-input"><?php kb_icon( 'eye' ); ?><span class="screen-reader-text"><?php esc_html_e( 'Show password', 'kestrel-birch' ); ?></span></button>
    39 39 </span>
    40 40 </p>
    41 41
  • Des images décoratives masquées aux lecteurs d’écran decorative-image-alt Seules les images dont le code prouve qu’elles sont décoratives reçoivent un alt vide ou aria-hidden ; l’alternative textuelle de toute autre image est laissée à une personne.

    Une image n’est marquée comme décorative que lorsque le code prouve qu’elle n’apporte rien : elle se trouve dans un lien ou un bouton qui a son propre texte, comme un logo à côté du nom de la boutique, c’est une petite icône placée à côté de sa propre étiquette textuelle, ou c’est un espaceur ou un séparateur. Un <img> reçoit alors alt="", et une icône SVG reçoit aria-hidden="true", de sorte que les lecteurs d’écran l’ignorent au lieu d’annoncer un graphique sans nom. Toute autre image est du contenu, et son alternative textuelle est laissée à une personne.

    Règles couvertes
    • image-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    Types de fichiers modifiés
    .php
    hides the logo mark inside the home link that has the shop name Données d’exemple

    header.php Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à header.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    39 39 <div class="site-branding">
    40 40 <a href="<?php echo esc_url( home_url( '/' ) ); ?>" class="custom-logo-link" rel="home">
    41 41 <?php // VALIDISCAN-SEED svg-img-alt: the logo mark is role="img" without a title or aria-label. ?>
    42 Supprimée <svg class="kb-logo-mark" role="img" width="40" height="40" viewBox="0 0 40 40"><path d="M3 30c6-11 15-17 29-18-7 3-10 8-11 13 6-4 11-5 17-4-9 2-15 8-19 15L3 30Z" fill="#1d3b53"/></svg>
    42 Ajoutée <svg class="kb-logo-mark" width="40" height="40" viewBox="0 0 40 40" aria-hidden="true" focusable="false"><path d="M3 30c6-11 15-17 29-18-7 3-10 8-11 13 6-4 11-5 17-4-9 2-15 8-19 15L3 30Z" fill="#1d3b53"/></svg>
    43 43 <span class="kb-logo-text"><?php bloginfo( 'name' ); ?></span>
    44 44 </a>
    45 45 </div>
  • Des titres pour les cartes et les vidéos intégrées iframe-title Un cadre intégré sans titre reçoit un titre en anglais qui dit ce qu’il montre, lorsque le code le montre.

    Un cadre intégré sans titre, comme une carte ou une vidéo YouTube ou Vimeo, reçoit un titre en anglais qui dit ce qu’il montre. La recette le tire du titre d’un fichier intégré dans le thème, du fournisseur indiqué dans l’adresse du cadre, ou de mots comme map ou video dans sa classe ou son id. Un cadre dont le code ne montre pas le contenu ne reçoit aucun titre générique ; il est laissé à une personne.

    Règles couvertes
    • frame-title AUTO
    Types de fichiers modifiés
    .php
    titles the store map iframe of the contact page from the embedded document Données d’exemple

    page-contact.php Modifications apportées à page-contact.php (lignes ajoutées : 1, lignes supprimées : 1)

    Modifications apportées à page-contact.php (lignes ajoutées : 1, lignes supprimées : 1)
    Ligne avant Ligne après Modification Code
    81 81
    82 82 <div class="kb-store-map">
    83 83 <?php // VALIDISCAN-SEED frame-title: the map iframe has no title. ?>
    84 Supprimée <iframe src="<?php echo esc_url( get_stylesheet_directory_uri() . '/assets/embeds/store-map.html' ); ?>" width="600" height="320" loading="lazy"></iframe>
    84 Ajoutée <iframe src="<?php echo esc_url( get_stylesheet_directory_uri() . '/assets/embeds/store-map.html' ); ?>" width="600" height="320" loading="lazy" title="<?php esc_attr_e( 'Map: Kestrel & Birch workshop, Hamburg', 'kestrel-birch' ); ?>"></iframe>
    85 85 </div>
    86 86 </div>
    87 87 </article>
Détails : ce que corrigent les recettes, les niveaux et le thème de test

Validiscan dispose de 20 recettes pour les thèmes WooCommerce. Elles corrigent la structure de la page et la navigation, le focus clavier, le zoom, les cibles tactiles et le contraste, le mouvement et le son, les champs de formulaire et le panier, ainsi que les noms des icônes, des images et des cadres intégrés. Une recette est une modification déterministe pour un type d’échec : le même code reçoit toujours la même modification. Chacune n’intervient que là où le code du thème montre quelle modification est la bonne ; là où il ne le montre pas, la recette ne change rien et le constat est laissé à une personne.

Sous chaque recette figurent les règles qu’elle couvre, avec le niveau de chaque règle dans le catalogue de Validiscan. AUTO signifie qu’une recette est la correction standard de la règle. ASSISTED signifie que la correction demande du jugement : une modification est donc rédigée, puis relue. MANUAL signifie que la règle demande la décision d’une personne, et Validiscan donne des indications au lieu d’une modification du code. Dans un projet, les recettes sont appliquées aux constats des règles du niveau AUTO. Lorsqu’une recette énumère aussi une règle du niveau ASSISTED ou MANUAL, un constat de cette règle suit à la place la voie ASSISTED ou MANUAL. Une règle marquée « contrôle assuré par » un autre contrôle n’est pas exécutée seule lors d’un scan : cet autre contrôle signale le même échec.

Les types de fichiers et l’avant et l’après de chaque recette proviennent des tests de l’application elle-même. La plupart s’exécutent sur son thème de test WooCommerce, un thème enfant du thème Storefront dans lequel des échecs d’accessibilité ont été introduits volontairement ; les commentaires marqués VALIDISCAN-SEED que l’on voit dans certains diffs les signalent et n’existent que dans le thème de test. Les pages WordPress ne peuvent pas être générées dans l’environnement de test : ces tests ne génèrent donc pas de pages, ils vérifient la modification elle-même, sous la forme d’un avant et d’un après des fichiers du thème. Les fichiers de votre thème seront différents.

Qu’est-ce qui reste MANUAL sur WooCommerce ?

Les échecs qui exigent une décision sur le contenu ou le comportement qu’une modification de code prédéfinie ne peut pas prendre, par exemple les sous-titres et transcriptions de vos vidéos et contenus audio, restent MANUAL sur WooCommerce. Pour un constat d’une règle MANUAL, Validiscan donne des indications pour le corriger, et non une modification de votre code.

Les règles ci-dessous sont exécutées lors d’un scan et ont le niveau MANUAL sur WooCommerce ; les règles de bonne pratique ne sont pas énumérées.

  • meta-refresh L’actualisation différée de moins de 20 heures ne doit pas être utilisée
  • nested-interactive Les éléments interactifs ne doivent pas être imbriqués
  • scrollable-region-focusable Les zones défilantes doivent être accessibles au clavier
  • server-side-image-map Les images réactives côté serveur ne doivent pas être utilisées
  • vs-keyboard-trap Le focus clavier ne doit jamais rester piégé
  • vs-focus-order L’ordre de tabulation doit suivre l’ordre visuel
  • vs-dragging Les éléments à faire glisser doivent offrir une alternative à pointeur unique
  • vs-media Les vidéos ont besoin de sous-titres, l’audio d’une transcription, et rien ne doit démarrer automatiquement avec le son
  • vs-documents Les documents liés nécessitent une vérification manuelle de l’accessibilité
Détails : le contrôle de l’ordre de tabulation, et ce qu’un projet laisse de côté

Pour un constat d’une règle MANUAL, Validiscan donne des indications sur la façon de le corriger, et non une modification de votre code. Ces échecs exigent une décision sur le contenu ou le comportement qu’une modification de code prédéfinie ne peut pas prendre, par exemple les sous-titres et les transcriptions de vos vidéos et de vos contenus audio, un moyen de sortir d’un widget qui piège le focus clavier, un autre moyen d’utiliser une commande qui ne fonctionne qu’en la faisant glisser, ou un examen des documents liés, comme les PDF. Lorsqu’un constat vs-focus-order vient d’un tabindex supérieur à 0 dans un template du thème, la recette de l’ordre de tabulation ci-dessus le retire.

Le travail sur les constats MANUAL qui exigent vos propres décisions de contenu ne fait pas partie d’un projet, pas plus que les PDF. Entre les règles du niveau AUTO et celles du niveau MANUAL se trouvent les règles du niveau ASSISTED, comme les alternatives textuelles des images de produits ou les noms des boutons : leurs corrections demandent du jugement, et Validiscan relit chaque correction avant sa livraison. Ce que les tests d’accessibilité automatisés peuvent et ne peuvent pas prouver

Que devez-vous fournir ?

Vous fournissez l’autorisation écrite d’un scan complet, une voie d’accès à votre thème, votre réponse sur la rédaction par IA des corrections ASSISTED, un développeur ou une agence qui relit les modifications et les met en ligne, vos décisions sur ce qui reste MANUAL et, pour une boutique non anglophone, les traductions du nouveau texte anglais.

  1. Une autorisation écrite pour un scan complet de votre boutique. Un scan complet met un produit dans le panier et ouvre la première étape du tunnel de commande, sans finaliser d’achat ni saisir de données de paiement.
  2. Une voie d’accès à votre thème : l’accès au dépôt GitHub qui contient votre thème ou votre thème enfant, ou un ZIP du dossier du thème téléversé dans le portail client.
  3. Votre réponse à la question de savoir si l’IA peut rédiger des corrections du niveau ASSISTED. La rédaction par IA reste désactivée tant que vous n’avez pas donné votre accord.
  4. Un développeur ou une agence qui relit les modifications, fusionne la pull request ou applique le lot de correctifs, et met le thème en ligne.
  5. Les traductions du nouveau texte anglais, si votre boutique est dans une autre langue.
  6. Vos décisions sur ce qui reste MANUAL, comme les sous-titres de vos vidéos.
Détails : une fois les modifications en ligne, et ce que couvre un projet

Une fois les modifications en ligne, un scan de vérification contrôle de nouveau les pages concernées, et le Remediation Evidence Package consigne le résultat. Le déroulement d’un projet, étape par étape

Un projet couvre une boutique : un domaine et un thème.

Sources

4 sources, toutes vérifiées pour cette page le 6 octobre 2026.

Documentation de WooCommerce et de WordPress pour les développeurs 4
  1. Template structure & Overriding templates via a theme · WooCommerce · vérifiée le
  2. language_attributes() · WordPress.org · vérifiée le
  3. Localization (Common APIs Handbook) · WordPress.org · vérifiée le
  4. Templates (Theme Handbook) · WordPress.org · vérifiée le

Commencez par une vérification gratuite de votre boutique.

Envoyez l’adresse de votre boutique. Validiscan la scanne et vous envoie chaque échec que le scan peut prouver, avec sa page et son code.

Demander une vérification gratuite

Ou écrivez à info@validiscan.com.

Ce que couvre la vérification gratuite, et ce qu’elle laisse de côté
Vous envoyez
l’adresse de votre boutique
Pages scannées
jusqu’à 15
Vous recevez
chaque échec que le scan peut prouver, avec la page et le code
Sur votre boutique
pages publiques uniquement ; aucune connexion, aucun achat, aucun formulaire envoyé
Ce qu’elle n’est pas
un audit complet

Écrire à Validiscan

Pour une vérification gratuite, indiquez l’adresse de votre boutique et sa plateforme.

Validiscan utilise ce que vous envoyez pour vous répondre. Politique de confidentialité