Korrekturen zur Barrierefreiheit im Code Ihres Themes für WooCommerce

Validiscan behebt Fehler der Barrierefreiheit in Ihrem WordPress-Theme oder Child-Theme: in seinen PHP-Templates, auch in den WooCommerce-Templates, die es überschreibt, sowie in seinen Stylesheets und Skripten. Nichts gelangt in Ihren Live-Shop, bevor Sie oder Ihr Entwicklungsteam die Änderungen zusammenführen oder einspielen und das Theme live stellen.

Zuletzt aktualisiert:

Was ändert Validiscan in einem WooCommerce-Theme?

Validiscan ändert die eigenen Dateien Ihres Themes und sonst nichts: PHP-Templates, einschließlich der WooCommerce-Templates, die es überschreibt, functions.php, Stylesheets und Skripte. Eine Änderung an anderen Dateitypen als PHP, CSS, SCSS, JavaScript, HTML und JSON besteht die Prüfungen von Validiscan nicht, und keine Korrektur fügt ein Plugin oder ein Overlay hinzu.

Die Rezepte sind für klassische WordPress-Themes aus PHP-Templates geschrieben, nicht für Block-Themes, deren Templates HTML-Dateien sind. Bei einem Block-Theme bleibt ein Fehler, den kein Rezept behebt, einem Menschen überlassen, und ein im Website-Editor geändertes Template wird in der Datenbank der Website gespeichert, sodass eine Änderung an den Dateien des Themes es nicht erreicht (Theme Handbook von WordPress zu Templates). Die Rezepte ändern Markup nur dort, wo die Theme-Dateien, die Validiscan erhält, es ausgeben. Markup, das andere Dateien ausgeben, etwa die von WordPress, WooCommerce, einem anderen Plugin oder einem Parent-Theme, das nicht Teil dieses Quellcodes ist, bleibt einem Menschen überlassen; ein Cookie-Banner, den ein Consent-Plugin hinzufügt, ist ein Beispiel dafür. Eine Ausnahme sind die eigenen Felder von WooCommerce für die Rechnungs- und die Versandadresse: Ein Filter in der functions.php Ihres Themes setzt ihre autocomplete-Werte (siehe das Rezept weiter unten).

Details: welche Dateien eine Änderung berühren darf, die Prüfungen jeder Änderung und was eine Korrektur hinzufügen darf

Validiscan ändert die eigenen Dateien Ihres Themes und sonst nichts: die PHP-Templates, einschließlich der WooCommerce-Templates, die Ihr Theme in seinem Ordner woocommerce überschreibt (Dokumentation von WooCommerce zum Überschreiben von Templates), die functions.php sowie die Stylesheets und Skripte des Themes. Eine Änderung darf nur PHP-, CSS-, SCSS-, JavaScript-, HTML- und JSON-Dateien berühren und nie eine Datei in einem Ordner vendor, node_modules, wp-admin oder wp-includes auf der obersten Ebene. Eine Änderung an jeder anderen Datei besteht die Prüfungen von Validiscan nicht und kann nicht freigegeben werden. Jede geänderte PHP-Datei durchläuft außerdem die eigene Syntaxprüfung von PHP (php -l), die die Datei liest, ohne sie auszuführen. Die Rezepte bearbeiten nie eine minimierte .min.css- oder .min.js-Datei, denn sie ist Build-Ausgabe.

Jede Änderung ist eine gewöhnliche Bearbeitung einer Theme-Datei, die Ihr Entwicklungsteam Zeile für Zeile lesen kann. Einige Korrekturen fügen dem eigenen Skript des Themes ein paar Zeilen hinzu, zum Beispiel um eine Pause-Schaltfläche mit einer Slideshow zu verbinden oder eine Änderung im Warenkorb anzusagen. Keine Korrektur fügt ein Plugin oder ein Overlay hinzu, und es wird nichts eingeschleust, das Ihre Seiten im Browser der Besucherinnen und Besucher korrigiert. Eingebundene Dienste von Drittanbietern wie Zahlungs- oder Chat-Widgets sind in einem Projekt nicht enthalten.

Wie erhält Validiscan Zugriff auf Ihr WooCommerce-Theme?

Validiscan erreicht Ihr WooCommerce-Theme auf einem von zwei Wegen: über das GitHub-Repository, in dem es liegt, oder aus einem ZIP des Theme-Ordners, das Sie hochladen. Welcher Weg passt, hängt davon ab, wo der Code Ihres Themes liegt; er bestimmt auch, wie die Änderungen zu Ihnen zurückkommen.

Die zwei Wege in ein WooCommerce-Theme
Weg Was Sie geben Die Änderungen kommen zurück als
Über Ihr GitHub-Repository Zugriff auf das Repository, in dem Ihr Theme oder Child-Theme liegt, über die GitHub App von Validiscan oder ein Zugriffstoken Ein Pull Request
Aus einem ZIP Ihres Theme-Ordners Ihren Theme-Ordner unter wp-content/themes, einschließlich des Child-Themes, falls Sie eines verwenden, als eine ZIP-Datei von bis zu 100 MB, im Kundenportal hochgeladen von einem Admin Ihrer Organisation Ein Patch-Paket

Über Ihr GitHub-Repository

Liegt Ihr Theme oder Child-Theme in einem GitHub-Repository, geben Sie Validiscan Zugriff auf dieses Repository. Sie installieren die GitHub App von Validiscan darauf oder geben Validiscan ein Zugriffstoken, das Validiscan verschlüsselt speichert. Die App verlangt Lese- und Schreibzugriff auf die Inhalte und die Pull Requests des Repositorys sowie Lesezugriff auf seine Metadaten. Die Rezepte erwarten die style.css und die functions.php des Themes auf der obersten Ebene des Repositorys; das Repository sollte also den Theme-Ordner selbst enthalten, nicht eine ganze WordPress-Installation. Die Änderungen kommen dann als Pull Request.

Aus einem ZIP Ihres Theme-Ordners

Liegt Ihr Theme nicht in einem Repository, bittet das Kundenportal Sie, Ihr Entwicklungsteam ein ZIP Ihres Theme-Ordners unter wp-content/themes erstellen zu lassen, einschließlich des Child-Themes, falls Sie eines verwenden. Ein Admin Ihrer Organisation lädt es anschließend im Kundenportal hoch, als eine einzige ZIP-Datei von bis zu 100 MB. Validiscan bereitet die Änderungen auf dieser Kopie Ihres Themes vor und schickt das Ergebnis Ihrem Entwicklungsteam als Patch-Paket. Wohin Korrekturen in einem WooCommerce-Theme gehören und was ein Theme-Update rückgängig machen kann

Wie gelangen die Änderungen in Ihren Shop?

Validiscan liefert nur Änderungen aus, die es geprüft und freigegeben hat, als Pull Request oder als Patch-Paket, und keines von beiden berührt Ihren Live-Shop auf WooCommerce. Die Änderungen einzuspielen und live zu stellen, bleibt bei Ihnen oder Ihrem Entwicklungsteam; die Auslieferung als unveröffentlichte Kopie des Themes gibt es nur auf Shopify.

Von der Auslieferung bis in Ihren Live-Shop, in fünf Schritten
  1. Validiscan liefert die Änderungen aus, die es geprüft und freigegeben hat: einen Pull Request auf einem neuen Branch oder ein Patch-Paket für Ihr Entwicklungsteam.
  2. Ihr Entwicklungsteam oder Ihre Agentur prüft die Änderungen. Bei einem Pull Request bittet die Checkliste um eine Staging- oder Vorschau-Umgebung, nicht den Live-Shop, und darum, die geänderten Elemente allein mit der Tastatur zu bedienen.
  3. Sie oder Ihr Entwicklungsteam führen den Pull Request zusammen oder spielen das Patch-Paket ein und testen die Änderungen.
  4. Sie oder Ihr Entwicklungsteam stellen das Theme live.
  5. Sobald die Änderungen live sind, prüft ein Verifizierungsscan die betroffenen Seiten erneut.

Ein Pull Request

