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:
Auf dieser Seite: 7 Antworten
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.
| 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/, 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.
- 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.
- 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.
- Sie oder Ihr Entwicklungsteam führen den Pull Request zusammen oder spielen das Patch-Paket ein und testen die Änderungen.
- Sie oder Ihr Entwicklungsteam stellen das Theme live.
- 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/ 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.
- Die
.pot-Datei des Themes neu erzeugen - Die Übersetzungen in die
.po-Dateien eintragen - 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 festenlang-Wert hat, erhältlanguage_attributes()von WordPress, das die Sprache der Website ausgibt.Das Rezept sorgt dafür, dass das
<html>-Element Ihrer Header-Templates seine Sprache auslanguage_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 eingetragenerlang-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 derfunctions.phpdie 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-langAUTO geprüft durch vs-lang -
html-lang-validAUTO geprüft durch vs-lang -
vs-langAUTO
-
- 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. ?> -
Skip-Link, Hauptbereich und benannte Menüs skip-link-main Ein Skip-Link, wo ein Header-Template keinen hat, ein
<main>-Bereich aus dem Inhaltscontainer der Seite, wo keiner existiert, und Namen für Navigationsbereiche, deren Zweck erkennbar ist, alles auf Englisch.Jedes Header-Template ohne Skip-Link erhält einen Link „Skip to content“ direkt nach dem öffnenden
<body>-Tag oder nach dem Aufruf vonwp_body_open(), der darauf folgt. Er bleibt verborgen, bis er den Fokus erhält, und springt zum Inhalt der Seite. Ist Ihr Theme ein Child-Theme von Storefront und hat die Skip-Links von Storefront abgeschaltet, werden sie stattdessen wieder eingeschaltet. Haben die Templates noch keinen Hauptbereich, wird der Inhaltscontainer der Seiten-Templates, ein<div>mit der IDmainoder der Klassesite-main, zu einem<main>-Element, das ihn als Hauptbereich der Seite auszeichnet; sprechen die Styles oder Skripte des Themes diesen Container alsdivan, bleibt er unverändert. Navigationsbereiche, deren Zweck in ihrer ID oder Klasse erkennbar ist, erhalten einen Namen, etwa „Primary navigation“, „Breadcrumb“, „Footer navigation“ oder „Pagination“. Ein vorhandener Skip-Link, der ins Leere zeigt, wird auf den Inhalt gerichtet. Der Linktext und die Namen werden auf Englisch hinzugefügt.- Abgedeckte Regeln
-
-
bypassAUTO geprüft durch vs-headings-landmarks -
landmark-one-mainAUTO geprüft durch vs-headings-landmarks -
regionAUTO -
skip-linkAUTO -
vs-headings-landmarksAUTO -
landmark-uniqueASSISTED
-
- Geänderte Dateitypen
-
.php
restores the skip links, adds <main> and labels the navigation of the fixture theme Beispieldaten 404.php Änderungen an 404.php: 2 hinzugefügt, 2 entfernt
Änderungen an 404.php: 2 hinzugefügt, 2 entfernt Zeile vorher Zeile nachher Änderung Code 9 9 ?> 10 10 11 11 <div id="primary" class="content-area"> 12 Entfernt <div id="main" class="site-main"> 12 Hinzugefügt <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 Entfernt </div><!-- #main --> 25 Hinzugefügt </main><!-- #main --> 26 26 </div><!-- #primary --> 27 27 28 28 <?php archive-product.php Änderungen an archive-product.php: 2 hinzugefügt, 2 entfernt
Änderungen an archive-product.php: 2 hinzugefügt, 2 entfernt Zeile vorher Zeile nachher Änderung 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 Entfernt <div id="main" class="site-main"> 25 Hinzugefügt <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 Entfernt </div><!-- #main --> 49 Hinzugefügt </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 Ä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 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 Entfernt <div id="main" class="site-main"> 21 Hinzugefügt <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 Entfernt </div><!-- #main --> 65 Hinzugefügt </main><!-- #main --> 66 66 </div><!-- #primary --> 67 67 68 68 <?php functions.php Änderungen an functions.php: 1 hinzugefügt, 4 entfernt
Änderungen an functions.php: 1 hinzugefügt, 4 entfernt Zeile vorher Zeile nachher Änderung Code 32 32 * Storefront pieces the child theme does not use. 33 33 */ 34 34 function kb_remove_storefront_parts() { 35 Entfernt // VALIDISCAN-SEED vs-headings-landmarks: Storefront's "Skip to navigation / Skip to content" 36 Entfernt // links are removed because "they flash on the first Tab"; nothing replaces them. 37 Entfernt 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 Entfernt $defaults['wrap_before'] = '<div class="storefront-breadcrumb"><div class="col-full"><nav class="woocommerce-breadcrumb">'; 212 Hinzugefügt $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 Änderungen an header-checkout.php: 1 hinzugefügt, 0 entfernt
Änderungen an header-checkout.php: 1 hinzugefügt, 0 entfernt Zeile vorher Zeile nachher Änderung Code 18 18 19 19 <body <?php body_class(); ?>> 20 20 <?php wp_body_open(); ?> 21 Hinzugefügt <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 Änderungen an header.php: 1 hinzugefügt, 1 entfernt
Änderungen an header.php: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung 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 Entfernt <nav id="site-navigation" class="main-navigation"> 77 Hinzugefügt <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 Änderungen an page-contact.php: 2 hinzugefügt, 2 entfernt
Änderungen an page-contact.php: 2 hinzugefügt, 2 entfernt Zeile vorher Zeile nachher Änderung 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 Entfernt <div id="main" class="site-main"> 27 Hinzugefügt <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 Entfernt </div><!-- #main --> 88 Hinzugefügt </main><!-- #main --> 89 89 </div><!-- #primary --> 90 90 91 91 <?php page.php Änderungen an page.php: 2 hinzugefügt, 2 entfernt
Änderungen an page.php: 2 hinzugefügt, 2 entfernt Zeile vorher Zeile nachher Änderung 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 Entfernt <div id="main" class="site-main"> 16 Hinzugefügt <main id="main" class="site-main"> 17 17 18 18 <?php 19 19 while ( have_posts() ) : 35 35 endwhile; 36 36 ?> 37 37 38 Entfernt </div><!-- #main --> 38 Hinzugefügt </main><!-- #main --> 39 39 </div><!-- #primary --> 40 40 41 41 <?php search.php Änderungen an search.php: 2 hinzugefügt, 2 entfernt
Änderungen an search.php: 2 hinzugefügt, 2 entfernt Zeile vorher Zeile nachher Änderung 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 Entfernt <div id="main" class="site-main"> 14 Hinzugefügt <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 Entfernt </div><!-- #main --> 39 Hinzugefügt </main><!-- #main --> 40 40 </div><!-- #primary --> 41 41 42 42 <?php single-product.php Änderungen an single-product.php: 2 hinzugefügt, 2 entfernt
Änderungen an single-product.php: 2 hinzugefügt, 2 entfernt Zeile vorher Zeile nachher Änderung 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 Entfernt <div id="main" class="site-main"> 16 Hinzugefügt <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 Entfernt </div><!-- #main --> 23 Hinzugefügt </main><!-- #main --> 24 24 </div><!-- #primary --> 25 25 26 26 <?php -
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 derfunctions.phpeingeschaltet. Stammt der Titel aus einem SEO-Plugin oder aus den eigenen Einstellungen einer Seite, ändert das Rezept nichts.- Abgedeckte Regeln
-
-
document-titleAUTO
-
- 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-orderAUTO geprüft durch vs-headings-landmarks -
page-has-heading-oneAUTO geprüft durch vs-headings-landmarks -
vs-headings-landmarksAUTO
-
- 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,primaryoderlinkenthä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. Einoutline: nonebeim 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-visibleAUTO
-
- 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
tabindexgröß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
tabindexgröß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. Eintabindex, den PHP-Code ausgibt oder ein Skript setzt, bleibt einem Menschen überlassen.- Abgedeckte Regeln
-
-
tabindexAUTO -
vs-focus-orderMANUAL
-
- 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…', '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…', '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, Touch-Ziele und Kontrast
-
Zoomen auf dem Smartphone erlaubt meta-viewport-zoom
user-scalable=nound einmaximum-scaleunter 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=nound einmaximum-scaleunter 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 Regelmeta-viewport-largevon axe-core wird jedesmaximum-scaleunter 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-viewportAUTO -
meta-viewport-largeAUTO
-
- 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-sizeAUTO
-
- 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-contrastASSISTED
-
- 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-motionAUTO
-
- 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-carouselAUTO
-
- 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 blinkender oder laufender Text remove-blink-marquee
<blink>- und<marquee>-Elemente in den Templates des Themes werden zu statischen Elementen mit demselben Inhalt, denselben Klassen und denselben IDs, sodass sich kein Text von selbst bewegt.<blink>- und<marquee>-Elemente in den Templates des Themes und in PHP-Strings, die sie ausgeben, werden zu statischen Elementen mit demselben Inhalt, denselben Klassen und denselben IDs: ein<span>für blink, ein<div>für marquee oder ein<span>, wenn das marquee in einem Absatz steht. Die Scroll-Einstellungen des marquee werden entfernt, sodass sich kein Text von selbst bewegt. Ein Element, das der Code an verschiedenen Stellen öffnet und schließt, bleibt einem Menschen überlassen.- Abgedeckte Regeln
-
-
blinkAUTO -
marqueeAUTO
-
- Geänderte Dateitypen
-
.php
makes a marquee and a blink added to the fixture theme static Beispieldaten footer.php Änderungen an footer.php: 1 hinzugefügt, 1 entfernt
Änderungen an footer.php: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 31 31 <?php endfor; ?> 32 32 </div> 33 33 34 Entfernt <marquee class="kb-ticker" behavior="scroll" scrollamount="3"><?php esc_html_e( 'Free returns within 30 days', 'kestrel-birch' ); ?></marquee> 34 Hinzugefügt <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 Änderungen an functions.php: 1 hinzugefügt, 1 entfernt
Änderungen an functions.php: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung 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 Entfernt 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 Hinzugefügt 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 Beispieldaten functions.php Änderungen an functions.php: 1 hinzugefügt, 1 entfernt
Änderungen an functions.php: 1 hinzugefügt, 1 entfernt Zeile vorher Zeile nachher Änderung Code 11 11 add_action( 'after_setup_theme', 'minimal_setup' ); 12 12 13 13 function minimal_sale() { 14 Entfernt echo '<p><blink class="sale">' . esc_html__( 'Sale', 'minimal' ) . '</blink></p>'; 14 Hinzugefügt echo '<p><span class="sale">' . esc_html__( 'Sale', 'minimal' ) . '</span></p>'; 15 15 } template-parts/notice.php Änderungen an template-parts/notice.php: 3 hinzugefügt, 3 entfernt
Änderungen an template-parts/notice.php: 3 hinzugefügt, 3 entfernt Zeile vorher Zeile nachher Änderung Code 1 1 <div class="notice"> 2 Entfernt <marquee class="notice__ticker" behavior="scroll" direction="left" scrollamount="4"> 2 Hinzugefügt <div class="notice__ticker"> 3 3 <?php esc_html_e( 'Free shipping this week', 'minimal' ); ?> 4 Entfernt </marquee> 5 Entfernt <blink><?php esc_html_e( 'New!', 'minimal' ); ?></blink> 4 Hinzugefügt </div> 5 Hinzugefügt <span><?php esc_html_e( 'New!', 'minimal' ); ?></span> 6 6 </div> -
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-medianicht verwendet.Ein Video in den Templates des Themes, das von selbst abspielt, erhält
mutedundplaysinline, 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üfungvs-mediavon Validiscan Ton, der von selbst startet; sie tritt an die Stelle der axe-core-Regel, die dieses Rezept abdeckt.vs-mediahat 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-audioAUTO 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
foroderaria-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 einfor, das auf das Feld zeigt, oder ein als Beschriftung ausgezeichnetes Textelement wird überaria-labelledbyverbunden. 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
-
-
labelAUTO geprüft durch vs-forms-ecommerce -
select-nameASSISTED -
vs-forms-ecommerceAUTO
-
- 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 derfunctions.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,offist 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 derfunctions.phpihre 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-validAUTO geprüft durch vs-forms-ecommerce -
vs-forms-ecommerceAUTO
-
- 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' ); ?> <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' ); ?> <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-updatesAUTO
-
- 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-nameASSISTED -
link-nameASSISTED
-
- 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…', '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' ); ?> <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
altoderaria-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 leeresalt="", und ein SVG-Icon erhältaria-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-altASSISTED -
role-img-altASSISTED -
svg-img-altASSISTED
-
- 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
mapodervideoin 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-titleAUTO
-
- 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-refreshZeitverzögerte Aktualisierung unter 20 Stunden darf nicht verwendet werden -
nested-interactiveInteraktive Bedienelemente dürfen nicht verschachtelt sein -
scrollable-region-focusableScrollbare Bereiche müssen per Tastatur erreichbar sein -
server-side-image-mapServerseitige Imagemaps dürfen nicht verwendet werden -
vs-keyboard-trapDer Tastaturfokus darf nie festhängen -
vs-focus-orderDie Fokusreihenfolge muss der visuellen Reihenfolge folgen -
vs-draggingReine Ziehbewegungen brauchen eine Alternative per Tippen oder Klicken -
vs-mediaVideos brauchen Untertitel, Audio braucht ein Transkript, und nichts darf automatisch mit Ton starten -
vs-documentsVerlinkte 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.
- 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.
- 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.
- Ihre Antwort darauf, ob KI Korrekturen der Stufe ASSISTED entwerfen darf. KI-Entwürfe sind ausgeschaltet, bis Sie zustimmen.
- 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.
- Übersetzungen des neuen englischen Texts, wenn Ihr Shop in einer anderen Sprache ist.
- 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.
Entwicklerdokumentation von WooCommerce und WordPress 4
- Template structure & Overriding templates via a theme · WooCommerce · geprüft am
- language_attributes() · WordPress.org · geprüft am
- Localization (Common APIs Handbook) · WordPress.org · geprüft am
- 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 anfordernOder 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