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 :
Sur cette page : 7 réponses
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.
| 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/, 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.
- 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.
- 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.
- Vous ou votre développeur fusionnez la pull request, ou appliquez le lot de correctifs et testez les modifications.
- Vous ou votre développeur mettez le thème en ligne.
- 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/, 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.
- Régénérer le fichier
.potdu thème - Ajouter les traductions à ses fichiers
.po - Compiler les fichiers
.moque 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 valeurlangfixe non valide, reçoitlanguage_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 fonctionlanguage_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 valeurlangfixe 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 dansfunctions.phpdé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-langAUTO contrôle assuré par vs-lang -
html-lang-validAUTO contrôle assuré par vs-lang -
vs-langAUTO
-
- 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. ?> -
Lien d’évitement, zone principale et menus nommés skip-link-main Un lien d’évitement là où un template d’en-tête n’en a pas, une zone
<main>tirée du conteneur de contenu de la page là où il n’y en a pas, et des noms pour les zones de navigation dont la fonction apparaît, le tout en anglais.Chaque template d’en-tête sans lien d’évitement reçoit un lien « Skip to content » juste après la balise d’ouverture
<body>, ou après l’appelwp_body_open()qui la suit. Il reste masqué jusqu’à ce qu’il reçoive le focus, et il mène au contenu de la page. Si votre thème est un thème enfant de Storefront et qu’il a désactivé les liens d’évitement de Storefront, ils sont réactivés à la place. Lorsque les templates n’ont pas encore de zone principale, le conteneur de contenu des templates de page, un<div>d’idmainou de classesite-main, devient un élément<main>, qui le désigne comme la zone principale de la page ; lorsque les styles ou les scripts du thème sélectionnent ce conteneur comme undiv, il reste tel quel. Les zones de navigation dont la fonction apparaît dans leur id ou leur classe reçoivent un nom, par exemple Primary navigation, Breadcrumb, Footer navigation ou Pagination. Un lien d’évitement existant qui ne mène nulle part est redirigé vers le contenu. Le texte du lien et les noms sont ajoutés en anglais.- Règles couvertes
-
-
bypassAUTO contrôle assuré par vs-headings-landmarks -
landmark-one-mainAUTO contrôle assuré par vs-headings-landmarks -
regionAUTO -
skip-linkAUTO -
vs-headings-landmarksAUTO -
landmark-uniqueASSISTED
-
- Types de fichiers modifiés
-
.php
restores the skip links, adds <main> and labels the navigation of the fixture theme Données d’exemple 404.php Modifications apportées à 404.php (lignes ajoutées : 2, lignes supprimées : 2)
Modifications apportées à 404.php (lignes ajoutées : 2, lignes supprimées : 2) Ligne avant Ligne après Modification Code 9 9 ?> 10 10 11 11 <div id="primary" class="content-area"> 12 Supprimée <div id="main" class="site-main"> 12 Ajoutée <main id="main" class="site-main"> 13 13 <div class="error-404 not-found"> 14 14 <div class="page-content"> 15 15 <header class="page-header"> 22 22 </section> 23 23 </div> 24 24 </div> 25 Supprimée </div><!-- #main --> 25 Ajoutée </main><!-- #main --> 26 26 </div><!-- #primary --> 27 27 28 28 <?php archive-product.php Modifications apportées à archive-product.php (lignes ajoutées : 2, lignes supprimées : 2)
Modifications apportées à archive-product.php (lignes ajoutées : 2, lignes supprimées : 2) Ligne avant Ligne après Modification Code 22 22 23 23 <div id="primary" class="content-area"> 24 24 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 25 Supprimée <div id="main" class="site-main"> 25 Ajoutée <main id="main" class="site-main"> 26 26 27 27 <header class="woocommerce-products-header"> 28 28 <h1 class="woocommerce-products-header__title page-title"><?php woocommerce_page_title(); ?></h1> 46 46 <?php do_action( 'woocommerce_no_products_found' ); ?> 47 47 <?php endif; ?> 48 48 49 Supprimée </div><!-- #main --> 49 Ajoutée </main><!-- #main --> 50 50 </div><!-- #primary --> 51 51 52 52 <?php // The sidebar div gets role="complementary" but no label (VALIDISCAN-SEED landmark-unique on pages with two). ?> 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 18 18 19 19 <div id="primary" class="content-area"> 20 20 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: the content wrapper is a <div>, not <main>. ?> 21 Supprimée <div id="main" class="site-main"> 21 Ajoutée <main id="main" class="site-main"> 22 22 23 23 <?php get_template_part( 'template-parts/hero-slider' ); ?> 24 24 62 62 ?> 63 63 </section> 64 64 65 Supprimée </div><!-- #main --> 65 Ajoutée </main><!-- #main --> 66 66 </div><!-- #primary --> 67 67 68 68 <?php functions.php Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 4)
Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 4) Ligne avant Ligne après Modification Code 32 32 * Storefront pieces the child theme does not use. 33 33 */ 34 34 function kb_remove_storefront_parts() { 35 Supprimée // VALIDISCAN-SEED vs-headings-landmarks: Storefront's "Skip to navigation / Skip to content" 36 Supprimée // links are removed because "they flash on the first Tab"; nothing replaces them. 37 Supprimée remove_action( 'storefront_before_header', 'storefront_skip_links', 0 ); 38 35 remove_action( 'storefront_footer', 'storefront_handheld_footer_bar', 999 ); 39 36 remove_action( 'storefront_header', 'storefront_product_search', 40 ); 40 37 } 212 209 $defaults['delimiter'] = '<span class="breadcrumb-separator"> / </span>'; 213 210 // VALIDISCAN-SEED landmark-unique + vs-headings-landmarks: the breadcrumb <nav> has no aria-label, 214 211 // like the primary and the footer navigation. 215 Supprimée $defaults['wrap_before'] = '<div class="storefront-breadcrumb"><div class="col-full"><nav class="woocommerce-breadcrumb">'; 212 Ajoutée $defaults['wrap_before'] = '<div class="storefront-breadcrumb"><div class="col-full"><nav class="woocommerce-breadcrumb" aria-label="' . esc_attr__( 'Breadcrumb', 'kestrel-birch' ) . '">'; 216 213 $defaults['wrap_after'] = '</nav></div></div>'; 217 214 return $defaults; 218 215 } header-checkout.php Modifications apportées à header-checkout.php (lignes ajoutées : 1, lignes supprimées : 0)
Modifications apportées à header-checkout.php (lignes ajoutées : 1, lignes supprimées : 0) Ligne avant Ligne après Modification Code 18 18 19 19 <body <?php body_class(); ?>> 20 20 <?php wp_body_open(); ?> 21 Ajoutée <a class="skip-link screen-reader-text" href="#content"><?php esc_html_e( 'Skip to content', 'kestrel-birch' ); ?></a> 21 22 22 23 <div id="page" class="hfeed site"> 23 24 <header id="masthead" class="site-header kb-checkout-header" role="banner"> 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 74 74 <div class="storefront-primary-navigation"> 75 75 <div class="col-full"> 76 76 <?php // VALIDISCAN-SEED landmark-unique + vs-headings-landmarks: the primary <nav> has no aria-label. ?> 77 Supprimée <nav id="site-navigation" class="main-navigation"> 77 Ajoutée <nav id="site-navigation" class="main-navigation" aria-label="<?php esc_attr_e( 'Primary navigation', 'kestrel-birch' ); ?>"> 78 78 <?php 79 79 wp_nav_menu( 80 80 array( page-contact.php Modifications apportées à page-contact.php (lignes ajoutées : 2, lignes supprimées : 2)
Modifications apportées à page-contact.php (lignes ajoutées : 2, lignes supprimées : 2) Ligne avant Ligne après Modification Code 24 24 25 25 <div id="primary" class="content-area"> 26 26 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 27 Supprimée <div id="main" class="site-main"> 27 Ajoutée <main id="main" class="site-main"> 28 28 <article id="post-<?php the_ID(); ?>" <?php post_class(); ?>> 29 29 <header class="entry-header"><?php the_title( '<h1 class="entry-title">', '</h1>' ); ?></header> 30 30 <div class="entry-content"> 85 85 </div> 86 86 </div> 87 87 </article> 88 Supprimée </div><!-- #main --> 88 Ajoutée </main><!-- #main --> 89 89 </div><!-- #primary --> 90 90 91 91 <?php page.php Modifications apportées à page.php (lignes ajoutées : 2, lignes supprimées : 2)
Modifications apportées à page.php (lignes ajoutées : 2, lignes supprimées : 2) Ligne avant Ligne après Modification Code 13 13 14 14 <div id="primary" class="content-area"> 15 15 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 16 Supprimée <div id="main" class="site-main"> 16 Ajoutée <main id="main" class="site-main"> 17 17 18 18 <?php 19 19 while ( have_posts() ) : 35 35 endwhile; 36 36 ?> 37 37 38 Supprimée </div><!-- #main --> 38 Ajoutée </main><!-- #main --> 39 39 </div><!-- #primary --> 40 40 41 41 <?php search.php Modifications apportées à search.php (lignes ajoutées : 2, lignes supprimées : 2)
Modifications apportées à search.php (lignes ajoutées : 2, lignes supprimées : 2) Ligne avant Ligne après Modification Code 11 11 12 12 <div id="primary" class="content-area"> 13 13 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 14 Supprimée <div id="main" class="site-main"> 14 Ajoutée <main id="main" class="site-main"> 15 15 <header class="woocommerce-products-header"> 16 16 <h1 class="woocommerce-products-header__title page-title"> 17 17 <?php 36 36 <?php else : ?> 37 37 <?php wc_no_products_found(); ?> 38 38 <?php endif; ?> 39 Supprimée </div><!-- #main --> 39 Ajoutée </main><!-- #main --> 40 40 </div><!-- #primary --> 41 41 42 42 <?php single-product.php Modifications apportées à single-product.php (lignes ajoutées : 2, lignes supprimées : 2)
Modifications apportées à single-product.php (lignes ajoutées : 2, lignes supprimées : 2) Ligne avant Ligne après Modification Code 13 13 14 14 <div id="primary" class="content-area"> 15 15 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 16 Supprimée <div id="main" class="site-main"> 16 Ajoutée <main id="main" class="site-main"> 17 17 <?php 18 18 while ( have_posts() ) : 19 19 the_post(); 20 20 wc_get_template_part( 'content', 'single-product' ); 21 21 endwhile; 22 22 ?> 23 Supprimée </div><!-- #main --> 23 Ajoutée </main><!-- #main --> 24 24 </div><!-- #primary --> 25 25 26 26 <?php -
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 dansfunctions.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-titleAUTO
-
- 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-orderAUTO contrôle assuré par vs-headings-landmarks -
page-has-heading-oneAUTO contrôle assuré par vs-headings-landmarks -
vs-headings-landmarksAUTO
-
- 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,primaryoulink, 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. Unoutline: noneau 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-visibleAUTO
-
- 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
tabindexsupé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
tabindexsupé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. Untabindexque du code PHP produit ou qu’un script définit est laissé à une personne.- Règles couvertes
-
-
tabindexAUTO -
vs-focus-orderMANUAL
-
- 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…', '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…', '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">
Zoom, cibles tactiles et contraste
-
Zoom autorisé sur téléphone meta-viewport-zoom La balise viewport perd
user-scalable=noet unmaximum-scaleinfé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=noet toutmaximum-scaleinfé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 strictemeta-viewport-larged’axe-core, toutmaximum-scaleinfé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-viewportAUTO -
meta-viewport-largeAUTO
-
- 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-sizeAUTO
-
- 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-contrastASSISTED
-
- 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-motionAUTO
-
- 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-carouselAUTO
-
- 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 -
Ni texte clignotant ni texte défilant remove-blink-marquee Les éléments
<blink>et<marquee>des templates du thème deviennent des éléments statiques, avec le même contenu, les mêmes classes et les mêmes id, de sorte qu’aucun texte ne bouge tout seul.Les éléments
<blink>et<marquee>des templates du thème, et des chaînes PHP qui les produisent, deviennent des éléments statiques, avec le même contenu, les mêmes classes et les mêmes id : un<span>pour blink, un<div>pour marquee, ou un<span>lorsque le marquee se trouve dans un paragraphe. Les réglages de défilement du marquee sont retirés, de sorte qu’aucun texte ne bouge tout seul. Un élément que le code ouvre et ferme à des endroits différents est laissé à une personne.- Règles couvertes
-
-
blinkAUTO -
marqueeAUTO
-
- Types de fichiers modifiés
-
.php
makes a marquee and a blink added to the fixture theme static Données d’exemple footer.php Modifications apportées à footer.php (lignes ajoutées : 1, lignes supprimées : 1)
Modifications apportées à footer.php (lignes ajoutées : 1, lignes supprimées : 1) Ligne avant Ligne après Modification Code 31 31 <?php endfor; ?> 32 32 </div> 33 33 34 Supprimée <marquee class="kb-ticker" behavior="scroll" scrollamount="3"><?php esc_html_e( 'Free returns within 30 days', 'kestrel-birch' ); ?></marquee> 34 Ajoutée <div class="kb-ticker"><?php esc_html_e( 'Free returns within 30 days', 'kestrel-birch' ); ?></div> 35 35 <div class="site-info"> 36 36 <?php // VALIDISCAN-SEED color-contrast: .site-info and the footer copy are #888 on #f4f1ec (3.1:1), see main.css. ?> 37 37 <p> functions.php Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 1)
Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 1) Ligne avant Ligne après Modification Code 223 223 */ 224 224 function kb_single_product_usp() { 225 225 // VALIDISCAN-SEED vs-reflow: .kb-usp is white-space: nowrap in assets/css/woocommerce.css. 226 Supprimée echo '<p class="kb-usp"><blink class="kb-new">' . esc_html__( 'New', 'kestrel-birch' ) . '</blink> ' . esc_html__( 'Same-day dispatch · Free returns · Climate-neutral delivery', 'kestrel-birch' ) . '</p>'; 226 Ajoutée echo '<p class="kb-usp"><span class="kb-new">' . esc_html__( 'New', 'kestrel-birch' ) . '</span> ' . esc_html__( 'Same-day dispatch · Free returns · Climate-neutral delivery', 'kestrel-birch' ) . '</p>'; 227 227 } 228 228 add_action( 'woocommerce_single_product_summary', 'kb_single_product_usp', 31 ); 229 229 turns blink and marquee into static elements in templates and PHP strings Données d’exemple functions.php Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 1)
Modifications apportées à functions.php (lignes ajoutées : 1, lignes supprimées : 1) Ligne avant Ligne après Modification Code 11 11 add_action( 'after_setup_theme', 'minimal_setup' ); 12 12 13 13 function minimal_sale() { 14 Supprimée echo '<p><blink class="sale">' . esc_html__( 'Sale', 'minimal' ) . '</blink></p>'; 14 Ajoutée echo '<p><span class="sale">' . esc_html__( 'Sale', 'minimal' ) . '</span></p>'; 15 15 } template-parts/notice.php Modifications apportées à template-parts/notice.php (lignes ajoutées : 3, lignes supprimées : 3)
Modifications apportées à template-parts/notice.php (lignes ajoutées : 3, lignes supprimées : 3) Ligne avant Ligne après Modification Code 1 1 <div class="notice"> 2 Supprimée <marquee class="notice__ticker" behavior="scroll" direction="left" scrollamount="4"> 2 Ajoutée <div class="notice__ticker"> 3 3 <?php esc_html_e( 'Free shipping this week', 'minimal' ); ?> 4 Supprimée </marquee> 5 Supprimée <blink><?php esc_html_e( 'New!', 'minimal' ); ?></blink> 4 Ajoutée </div> 5 Ajoutée <span><?php esc_html_e( 'New!', 'minimal' ); ?></span> 6 6 </div> -
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
mutedetplaysinline: 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édiasvs-mediade Validiscan, qui remplace la règle d’axe-core que cette recette couvre ;vs-mediaest 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-audioAUTO 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
forouaria-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 unforqui pointe vers le champ, ou bien un élément de texte désigné comme étiquette est relié pararia-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
-
-
labelAUTO contrôle assuré par vs-forms-ecommerce -
select-nameASSISTED -
vs-forms-ecommerceAUTO
-
- 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
autocompletecorrespondante lorsque le code montre leur fonction ; pour les champs de facturation et de livraison de WooCommerce, un filtre dansfunctions.phpla 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
autocompletequi 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,offou 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 dansfunctions.phpdé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-validAUTO contrôle assuré par vs-forms-ecommerce -
vs-forms-ecommerceAUTO
-
- 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' ); ?> <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' ); ?> <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-updatesAUTO
-
- 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-labellorsque 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-nameASSISTED -
link-nameASSISTED
-
- 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…', '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' ); ?> <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
altvide ouaria-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 alorsalt="", et une icône SVG reçoitaria-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-altASSISTED -
role-img-altASSISTED -
svg-img-altASSISTED
-
- 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
mapouvideodans 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-titleAUTO
-
- 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-refreshL’actualisation différée de moins de 20 heures ne doit pas être utilisée -
nested-interactiveLes éléments interactifs ne doivent pas être imbriqués -
scrollable-region-focusableLes zones défilantes doivent être accessibles au clavier -
server-side-image-mapLes images réactives côté serveur ne doivent pas être utilisées -
vs-keyboard-trapLe focus clavier ne doit jamais rester piégé -
vs-focus-orderL’ordre de tabulation doit suivre l’ordre visuel -
vs-draggingLes éléments à faire glisser doivent offrir une alternative à pointeur unique -
vs-mediaLes vidéos ont besoin de sous-titres, l’audio d’une transcription, et rien ne doit démarrer automatiquement avec le son -
vs-documentsLes 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.
- 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.
- 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.
- 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.
- 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.
- Les traductions du nouveau texte anglais, si votre boutique est dans une autre langue.
- 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
- Template structure & Overriding templates via a theme · WooCommerce · vérifiée le
- language_attributes() · WordPress.org · vérifiée le
- Localization (Common APIs Handbook) · WordPress.org · vérifiée le
- 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 gratuiteOu é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