Mit Zugriff auf Ihr Repository legt Validiscan einen neuen Branch mit dem Namen validiscan/a11y-<date>-<id> an, committet jede Korrektur einzeln und öffnet einen Pull Request mit einer Übersichtstabelle, einer Erklärung jeder Änderung und einer Checkliste für die Prüfung. In Ihren Standard-Branch wird nichts übertragen. Die Checkliste bittet Ihr Entwicklungsteam, den Branch in einer Staging- oder Vorschau-Umgebung bereitzustellen, nicht im Live-Shop, und die geänderten Elemente allein mit der Tastatur zu bedienen. Das Zusammenführen und Bereitstellen bleibt bei Ihnen.

Ein Patch-Paket

Aus einem hochgeladenen Theme-Ordner bereitet Validiscan ein ZIP-Archiv für Ihr Entwicklungsteam vor. Es enthält die PATCH.md mit jeder Änderung und der Anleitung, wie sie eingespielt wird, alle Änderungen in einer Patch-Datei, die sich mit git apply einspielen lässt, eine Patch-Datei je Korrektur, die vollständigen geänderten Dateien und eine README.md. Ihr Entwicklungsteam spielt die Änderungen ein, testet sie und stellt das Theme live. Was ein Pull Request und ein Patch-Paket enthalten

Wird neuer Text in der Sprache Ihres Shops hinzugefügt?

Nur auf Englisch. Die Rezepte von Validiscan für WooCommerce fügen neuen Text als übersetzbaren String in der Text-Domain Ihres Themes hinzu, aber keine Übersetzungen. Ist Ihr Shop auf Deutsch oder in einer anderen Sprache, ist das Übersetzen des neuen Texts ein Schritt für Ihr Entwicklungsteam.

Den neuen Text übersetzen, in drei Schritten
  1. Die .pot-Datei des Themes neu erzeugen
  2. Die Übersetzungen in die .po-Dateien eintragen
  3. Die .mo-Dateien kompilieren, die WordPress liest
Details: welchen Text die Rezepte hinzufügen und wie WordPress Übersetzungen liest

Die Rezepte von Validiscan für WooCommerce fügen neuen Text nur auf Englisch hinzu. Fügt ein Rezept Text für Besucherinnen und Besucher hinzu, etwa die Worte eines Skip-Links, die Beschriftung einer Pause-Schaltfläche oder den Namen einer Icon-Schaltfläche, fügt es den Text als übersetzbaren String in der Text-Domain Ihres Themes hinzu, aber keine Übersetzungen. Auf Shopify, Shopware und Magento können die Rezepte auch deutschen Text hinzufügen; auf WooCommerce tun sie das nicht.

Ist Ihr Shop auf Deutsch oder in einer anderen Sprache, ist das Übersetzen des neuen Texts ein Schritt für Ihr Entwicklungsteam: die .pot-Datei des Themes neu erzeugen, die Übersetzungen in die .po-Dateien eintragen und die .mo-Dateien kompilieren, die WordPress liest, wie die Dokumentation von WordPress zur Lokalisierung es beschreibt. Die Rezepte unten sagen, wo sie Text hinzufügen.

Was ändern die Rezepte in einem WooCommerce-Theme?

Jedes der 20 Rezepte von Validiscan für WooCommerce-Themes ist eine deterministische Änderung für eine Art von Fehler: Derselbe Code erhält immer dieselbe Änderung. Ein Rezept ändert nur dort etwas, wo der Code des Themes zeigt, welche Änderung die richtige ist; sonst bleibt der Befund einem Menschen überlassen.

Seitenstruktur und Navigation

  • Seitensprache aus Ihren WordPress-Einstellungen html-lang Ein Header-Template, dessen <html>-Element die Sprache auslässt oder einen ungültigen festen lang-Wert hat, erhält language_attributes() von WordPress, das die Sprache der Website ausgibt.

    Das Rezept sorgt dafür, dass das <html>-Element Ihrer Header-Templates seine Sprache aus language_attributes() von WordPress übernimmt, das die Sprache der Website ausgibt oder die Sprache, die ein Plugin für Mehrsprachigkeit setzt, sodass Screenreader die Seite richtig aussprechen. Einem Header-Template, das die Sprache auslässt, wird der Aufruf hinzugefügt, und ein fest eingetragener lang-Wert, der nicht gültig ist, wird durch ihn ersetzt. Kommt der falsche Wert aus der Einstellung für die Sprache der Website in Ihrem WordPress-Adminbereich, ändert das Rezept nichts, weil das eine Einstellung ist und kein Theme-Code. Liest das Theme bereits ein Sprachfeld für jede Seite, etwa für deutsche Rechtstexte in einem englischen Shop, deklariert ein Filter in der functions.php die Sprache dieser Seite, und Kopf- und Fußbereich der Website behalten die Sprache des Shops. Ohne ein solches Feld rät das Rezept die Sprache nicht.

    Abgedeckte Regeln
    • html-has-lang AUTO geprüft durch vs-lang
    • html-lang-valid AUTO geprüft durch vs-lang
    • vs-lang AUTO
    Geänderte Dateitypen
    .php
    adds language_attributes() to the checkout header of the fixture theme Beispieldaten

    header-checkout.php Änderungen an header-checkout.php: 1 hinzugefügt, 1 entfernt

    Änderungen an header-checkout.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <html>
    11 Hinzugefügt <html <?php language_attributes(); ?>>
    12 12 <head>
    13 13 <meta charset="<?php bloginfo( 'charset' ); ?>">
    14 14 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled. ?>
  • Ein Titel auf jeder Seite document-title-template Was im Theme verhindert, dass der von WordPress erzeugte Seitentitel erscheint, wird behoben; ein Titel aus einem SEO-Plugin oder aus den eigenen Einstellungen einer Seite bleibt, wie er ist.

    WordPress erzeugt den Seitentitel selbst, aus dem Namen der Seite oder des Produkts, der Seitenzahl einer Liste mit mehreren Seiten und dem Namen des Shops. Das Rezept behebt, was im Theme verhindert, dass dieser Titel erscheint. Ein Titel-Filter, der einen eigenen Titel zurückgibt, etwa aus einem SEO-Feld, greift auf den erzeugten Titel zurück, wenn das Feld leer ist. Ein fester <title>-Text in einem Header-Template wird durch den Titel ersetzt, den WordPress erzeugt. Bei einem Theme, das kein Child-Theme ist und überhaupt keinen Titel ausgibt, wird die Titelunterstützung von WordPress in der functions.php eingeschaltet. Stammt der Titel aus einem SEO-Plugin oder aus den eigenen Einstellungen einer Seite, ändert das Rezept nichts.

    Abgedeckte Regeln
    • document-title AUTO
    Geänderte Dateitypen
    .php
    lets the empty custom SEO title fall back to the generated title Beispieldaten

    functions.php Änderungen an functions.php: 2 hinzugefügt, 1 entfernt

    Änderungen an functions.php: 2 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt return (string) get_post_meta( get_the_ID(), '_kb_seo_title', true );
    90 Hinzugefügt $custom_title = trim( (string) get_post_meta( get_the_ID(), '_kb_seo_title', true ) );
    91 Hinzugefügt return '' !== $custom_title ? $custom_title : $title;
    91 92 }
    92 93 return $title;
    93 94 }
  • Überschriften ohne übersprungene Ebenen heading-levels Eine Überschrift, die eine Ebene überspringt, erhält die nächste Ebene unterhalb der vorangehenden Überschrift und behält ihre Klassen, außer die Styles oder Skripte des Themes sprechen sie über ihre Ebene an.

    Eine Überschrift, die eine Ebene überspringt, etwa ein h4 direkt nach einem h2, erhält die nächste Ebene unterhalb der vorangehenden Überschrift, im Template oder in dem PHP-String, der sie ausgibt. Widget-Titel und Überschriften im Footer oder in einer Sidebar werden zu h2. Stammt der Sprung aus einem WooCommerce-Template, das direkt nach dem Seitentitel angezeigt wird, etwa aus den Überschriften für die Rechnungs- und die Versanddetails im Checkout, rücken die Überschriften derselben Ebene in den benachbarten Templates mit. Nur die Ebene ändert sich: Jede Überschrift behält ihre Klassen, und eine Überschrift, die die Styles oder Skripte des Themes über ihre Ebene ansprechen, bleibt unverändert. Eine Überschrift ohne Klasse übernimmt das Aussehen des Themes für ihre neue Ebene. Auf einer Seite ohne Hauptüberschrift wird das Element, das schon wie ihr Titel aussieht, mit einer Titelklasse, die auf mindestens 24 Pixel gesetzt ist, zum h1 gemacht. Hat eine Seite kein solches Element, fügt das Rezept keine Überschrift hinzu und überlässt es einem Menschen.

    Abgedeckte Regeln
    • heading-order AUTO geprüft durch vs-headings-landmarks
    • page-has-heading-one AUTO geprüft durch vs-headings-landmarks
    • vs-headings-landmarks AUTO
    Geänderte Dateitypen
    .php
    gives the home page its <h1> and fixes the teaser and widget title levels Beispieldaten

    front-page.php Änderungen an front-page.php: 2 hinzugefügt, 2 entfernt

    Änderungen an front-page.php: 2 hinzugefügt, 2 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <p class="kb-intro__title"><?php esc_html_e( 'Woollen outdoor clothing, made to last', 'kestrel-birch' ); ?></p>
    27 Hinzugefügt <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 Entfernt <h4 class="kb-teaser__title"><?php echo esc_html( get_the_title( $kb_post ) ); ?></h4>
    47 Hinzugefügt <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 Änderungen an functions.php: 2 hinzugefügt, 2 entfernt

    Änderungen an functions.php: 2 hinzugefügt, 2 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt 'before_title' => '<h4 class="widget-title">',
    57 Entfernt 'after_title' => '</h4>',
    56 Hinzugefügt 'before_title' => '<h2 class="widget-title">',
    57 Hinzugefügt 'after_title' => '</h2>',
    58 58 )
    59 59 );
    60 60 }
    moves the checkout section headings from h3 to h2, as in the fixed checkout Beispieldaten

    woocommerce/checkout/form-billing.php Änderungen an woocommerce/checkout/form-billing.php: 1 hinzugefügt, 1 entfernt

    Änderungen an woocommerce/checkout/form-billing.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    15 15 defined( 'ABSPATH' ) || exit;
    16 16 ?>
    17 17 <div class="woocommerce-billing-fields">
    18 Entfernt <h3><?php esc_html_e( 'Billing details', 'woocommerce' ); ?></h3>
    18 Hinzugefügt <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 Änderungen an woocommerce/checkout/form-checkout.php: 1 hinzugefügt, 1 entfernt

    Änderungen an woocommerce/checkout/form-checkout.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    26 26 </div>
    27 27 </div>
    28 28
    29 Entfernt <h3 id="order_review_heading"><?php esc_html_e( 'Your order', 'woocommerce' ); ?></h3>
    29 Hinzugefügt <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 Änderungen an woocommerce/checkout/form-shipping.php: 2 hinzugefügt, 2 entfernt

    Änderungen an woocommerce/checkout/form-shipping.php: 2 hinzugefügt, 2 entfernt
    Zeile vorher Zeile nachher Änderung Code
    16 16 defined( 'ABSPATH' ) || exit;
    17 17 ?>
    18 18 <div class="woocommerce-shipping-fields">
    19 Entfernt <h3><?php esc_html_e( 'Shipping details', 'kestrel-birch' ); ?></h3>
    19 Hinzugefügt <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 Entfernt <h3><?php esc_html_e( 'Additional information', 'woocommerce' ); ?></h3>
    32 Hinzugefügt <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 ) {

Tastaturbedienung und Fokus

  • Ein sichtbarer Fokusrahmen focus-visible-styles Ein Fokusrahmen für die Tastaturbedienung in einer Farbe des Themes oder einer Abstufung davon, mit einem Kontrast von mindestens 3:1 gegenüber dem Seitenhintergrund.

    Das Haupt-Stylesheet des Themes erhält einen Fokusrahmen für die Tastaturbedienung: 2 Pixel breit, durchgezogen und 2 Pixel vom Element entfernt, in einer Farbe, die das Theme schon verwendet. Das ist eine Farbvariable, deren Name focus, accent, brand, primary oder link enthält, sonst die Farbe von Links oder des Fließtexts. Die erste davon mit einem Kontrast von mindestens 3:1 gegenüber dem Seitenhintergrund wird verwendet; hat keine ihn, wird die erste im selben Farbton heller oder dunkler gemacht, bis sie ihn hat. Auf dunklen Flächen mit hellem Text, etwa einer dunklen Kopfleiste, übernimmt der Fokusrahmen die helle Textfarbe. Ein outline: none beim Fokussieren, das nichts an seine Stelle setzt, wird aus den Regeln des Themes entfernt; Regeln, die den Fokusrahmen nur bei Mausklicks ausblenden, bleiben. Ein Theme, das schon einen sichtbaren Fokusrahmen hat und keine Regel, die ihn ausblendet, bleibt unverändert.

    Abgedeckte Regeln
    • vs-focus-visible AUTO
    Geänderte Dateitypen
    .css
    replaces the outline reset of the fixture theme with a brand-coloured outline Beispieldaten

    assets/css/main.css Änderungen an assets/css/main.css: 9 hinzugefügt, 3 entfernt

    Änderungen an assets/css/main.css: 9 hinzugefügt, 3 entfernt
    Zeile vorher Zeile nachher Änderung Code
    137 137 box-shadow: 0 0 0 2px var(--kb-ink);
    138 138 }
    139 139
    140 Entfernt /* VALIDISCAN-SEED vs-focus-visible: "remove the ugly focus ring" - nothing replaces it. */
    141 Entfernt :focus {
    142 Entfernt outline: none !important;
    140 Hinzugefügt /* validiscan:focus-visible-styles */
    141 Hinzugefügt :focus-visible {
    142 Hinzugefügt outline: 2px solid var(--kb-focus);
    143 Hinzugefügt outline-offset: 2px;
    143 144 }
    144 145
    146 Hinzugefügt .kb-topbar :focus-visible {
    147 Hinzugefügt outline-color: #fff;
    148 Hinzugefügt }
    149 Hinzugefügt /* /validiscan:focus-visible-styles */
    150 Hinzugefügt
    145 151 /* Buttons ------------------------------------------------------------------ */
    146 152
    147 153 .button,
  • Eine Tab-Reihenfolge, die der Seite folgt remove-positive-tabindex Ein tabindex größer als 0 am Tag im Template, das das gemeldete Element ausgibt, wird entfernt oder auf 0 gesetzt; einer, den PHP-Code ausgibt oder ein Skript setzt, bleibt einem Menschen überlassen.

    Ein tabindex größer als 0 zieht ein Element an den Anfang der Tastaturreihenfolge. Das Rezept entfernt ihn bei Links, Schaltflächen und Formularfeldern, die ohnehin den Fokus erhalten können, und setzt ihn bei anderen Elementen auf 0, sodass sie erreichbar bleiben, während die Tab-Taste der Reihenfolge der Seite folgt. Geändert wird nur das Tag im Template, das das gemeldete Element ausgibt. Ein tabindex, den PHP-Code ausgibt oder ein Skript setzt, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • tabindex AUTO
    • vs-focus-order MANUAL
    Geänderte Dateitypen
    .php
    removes tabindex="1" from the header search field of the fixture theme Beispieldaten

    header.php Änderungen an header.php: 1 hinzugefügt, 1 entfernt

    Änderungen an header.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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">
  • Bedienelemente nur für die Maus, als Schaltflächen umgesetzt button-semantics In einem Cookie-Banner oder einer Slideshow Ihres Themes werden anklickbare Elemente, die nur mit der Maus funktionieren, zu echten Schaltflächen, außer die Styles oder Skripte des Themes sprechen sie über ihren Tag-Namen an.

    In einem Cookie-Banner oder einer Slideshow, die zu Ihrem Theme gehört, werden anklickbare <span>-, <div>-, <li>- oder <i>-Elemente, die nur mit der Maus funktionieren, zu echten <button>-Elementen. Jede Klasse und jedes Attribut bleibt erhalten, sodass die Styles und Skripte des Themes weiter funktionieren, und die Eingabetaste und die Leertaste bewirken nun, was ein Klick bewirkt. Ein kurzes Style-Reset für genau diese Klassen bewahrt ihr Aussehen. Eine Schaltfläche im selben Banner oder in derselben Slideshow, die nur ein Icon zeigt, erhält einen englischen Namen, wie unten bei den Namen für Icons beschrieben. Ein Element, auf das kein Skript reagiert, eines, das die Styles oder Skripte des Themes über seinen Tag-Namen ansprechen, oder ein leeres Element, dessen Zweck unklar ist, bleibt unverändert.

    Abgedeckte Regeln
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Geänderte Dateitypen
    .css.php
    turns the click-only cookie choices into buttons and names the close button Beispieldaten

    assets/css/main.css Änderungen an assets/css/main.css: 17 hinzugefügt, 0 entfernt

    Änderungen an assets/css/main.css: 17 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    766 766 gap: 0.75rem;
    767 767 }
    768 768
    769 Hinzugefügt /* validiscan:button-semantics */
    770 Hinzugefügt /* Controls that became <button>s: keep the look of the elements they replace. The theme
    771 Hinzugefügt rules for these classes follow and still win. */
    769 772 .kb-cookie-bar__settings,
    770 773 .kb-cookie-bar__accept {
    774 Hinzugefügt margin: 0;
    775 Hinzugefügt padding: 0;
    776 Hinzugefügt border: 0;
    777 Hinzugefügt background: none;
    778 Hinzugefügt color: inherit;
    779 Hinzugefügt font: inherit;
    780 Hinzugefügt line-height: inherit;
    781 Hinzugefügt text-align: inherit;
    782 Hinzugefügt cursor: pointer;
    783 Hinzugefügt }
    784 Hinzugefügt /* /validiscan:button-semantics */
    785 Hinzugefügt
    786 Hinzugefügt .kb-cookie-bar__settings,
    787 Hinzugefügt .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 Änderungen an template-parts/cookie-bar.php: 3 hinzugefügt, 3 entfernt

    Änderungen an template-parts/cookie-bar.php: 3 hinzugefügt, 3 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <span class="kb-cookie-bar__settings" data-kb-consent="settings"><?php esc_html_e( 'Cookie settings', 'kestrel-birch' ); ?></span>
    25 Entfernt <span class="kb-cookie-bar__accept" data-kb-consent="accept"><?php esc_html_e( 'Accept', 'kestrel-birch' ); ?></span>
    26 Entfernt <button type="button" class="kb-cookie-bar__close" data-kb-consent="close"><?php kb_icon( 'close' ); ?></button>
    24 Hinzugefügt <button class="kb-cookie-bar__settings" data-kb-consent="settings" type="button"><?php esc_html_e( 'Cookie settings', 'kestrel-birch' ); ?></button>
    25 Hinzugefügt <button class="kb-cookie-bar__accept" data-kb-consent="accept" type="button"><?php esc_html_e( 'Accept', 'kestrel-birch' ); ?></button>
    26 Hinzugefügt <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, Touch-Ziele und Kontrast

  • Zoomen auf dem Smartphone erlaubt meta-viewport-zoom user-scalable=no und ein maximum-scale unter 2 verschwinden aus dem Viewport-Tag, sodass Besucherinnen und Besucher wieder mit zwei Fingern zoomen können, außer PHP berechnet den Inhalt des Tags oder ein Plugin gibt es aus.

    Das Rezept entfernt user-scalable=no und ein maximum-scale unter 2 aus dem Viewport-Tag, in den Header-Templates oder im PHP-Code, der das Tag ausgibt, sodass Besucherinnen und Besucher wieder mit zwei Fingern in Ihren Shop hineinzoomen können. Für die strengere Regel meta-viewport-large von axe-core wird jedes maximum-scale unter 5 entfernt. Die übrigen Viewport-Einstellungen bleiben genau, wie sie waren. Ein Viewport-Tag, dessen Inhalt PHP berechnet, oder eines, das ein Plugin ausgibt, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • meta-viewport AUTO
    • meta-viewport-large AUTO
    Geänderte Dateitypen
    .php
    re-enables zoom in every header template of the fixture theme Beispieldaten

    header-checkout.php Änderungen an header-checkout.php: 1 hinzugefügt, 1 entfernt

    Änderungen an header-checkout.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    12 12 <head>
    13 13 <meta charset="<?php bloginfo( 'charset' ); ?>">
    14 14 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled. ?>
    15 Entfernt <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    15 Hinzugefügt <meta name="viewport" content="width=device-width, initial-scale=1">
    16 16 <?php wp_head(); ?>
    17 17 </head>
    18 18

    header.php Änderungen an header.php: 1 hinzugefügt, 1 entfernt

    Änderungen an header.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    17 Hinzugefügt <meta name="viewport" content="width=device-width, initial-scale=1">
    18 18 <?php wp_head(); ?>
    19 19 </head>
    20 20
  • Größere Touch-Ziele target-size-padding Feste Breiten oder Höhen unter 24 Pixeln an Bedienelementen, die der Scan als zu klein gefunden hat, werden auf 24 Pixel angehoben.

    Bedienelemente, die der Scan kleiner als 24 × 24 Pixel gefunden hat, etwa Social-Media-Icons, Farbmuster oder Mengenschaltflächen, erhalten diese Mindestgröße. Das Rezept findet die Stylesheet-Regeln, die genau diesen Elementen eine feste Breite oder Höhe unter 24 Pixeln geben, und hebt sie auf 24 Pixel an; legt das Element sein Icon mit Flexbox oder Grid aus, wird das Icon zentriert, damit es nicht in einer Ecke sitzt. Ein Bedienelement, dessen Größe aus dem Padding oder aus seinem Inhalt kommt, lässt sich aus den Stylesheets nicht messen und bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • vs-target-size AUTO
    Geänderte Dateitypen
    .css
    raises the social icons, quantity steppers and swatches of the fixture theme to 24 × 24 px Beispieldaten

    assets/css/main.css Änderungen an assets/css/main.css: 4 hinzugefügt, 2 entfernt

    Änderungen an assets/css/main.css: 4 hinzugefügt, 2 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt width: 18px;
    714 Entfernt height: 18px;
    713 Hinzugefügt width: 24px;
    714 Hinzugefügt height: 24px;
    715 715 color: var(--kb-ink);
    716 Hinzugefügt align-items: center;
    717 Hinzugefügt justify-content: center;
    716 718 }
    717 719
    718 720 .site-info {

    assets/css/woocommerce.css Änderungen an assets/css/woocommerce.css: 4 hinzugefügt, 4 entfernt

    Änderungen an assets/css/woocommerce.css: 4 hinzugefügt, 4 entfernt
    Zeile vorher Zeile nachher Änderung Code
    421 421
    422 422 /* VALIDISCAN-SEED vs-target-size: 18 x 18 px colour swatches, 4 px apart. */
    423 423 .kb-swatch {
    424 Entfernt width: 18px;
    425 Entfernt height: 18px;
    424 Hinzugefügt width: 24px;
    425 Hinzugefügt 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 Entfernt width: 18px;
    493 Entfernt height: 18px;
    492 Hinzugefügt width: 24px;
    493 Hinzugefügt height: 24px;
    494 494 padding: 0;
    495 495 border: 1px solid #b9b3aa;
    496 496 border-radius: 2px;
  • Textfarben mit ausreichendem Kontrast contrast-tokens Eine Textfarbe, die die Kontrastprüfung nicht besteht, an einer Stelle definiert ist und nicht auch für Hintergründe, Ränder oder vom Scan nicht gemessene Elemente gilt, wechselt zur nächsten Abstufung desselben Farbtons, die den erforderlichen Kontrast erreicht.

    Besteht Text die Kontrastprüfung nicht und ist seine Farbe an einer Stelle in den Stylesheets des Themes definiert, als CSS-Variable oder als Farbe der Regel, die diesen Text gestaltet, wird diese Farbe auf die nächste hellere oder dunklere Abstufung desselben Farbtons verschoben, die den vom Scan ermittelten erforderlichen Kontrast erreicht, und zwar gegenüber jedem Hintergrund, den er gemessen hat. Eine Farbe, die an mehreren Stellen definiert ist, die auch Elemente verändern würde, deren Kontrast der Scan nicht gemessen hat, oder die das Theme auch für Hintergründe oder Ränder verwendet, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • color-contrast ASSISTED
    Geänderte Dateitypen
    .css
    darkens the footer text colour when every element it styles was measured Beispieldaten

    assets/css/main.css Änderungen an assets/css/main.css: 1 hinzugefügt, 1 entfernt

    Änderungen an assets/css/main.css: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    676 676 .kb-footer-about,
    677 677 .kb-footer-newsletter-intro,
    678 678 .site-info {
    679 Entfernt color: #888;
    679 Hinzugefügt color: #6e6e6e;
    680 680 }
    681 681
    682 682 .site-footer ul.menu {

Bewegung, Slideshows und Ton

  • Weniger Bewegung auf Wunsch der Besucherinnen und Besucher reduced-motion-guard Für Besucherinnen und Besucher, deren Gerät reduzierte Bewegung verlangt, bleiben Animationen in ihrem Endzustand stehen, und ein automatisches Abspielen, das die eigenen Skripte des Themes starten, bleibt aus; Bewegung aus einem Plugin oder einem Inline-Skript wird nicht geändert.

    Ist das Gerät von Besucherinnen und Besuchern auf reduzierte Bewegung eingestellt, lässt ein Block am Ende des Haupt-Stylesheets des Themes jede Animation nur einmal und so kurz ablaufen, dass man sie nicht sieht; sie bleibt dann in ihrem Endzustand stehen. Übergänge erfolgen sofort, und sanftes Scrollen wird abgeschaltet. Starten die eigenen Skripte des Themes das automatische Abspielen einer Slideshow, mit Slick, Swiper, Splide, Owl oder Flickity, startet es nur für Besucherinnen und Besucher, die keine reduzierte Bewegung verlangt haben. Bewegung, die von einem Plugin oder einem Inline-Skript stammt, wird nicht geändert.

    Abgedeckte Regeln
    • vs-motion AUTO
    Geänderte Dateitypen
    .css
    guards the looping hero slide and sale badge animations of the fixture theme Beispieldaten

    assets/css/main.css Änderungen an assets/css/main.css: 13 hinzugefügt, 0 entfernt

    Änderungen an assets/css/main.css: 13 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    794 794 color: #999;
    795 795 cursor: pointer;
    796 796 }
    797 Hinzugefügt
    798 Hinzugefügt /* validiscan:reduced-motion-guard */
    799 Hinzugefügt @media (prefers-reduced-motion: reduce) {
    800 Hinzugefügt *,
    801 Hinzugefügt *::before,
    802 Hinzugefügt *::after {
    803 Hinzugefügt animation-duration: 0.01ms !important;
    804 Hinzugefügt animation-iteration-count: 1 !important;
    805 Hinzugefügt transition-duration: 0.01ms !important;
    806 Hinzugefügt scroll-behavior: auto !important;
    807 Hinzugefügt }
    808 Hinzugefügt }
    809 Hinzugefügt /* /validiscan:reduced-motion-guard */
  • Eine Pause-Schaltfläche für bewegte Slideshows slider-pause-control Eine Slideshow in den Templates Ihres Themes, die sich von selbst bewegt, erhält eine sichtbare Schaltfläche zum Anhalten und Fortsetzen mit englischer Beschriftung, außer ein Plugin oder ein Inline-Skript steuert sie.

    Eine Slideshow in den Templates Ihres Themes, die sich von selbst bewegt, erhält eine sichtbare Schaltfläche zum Anhalten und Fortsetzen, auf Englisch beschriftet mit „Pause slideshow“ und „Play slideshow“. Die Schaltfläche wird zum ersten Element der Slideshow, sodass Menschen, die mit der Tastatur navigieren, sie vor den Slides erreichen. Ein kurzes Skript in der Haupt-Skriptdatei des Themes verbindet die Schaltfläche mit dem automatischen Abspielen des Sliders selbst: einer CSS-Animation des Themes, Slick, Swiper oder Flickity. Für Besucherinnen und Besucher, deren Gerät reduzierte Bewegung verlangt, startet die Slideshow angehalten. Ein Slider, den ein Plugin oder ein Inline-Skript steuert, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • vs-carousel AUTO
    Geänderte Dateitypen
    .css.js.php
    adds a pause button to the CSS-animated hero slider of the fixture theme Beispieldaten

    assets/css/main.css Änderungen an assets/css/main.css: 28 hinzugefügt, 0 entfernt

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

    assets/js/theme.js Änderungen an assets/js/theme.js: 20 hinzugefügt, 0 entfernt

    Änderungen an assets/js/theme.js: 20 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    255 255 initCheckout();
    256 256 initShowPassword();
    257 257 })();
    258 Hinzugefügt
    259 Hinzugefügt /* validiscan:slider-pause-control */
    260 Hinzugefügt (function () {
    261 Hinzugefügt const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    262 Hinzugefügt for (const slider of document.querySelectorAll('.hero-slider')) {
    263 Hinzugefügt const button = slider.querySelector('.hero-slider__pause');
    264 Hinzugefügt if (!button) continue;
    265 Hinzugefügt const pauseLabel = button.textContent;
    266 Hinzugefügt const playLabel = button.getAttribute('data-play-label') || pauseLabel;
    267 Hinzugefügt const set = (paused) => {
    268 Hinzugefügt slider.classList.toggle('is-paused', paused);
    269 Hinzugefügt button.textContent = paused ? playLabel : pauseLabel;
    270 Hinzugefügt };
    271 Hinzugefügt button.addEventListener('click', () => {
    272 Hinzugefügt set(!slider.classList.contains('is-paused'));
    273 Hinzugefügt });
    274 Hinzugefügt if (reduce) set(true);
    275 Hinzugefügt }
    276 Hinzugefügt })();
    277 Hinzugefügt /* /validiscan:slider-pause-control */

    template-parts/hero-slider.php Änderungen an template-parts/hero-slider.php: 1 hinzugefügt, 0 entfernt

    Änderungen an template-parts/hero-slider.php: 1 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    37 37 };
    38 38 ?>
    39 39 <div class="hero-slider" data-autoplay="true" data-interval="6000">
    40 Hinzugefügt <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
  • Kein Ton, der von selbst startet mute-autoplay Ein Video in den Templates des Themes, das von selbst abspielt, wird stummgeschaltet, und Audio startet nicht mehr von selbst, außer ein Skript startet es; auf WooCommerce wird das Rezept für Befunde von vs-media nicht verwendet.

    Ein Video in den Templates des Themes, das von selbst abspielt, erhält muted und playsinline, sodass es stumm weiterläuft und auf iPhones innerhalb der Seite statt im Vollbild abgespielt wird; hat das Video Bedienelemente, können Besucherinnen und Besucher den Ton weiterhin einschalten. Audio, das von selbst startet, tut das danach nicht mehr. Medien, die ein Skript startet, bleiben einem Menschen überlassen. In einem Scan meldet die Medienprüfung vs-media von Validiscan Ton, der von selbst startet; sie tritt an die Stelle der axe-core-Regel, die dieses Rezept abdeckt. vs-media hat die Stufe MANUAL (siehe die Liste weiter unten), sodass ein solcher Befund auf WooCommerce mit einer Anleitung kommt statt mit dieser Änderung.

    Abgedeckte Regeln
    • no-autoplay-audio AUTO geprüft durch vs-media
    Geänderte Dateitypen
    .php
    mutes an autoplaying product video of the fixture theme Beispieldaten

    woocommerce/single-product/tabs/description.php Änderungen an woocommerce/single-product/tabs/description.php: 1 hinzugefügt, 1 entfernt

    Änderungen an woocommerce/single-product/tabs/description.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <video autoplay loop controls preload="none" poster="<?php echo esc_url( get_the_post_thumbnail_url( $kb_video, 'full' ) ); ?>" width="640" height="360">
    51 Hinzugefügt <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>

Formulare, Preise und Warenkorb

  • Beschriftungen, die mit ihren Feldern verbunden sind label-association Eine Beschriftung, die schon im Template steht, aber nicht mit ihrem Feld verbunden ist, wird verbunden, über for oder aria-labelledby.

    Ein Formularfeld, dessen Beschriftung schon im Template steht, aber nicht mit dem Feld verbunden ist, wird verbunden: Das <label> direkt vor dem Feld oder direkt nach einem Kontrollkästchen oder einem Radiobutton erhält ein for, das auf das Feld zeigt, oder ein als Beschriftung ausgezeichnetes Textelement wird über aria-labelledby verbunden. Screenreader lesen die Beschriftung dann vor, wenn das Feld den Fokus erhält, und ein Klick auf ein verbundenes <label> setzt den Fokus auf das Feld. Ein Feld, das nur einen Platzhalter hat, bleibt einem Menschen überlassen, weil eine Beschriftung zu schreiben eine Inhaltsentscheidung ist.

    Abgedeckte Regeln
    • label AUTO geprüft durch vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    Geänderte Dateitypen
    .php
    ties an unassociated coupon label to its field, as in the fixed cart Beispieldaten

    woocommerce/cart/cart.php Änderungen an woocommerce/cart/cart.php: 1 hinzugefügt, 1 entfernt

    Änderungen an woocommerce/cart/cart.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    62 62 <tr>
    63 63 <td colspan="6" class="actions">
    64 64 <div class="coupon">
    65 Entfernt <label class="screen-reader-text"><?php esc_html_e( 'Coupon:', 'woocommerce' ); ?></label>
    65 Hinzugefügt <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>
  • Checkout- und Kontofelder, die Browser ausfüllen können autocomplete-tokens Felder, die nach Daten über die Kundinnen und Kunden fragen, erhalten den passenden autocomplete-Wert, sofern der Code ihren Zweck zeigt; für die WooCommerce-Felder der Rechnungs- und der Versandadresse setzt ihn ein Filter in der functions.php.

    Felder in den Templates des Themes, die nach Daten über die Kundinnen und Kunden fragen, etwa Anmelde-, Registrierungs- und Checkout-Felder, erhalten den autocomplete-Wert für das, wonach sie fragen, etwa E-Mail-Adresse, Benutzername, aktuelles oder neues Passwort, Vor- und Nachname, Firma, Adresse, Postleitzahl, Land oder Telefonnummer. Der Wert wird aus Typ, Name, ID und Beschriftung des Felds abgeleitet. Ein Wert, der fehlt, off ist oder ungültig ist, wird ersetzt; ein gültiger bleibt. Die eigenen Felder von WooCommerce für die Rechnungs- und die Versandadresse gibt WooCommerce aus, nicht das Theme, daher setzt ein Filter in der functions.php ihre Werte. Er läuft nach den eigenen Filtern des Themes für diese Felder, die die Werte entfernen können. Felder, die keine personenbezogenen Daten abfragen, etwa Felder für Suche, Gutschein oder Menge, bleiben, wie sie sind, ebenso ein Feld, dessen Zweck der Code nicht zeigt.

    Abgedeckte Regeln
    • autocomplete-valid AUTO geprüft durch vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    Geänderte Dateitypen
    .php
    sets the tokens of the login, registration and checkout fields of the fixture theme Beispieldaten

    functions.php Änderungen an functions.php: 44 hinzugefügt, 0 entfernt

    Änderungen an functions.php: 44 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung 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 Hinzugefügt
    312 Hinzugefügt /* validiscan:autocomplete-tokens */
    313 Hinzugefügt /**
    314 Hinzugefügt * Autocomplete tokens for the WooCommerce address fields, so browsers and assistive
    315 Hinzugefügt * technology know what each field asks for (WCAG 1.3.5). Runs after the theme's own
    316 Hinzugefügt * field filters.
    317 Hinzugefügt *
    318 Hinzugefügt * @param array $fields Checkout fields (grouped by section) or one address section.
    319 Hinzugefügt * @return array
    320 Hinzugefügt */
    321 Hinzugefügt function kb_address_autocomplete( $fields ) {
    322 Hinzugefügt $tokens = array(
    323 Hinzugefügt 'first_name' => 'given-name',
    324 Hinzugefügt 'last_name' => 'family-name',
    325 Hinzugefügt 'company' => 'organization',
    326 Hinzugefügt 'country' => 'country',
    327 Hinzugefügt 'address_1' => 'address-line1',
    328 Hinzugefügt 'address_2' => 'address-line2',
    329 Hinzugefügt 'city' => 'address-level2',
    330 Hinzugefügt 'state' => 'address-level1',
    331 Hinzugefügt 'postcode' => 'postal-code',
    332 Hinzugefügt 'phone' => 'tel',
    333 Hinzugefügt 'email' => 'email',
    334 Hinzugefügt );
    335 Hinzugefügt foreach ( $fields as $key => $field ) {
    336 Hinzugefügt if ( ! is_array( $field ) ) {
    337 Hinzugefügt continue;
    338 Hinzugefügt }
    339 Hinzugefügt if ( 'billing' === $key || 'shipping' === $key ) {
    340 Hinzugefügt $fields[ $key ] = kb_address_autocomplete( $field );
    341 Hinzugefügt continue;
    342 Hinzugefügt }
    343 Hinzugefügt if ( ! preg_match( '/^(billing|shipping)_(.+)$/', (string) $key, $match ) || ! isset( $tokens[ $match[2] ] ) ) {
    344 Hinzugefügt continue;
    345 Hinzugefügt }
    346 Hinzugefügt $fields[ $key ]['autocomplete'] = ( 'shipping' === $match[1] ? 'shipping ' : '' ) . $tokens[ $match[2] ];
    347 Hinzugefügt unset( $fields[ $key ]['custom_attributes']['autocomplete'] );
    348 Hinzugefügt }
    349 Hinzugefügt return $fields;
    350 Hinzugefügt }
    351 Hinzugefügt add_filter( 'woocommerce_checkout_fields', 'kb_address_autocomplete', 99 );
    352 Hinzugefügt add_filter( 'woocommerce_billing_fields', 'kb_address_autocomplete', 99 );
    353 Hinzugefügt add_filter( 'woocommerce_shipping_fields', 'kb_address_autocomplete', 99 );
    354 Hinzugefügt /* /validiscan:autocomplete-tokens */

    woocommerce/myaccount/form-login.php Änderungen an woocommerce/myaccount/form-login.php: 3 hinzugefügt, 3 entfernt

    Änderungen an woocommerce/myaccount/form-login.php: 3 hinzugefügt, 3 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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 Entfernt <input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="off" onpaste="return false;">
    37 Hinzugefügt <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 Entfernt <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 Hinzugefügt <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
  • Änderungen bei Preis, Bestand und Warenkorb werden angesagt live-region-cart-variant Screenreader sagen den neuen Preis und Bestand einer gewählten Variante an, außer das Skript des Themes ersetzt diesen Bereich als Ganzes, und, auf Englisch, ein Produkt, das in den Warenkorb gelegt oder daraus entfernt wurde.

    Wählen Kundinnen und Kunden eine andere Größe oder Farbe, wird der Bereich, der Preis und Bestand der gewählten Variante zeigt, an Ort und Stelle neu geschrieben. Dieser Bereich wird zu einer Live-Region, sodass Screenreader den neuen Preis und Bestand ansagen, ohne dass die Kundinnen und Kunden dorthin wechseln müssen. Der Warenkorb-Link im Kopfbereich wird beim Hinzufügen eines Produkts als Ganzes ersetzt und kann die Ansage deshalb nicht selbst übernehmen. Daneben fügt das Rezept eine visuell verborgene Statusmeldung hinzu, und ein kurzer Block im Skript des Themes schreibt „Product added to your cart.“ oder „Product removed from your cart.“ hinein, wenn WooCommerce die Änderung meldet. Beide Meldungen werden auf Englisch hinzugefügt. Ein Bereich, der schon eine Live-Region ist oder in einer Live-Region liegt, oder den das eigene Skript des Themes als Ganzes ersetzt, bleibt unverändert.

    Abgedeckte Regeln
    • vs-live-updates AUTO
    Geänderte Dateitypen
    .js.php
    adds a status region next to the header cart fragment and wires the theme script Beispieldaten

    assets/js/theme.js Änderungen an assets/js/theme.js: 15 hinzugefügt, 0 entfernt

    Änderungen an assets/js/theme.js: 15 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung Code
    255 255 initCheckout();
    256 256 initShowPassword();
    257 257 })();
    258 Hinzugefügt
    259 Hinzugefügt /* validiscan:live-region-cart-variant */
    260 Hinzugefügt // Announces cart changes in the status region next to the header cart (WCAG 4.1.3).
    261 Hinzugefügt (function () {
    262 Hinzugefügt const region = document.querySelector('[data-kb-cart-status]');
    263 Hinzugefügt if (!region || !window.jQuery) return;
    264 Hinzugefügt window.jQuery(document.body).on('added_to_cart removed_from_cart', (event) => {
    265 Hinzugefügt const message = region.getAttribute(event.type === 'added_to_cart' ? 'data-added' : 'data-removed');
    266 Hinzugefügt region.textContent = '';
    267 Hinzugefügt window.setTimeout(() => {
    268 Hinzugefügt region.textContent = message || '';
    269 Hinzugefügt }, 100);
    270 Hinzugefügt });
    271 Hinzugefügt })();
    272 Hinzugefügt /* /validiscan:live-region-cart-variant */

    header.php Änderungen an header.php: 1 hinzugefügt, 0 entfernt

    Änderungen an header.php: 1 hinzugefügt, 0 entfernt
    Zeile vorher Zeile nachher Änderung 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 Hinzugefügt <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 Beispieldaten

    woocommerce/single-product/add-to-cart/variable.php Änderungen an woocommerce/single-product/add-to-cart/variable.php: 1 hinzugefügt, 1 entfernt

    Änderungen an woocommerce/single-product/add-to-cart/variable.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    65 65 </table>
    66 66
    67 67 <div class="single_variation_wrap">
    68 Entfernt <div class="woocommerce-variation single_variation">
    68 Hinzugefügt <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>

Namen für Icons, Bilder und eingebettete Inhalte

  • Namen für Schaltflächen und Links, die nur ein Icon zeigen icon-accessible-name Schaltflächen und Links, die nur ein Icon zeigen, erhalten einen englischen Namen, der sagt, was sie tun, sofern der Code ihren Zweck zeigt.

    Schaltflächen und Links, die nur ein Icon zeigen, erhalten einen Namen, der sagt, was sie tun, sofern der Code ihren Zweck zeigt: aus dem eigenen Namen des Icons, aus der Klasse oder ID des Bedienelements oder daraus, wohin ein Link führt, etwa zum Warenkorb, zur Kontoseite oder zu einem sozialen Netzwerk. Beispiele sind „Search“, „Cart“, „My account“, „Show password“, „Close“ und „Menu“. Der Name ist ein visuell verborgener Text im Bedienelement oder ein aria-label, wo das Theme keine Klasse für verborgenen Text hat, und er wird auf Englisch hinzugefügt. Namen sozialer Netzwerke sind Markennamen und bleiben, wie sie sind. Ein Bedienelement, dessen Zweck der Code nicht zeigt, bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • button-name ASSISTED
    • link-name ASSISTED
    Geänderte Dateitypen
    .php
    names the account link and the social links, and leaves the uncertain gallery link Beispieldaten

    header.php Änderungen an header.php: 1 hinzugefügt, 1 entfernt

    Änderungen an header.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <a class="kb-account-link" href="<?php echo esc_url( wc_get_page_permalink( 'myaccount' ) ); ?>"><?php kb_icon( 'user' ); ?></a>
    63 Hinzugefügt <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 Änderungen an template-parts/social-links.php: 1 hinzugefügt, 1 entfernt

    Änderungen an template-parts/social-links.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    17 17 ?>
    18 18 <ul class="kb-social">
    19 19 <?php foreach ( $kb_profiles as $kb_network => $kb_url ) : ?>
    20 Entfernt <a class="kb-social__link" href="<?php echo esc_url( $kb_url ); ?>"><?php kb_icon( $kb_network ); ?></a>
    20 Hinzugefügt <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 Beispieldaten

    header.php Änderungen an header.php: 1 hinzugefügt, 1 entfernt

    Änderungen an header.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <button type="submit" value="<?php echo esc_attr_x( 'Search', 'submit button', 'woocommerce' ); ?>" class="kb-search-submit"><?php kb_icon( 'search' ); ?></button>
    54 Hinzugefügt <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 Änderungen an woocommerce/myaccount/form-login.php: 1 hinzugefügt, 1 entfernt

    Änderungen an woocommerce/myaccount/form-login.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <button type="button" class="show-password-input"><?php kb_icon( 'eye' ); ?></button>
    38 Hinzugefügt <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
  • Dekorative Bilder, vor Screenreadern verborgen decorative-image-alt Nur Bilder, bei denen der Code belegt, dass sie dekorativ sind, erhalten ein leeres alt oder aria-hidden; die Textalternative jedes anderen Bildes bleibt einem Menschen überlassen.

    Ein Bild wird nur dann als dekorativ markiert, wenn der Code belegt, dass es nichts beiträgt: Es steht in einem Link oder einer Schaltfläche mit eigenem Text, etwa ein Logo neben dem Shopnamen, es ist ein kleines Icon neben seiner eigenen Textbeschriftung, oder es ist ein Abstandshalter oder Trenner. Ein <img> erhält dann ein leeres alt="", und ein SVG-Icon erhält aria-hidden="true", sodass Screenreader es überspringen, statt eine unbenannte Grafik anzusagen. Jedes andere Bild ist Inhalt, und seine Textalternative bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • image-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    Geänderte Dateitypen
    .php
    hides the logo mark inside the home link that has the shop name Beispieldaten

    header.php Änderungen an header.php: 1 hinzugefügt, 1 entfernt

    Änderungen an header.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung 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 Entfernt <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 Hinzugefügt <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>
  • Titel für eingebettete Karten und Videos iframe-title Ein eingebetteter Frame ohne Titel erhält einen englischen Titel, der sagt, was er zeigt, sofern der Code es zeigt.

    Ein eingebetteter Frame ohne Titel, etwa eine Karte oder ein YouTube- oder Vimeo-Video, erhält einen Titel auf Englisch, der sagt, was er zeigt. Das Rezept entnimmt ihn dem Titel einer im Theme eingebetteten Datei, dem Anbieter in der Adresse des Frames oder Wörtern wie map oder video in seiner Klasse oder ID. Ein Frame, dessen Inhalt der Code nicht zeigt, erhält keinen allgemeinen Titel; er bleibt einem Menschen überlassen.

    Abgedeckte Regeln
    • frame-title AUTO
    Geänderte Dateitypen
    .php
    titles the store map iframe of the contact page from the embedded document Beispieldaten

    page-contact.php Änderungen an page-contact.php: 1 hinzugefügt, 1 entfernt

    Änderungen an page-contact.php: 1 hinzugefügt, 1 entfernt
    Zeile vorher Zeile nachher Änderung Code
    81 81
    82 82 <div class="kb-store-map">
    83 83 <?php // VALIDISCAN-SEED frame-title: the map iframe has no title. ?>
    84 Entfernt <iframe src="<?php echo esc_url( get_stylesheet_directory_uri() . '/assets/embeds/store-map.html' ); ?>" width="600" height="320" loading="lazy"></iframe>
    84 Hinzugefügt <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>
Details: was die Rezepte beheben, die Stufen und das Testtheme

Validiscan hat 20 Rezepte für WooCommerce-Themes. Sie beheben Fehler in der Seitenstruktur und der Navigation, beim Tastaturfokus, beim Zoom, bei Touch-Zielen und Kontrast, bei Bewegung und Ton, in Formularfeldern und im Warenkorb sowie bei den Namen von Icons, Bildern und eingebetteten Frames. Ein Rezept ist eine deterministische Änderung für eine Art von Fehler: Derselbe Code erhält immer dieselbe Änderung. Jedes ändert nur dort etwas, wo der Code des Themes zeigt, welche Änderung die richtige ist; wo er es nicht zeigt, ändert das Rezept nichts, und der Befund bleibt einem Menschen überlassen.

Unter jedem Rezept finden Sie die Regeln, die es abdeckt, mit der Stufe jeder Regel im Regelkatalog von Validiscan. AUTO bedeutet, dass ein Rezept die Standardkorrektur der Regel ist. ASSISTED bedeutet, dass die Korrektur eine Einschätzung verlangt; deshalb wird eine Änderung entworfen und dann geprüft. MANUAL bedeutet, dass die Regel die Entscheidung eines Menschen braucht, und Validiscan gibt eine Anleitung statt einer Codeänderung. In einem Projekt werden Rezepte auf Befunde von Regeln der Stufe AUTO angewendet. Führt ein Rezept zusätzlich eine Regel der Stufe ASSISTED oder MANUAL auf, geht ein Befund dieser Regel stattdessen den Weg ASSISTED oder MANUAL. Eine Regel mit dem Vermerk „geprüft durch“ eine andere Prüfung wird in einem Scan nicht für sich ausgeführt: Diese Prüfung meldet denselben Fehler.

Die Dateitypen und das Vorher und Nachher jedes Rezepts stammen aus den eigenen Tests der Anwendung. Die meisten laufen auf ihrem WooCommerce-Testtheme, einem Child-Theme des Themes Storefront, in das absichtlich Fehler der Barrierefreiheit eingebaut wurden; die Kommentare mit der Markierung VALIDISCAN-SEED, die Sie in einigen Diffs sehen, kennzeichnen diese Fehler; es gibt sie nur im Testtheme. WordPress-Seiten lassen sich in der Testumgebung nicht rendern, deshalb rendern diese Tests keine Seiten: Sie prüfen die Änderung selbst, als Vorher und Nachher der Theme-Dateien. Die Dateien Ihres Themes sehen anders aus.

Was bleibt auf WooCommerce MANUAL?

Fehler, die eine Entscheidung über Inhalt oder Verhalten verlangen, die eine feste Codeänderung nicht treffen kann, zum Beispiel Untertitel und Transkripte für Ihre Videos und Audioinhalte, bleiben auf WooCommerce MANUAL. Für einen Befund einer MANUAL-Regel gibt Validiscan eine Anleitung zur Behebung, keine Änderung an Ihrem Code.

Die unten aufgeführten Regeln werden in Scans ausgeführt und haben auf WooCommerce die Stufe MANUAL; Regeln zur guten Praxis sind nicht aufgeführt.

  • meta-refresh Zeitverzögerte Aktualisierung unter 20 Stunden darf nicht verwendet werden
  • nested-interactive Interaktive Bedienelemente dürfen nicht verschachtelt sein
  • scrollable-region-focusable Scrollbare Bereiche müssen per Tastatur erreichbar sein
  • server-side-image-map Serverseitige Imagemaps dürfen nicht verwendet werden
  • vs-keyboard-trap Der Tastaturfokus darf nie festhängen
  • vs-focus-order Die Fokusreihenfolge muss der visuellen Reihenfolge folgen
  • vs-dragging Reine Ziehbewegungen brauchen eine Alternative per Tippen oder Klicken
  • vs-media Videos brauchen Untertitel, Audio braucht ein Transkript, und nichts darf automatisch mit Ton starten
  • vs-documents Verlinkte Dokumente brauchen eine manuelle Prüfung der Barrierefreiheit
Details: die Prüfung der Fokusreihenfolge und was ein Projekt nicht umfasst

Für einen Befund einer MANUAL-Regel gibt Validiscan eine Anleitung zur Behebung, keine Änderung an Ihrem Code. Diese Fehler verlangen eine Entscheidung über Inhalt oder Verhalten, die eine feste Codeänderung nicht treffen kann, zum Beispiel Untertitel und Transkripte für Ihre Videos und Audioinhalte, einen Ausweg aus einem Widget, das den Tastaturfokus festhält, eine andere Möglichkeit, ein Bedienelement zu benutzen, das nur durch Ziehen funktioniert, oder die Prüfung verlinkter Dokumente wie PDFs. Stammt ein Befund von vs-focus-order aus einem tabindex größer als 0 in einem Template des Themes, entfernt ihn das Rezept für die Tab-Reihenfolge weiter oben.

Die Arbeit an Befunden der Stufe MANUAL, bei denen Sie selbst inhaltlich entscheiden müssen, ist nicht Teil eines Projekts, PDFs ebenso wenig. Zwischen den Regeln der Stufe AUTO und denen der Stufe MANUAL stehen die Regeln der Stufe ASSISTED, etwa Textalternativen für Produktbilder oder Namen für Schaltflächen: Ihre Korrekturen verlangen eine Einschätzung, und Validiscan prüft jede Korrektur, bevor sie ausgeliefert wird. Was automatisierte Tests der Barrierefreiheit nachweisen können und was nicht

Was stellen Sie bereit?

Sie stellen bereit: Ihre schriftliche Einwilligung in einen vollständigen Scan, einen Weg in Ihr Theme, Ihre Antwort zu KI-Entwürfen für ASSISTED-Korrekturen, ein Entwicklungsteam oder eine Agentur, die die Änderungen prüft und live stellt, Ihre Entscheidungen darüber, was MANUAL bleibt, und für einen anderssprachigen Shop Übersetzungen des neuen englischen Texts.

  1. Ihre schriftliche Einwilligung in einen vollständigen Scan Ihres Shops. Ein vollständiger Scan legt ein Produkt in den Warenkorb und öffnet den ersten Schritt im Checkout, ohne einen Kauf abzuschließen oder Zahlungsdaten einzugeben.
  2. Einen Weg in Ihr Theme: den Zugriff auf das GitHub-Repository, in dem Ihr Theme oder Child-Theme liegt, oder ein ZIP des Theme-Ordners, das im Kundenportal hochgeladen wird.
  3. Ihre Antwort darauf, ob KI Korrekturen der Stufe ASSISTED entwerfen darf. KI-Entwürfe sind ausgeschaltet, bis Sie zustimmen.
  4. Eine Entwicklerin, einen Entwickler oder eine Agentur, die die Änderungen prüft, den Pull Request zusammenführt oder das Patch-Paket einspielt und das Theme live stellt.
  5. Übersetzungen des neuen englischen Texts, wenn Ihr Shop in einer anderen Sprache ist.
  6. Ihre Entscheidungen zu dem, was MANUAL bleibt, etwa Untertitel für Ihre Videos.
Details: wenn die Änderungen live sind, und was ein Projekt umfasst

Sobald die Änderungen live sind, prüft ein Verifizierungsscan die betroffenen Seiten erneut, und das Remediation Evidence Package hält das Ergebnis fest. Der Ablauf eines Projekts, Schritt für Schritt

Ein Projekt gilt für einen Shop: eine Domain und ein Theme.

Quellen

4 Quellen, alle für diese Seite geprüft am 6. Oktober 2026.

Entwickler­dokumentation von WooCommerce und WordPress 4
  1. Template structure & Overriding templates via a theme · WooCommerce · geprüft am
  2. language_attributes() · WordPress.org · geprüft am
  3. Localization (Common APIs Handbook) · WordPress.org · geprüft am
  4. Templates (Theme Handbook) · WordPress.org · geprüft am

Beginnen Sie mit einem kostenlosen Check Ihres Shops.

Senden Sie die Adresse Ihres Shops. Validiscan scannt ihn und antwortet mit jedem Fehler, den der Scan nachweisen kann, jeweils mit der Seite und dem Code.

Kostenlosen Check anfordern

Oder schreiben Sie an info@validiscan.com.

Was der kostenlose Check umfasst und was nicht
Sie senden
die Adresse Ihres Shops
Gescannte Seiten
bis zu 15
Sie erhalten
jeden Fehler, den der Scan nachweisen kann, mit Seite und Code
In Ihrem Shop
nur öffentliche Seiten; keine Anmeldung, nichts gekauft, kein Formular abgeschickt
Was er nicht ist
ein vollständiges Audit

Nachricht an Validiscan

Für einen kostenlosen Check nennen Sie die Adresse Ihres Shops und seine Plattform.

Validiscan verwendet, was Sie senden, um Ihnen zu antworten. Datenschutzerklärung