Rettelser af tilgængelighed i koden til dit tema på WooCommerce

Validiscan retter tilgængelighedsfejl i dit WordPress-tema eller child-tema: i dets PHP-skabeloner, herunder de WooCommerce-skabeloner, det overstyrer, og i dets stilark og scripts. Intet når din live webshop, før du eller din udvikler merger eller anvender ændringerne og sætter temaet live.

Senest opdateret:

Hvad ændrer Validiscan i et WooCommerce-tema?

Validiscan ændrer dit temas egne filer og intet andet: PHP-skabeloner, herunder de WooCommerce-skabeloner, det overstyrer, functions.php, stilark og scripts. En ændring af andre filtyper end PHP, CSS, SCSS, JavaScript, HTML og JSON består ikke Validiscans kontroller, og ingen rettelse tilføjer et plugin eller et overlay.

Opskrifterne er skrevet til klassiske WordPress-temaer, der er bygget af PHP-skabeloner, ikke til bloktemaer, hvis skabeloner er HTML-filer. På et bloktema overlades en fejl, som ingen opskrift retter, til et menneske, og en skabelon, der er ændret i Site Editor, gemmes i webstedets database, så en ændring af temaets filer når den ikke (WordPress Theme Handbook om skabeloner). Opskrifterne ændrer kun opmærkning, hvor de temafiler, Validiscan modtager, udskriver den. Opmærkning, der udskrives fra andre filer, for eksempel fra WordPress, WooCommerce, et andet plugin eller et parent-tema, der ikke er en del af den kilde, overlades til et menneske; et cookiebanner, der er tilføjet af et samtykkeplugin, er et eksempel. Én undtagelse er WooCommerces egne felter til fakturering og levering: Et filter i dit temas functions.php sætter deres autocomplete-værdier (se opskriften nedenfor).

Detaljer: hvilke filer en ændring må berøre, kontrollen af hver ændring, og hvad en rettelse må tilføje

Validiscan ændrer dit temas egne filer og intet andet: PHP-skabelonerne, herunder de WooCommerce-skabeloner, som dit tema overstyrer i sin mappe woocommerce (WooCommerces dokumentation om overstyring af skabeloner), functions.php og temaets stilark og scripts. En ændring må kun berøre PHP-, CSS-, SCSS-, JavaScript-, HTML- og JSON-filer og aldrig en fil i en vendor-, node_modules-, wp-admin- eller wp-includes-mappe på øverste niveau. En ændring af enhver anden fil består ikke Validiscans kontroller og kan ikke godkendes. Hver ændret PHP-fil gennemgår desuden PHP’s egen syntakskontrol (php -l), som læser filen uden at køre den. Opskrifterne redigerer aldrig en minificeret .min.css- eller .min.js-fil; sådanne filer er build-output.

Hver ændring er en almindelig redigering af en temafil, som din udvikler kan læse linje for linje. Nogle få rettelser tilføjer et par linjer til temaets eget script, for eksempel for at forbinde en pauseknap med et slideshow eller for at få en ændring i kurven læst op. Ingen rettelse tilføjer et plugin eller et overlay, og der indsættes intet, som retter dine sider i den besøgendes browser. Indlejret tredjepartsindhold som betalings- eller chatwidgets indgår ikke i et projekt.

Hvordan får Validiscan adgang til dit WooCommerce-tema?

Validiscan når dit WooCommerce-tema på en af to måder: gennem det GitHub-repository, der rummer det, eller ud fra en ZIP-fil med temamappen, som du uploader. Hvilken der passer, afhænger af, hvor dit temas kode ligger, og den afgør også, hvordan ændringerne kommer tilbage til dig.

De to veje ind i et WooCommerce-tema
Vej ind Det giver du Ændringerne kommer tilbage som
Gennem dit GitHub-repository Adgang til det repository, der rummer dit tema eller child-tema, gennem Validiscans GitHub-app eller et adgangstoken En pull request
Ud fra en ZIP-fil med din temamappe Din temamappe under wp-content/themes, inklusive child-temaet, hvis du bruger et, som én ZIP-fil på op til 100 MB, uploadet i kundeportalen af en administrator i din organisation En patchpakke

Gennem dit GitHub-repository

Hvis dit tema eller child-tema ligger i et GitHub-repository, giver du Validiscan adgang til det repository. Du installerer Validiscans GitHub-app på det eller giver Validiscan et adgangstoken, som Validiscan opbevarer krypteret. Appen beder om læse- og skriveadgang til repositoriets indhold og pull requests og om læseadgang til dets metadata. Opskrifterne forventer temaets style.css og functions.php i roden af repositoriet, så repositoriet bør rumme selve temamappen, ikke en hel WordPress-installation. Ændringerne kommer så som en pull request.

Ud fra en ZIP-fil med din temamappe

Hvis dit tema ikke ligger i et repository, beder kundeportalen dig om at lade din udvikler lave en ZIP-fil med din temamappe under wp-content/themes, inklusive child-temaet, hvis du bruger et. En administrator i din organisation uploader den derefter i kundeportalen som én ZIP-fil på op til 100 MB. Validiscan udarbejder ændringerne ud fra den kopi af dit tema og sender resultatet til din udvikler som en patchpakke. Hvor rettelser hører hjemme i et WooCommerce-tema, og hvad en temaopdatering kan fortryde

Hvordan når ændringerne frem til din webshop?

Validiscan leverer kun ændringer, som Validiscan har gennemgået og godkendt, som en pull request eller som en patchpakke, og ingen af delene berører din live WooCommerce-webshop. Det er fortsat dig eller din udvikler, der anvender ændringerne og sætter dem live; levering som en upubliceret kopi af temaet findes kun på Shopify.

Fra levering til din live webshop, i fem trin
  1. Validiscan leverer de ændringer, som Validiscan har gennemgået og godkendt: en pull request på en ny branch eller en patchpakke til din udvikler.
  2. Din udvikler eller dit bureau gennemgår ændringerne. Ved en pull request beder tjeklisten om et staging- eller forhåndsvisningsmiljø, ikke den live webshop, og om at betjene de ændrede elementer med tastaturet alene.
  3. Du eller din udvikler merger pull requesten eller anvender patchpakken og tester ændringerne.
  4. Du eller din udvikler sætter temaet live.
  5. Når ændringerne er live, kontrollerer en verifikationsscanning de berørte sider igen.

En pull request

Med adgang til dit repository opretter Validiscan en ny branch med navnet validiscan/a11y-<date>-<id>, committer hver rettelse for sig og åbner én pull request med en oversigtstabel, en forklaring af hver ændring og en tjekliste til gennemgangen. Der pushes intet til din standardbranch. Tjeklisten beder din udvikler om at rulle branchen ud i et staging- eller forhåndsvisningsmiljø, ikke i den live webshop, og om at betjene de ændrede elementer med tastaturet alene. Det er fortsat dig, der merger og ruller ud.

En patchpakke

Ud fra en uploadet temamappe udarbejder Validiscan et zip-arkiv til din udvikler. Det indeholder PATCH.md med hver ændring og en vejledning i at anvende den, alle ændringer i én patchfil, som kan anvendes med git apply, én patchfil pr. rettelse, de komplette ændrede filer og en README.md. Din udvikler anvender ændringerne, tester dem og sætter temaet live. Hvad en pull request og en patchpakke indeholder

Tilføjes der ny tekst på din webshops sprog?

Kun på engelsk. Validiscans WooCommerce-opskrifter tilføjer ny tekst som en oversættelig streng i dit temas tekstdomæne og tilføjer ingen oversættelser. Hvis din webshop er på tysk eller et andet sprog, er det din udviklers opgave at oversætte den nye tekst.

Sådan oversættes den nye tekst, i tre trin
  1. Generér temaets .pot-fil igen.
  2. Tilføj oversættelserne til dets .po-filer.
  3. Kompilér de .mo-filer, som WordPress læser.
Detaljer: hvilken tekst opskrifterne tilføjer, og hvordan WordPress læser oversættelser

Validiscans WooCommerce-opskrifter tilføjer kun ny tekst på engelsk. Når en opskrift tilføjer tekst til de besøgende, for eksempel ordene i et spring over-link, teksten på en pauseknap eller navnet på en ikonknap, tilføjer den teksten som en oversættelig streng i dit temas tekstdomæne og tilføjer ingen oversættelser. På Shopify, Shopware og Magento kan opskrifterne også tilføje tysk tekst; på WooCommerce gør de ikke.

Hvis din webshop er på tysk eller et andet sprog, er det din udviklers opgave at oversætte den nye tekst: Generér temaets .pot-fil igen, tilføj oversættelserne til dets .po-filer, og kompilér de .mo-filer, som WordPress læser. Fremgangsmåden er beskrevet i WordPress’ dokumentation om lokalisering. Opskrifterne nedenfor angiver, hvor de tilføjer tekst.

Hvad ændrer opskrifterne i et WooCommerce-tema?

Hver af Validiscans 20 opskrifter til WooCommerce-temaer er en deterministisk ændring for én slags fejl: Den samme kode får altid den samme ændring. En opskrift foretager kun en ændring, hvor temaets kode viser, hvad den rigtige ændring er; ellers overlades fundet til et menneske.

Sidestruktur og navigation

  • Sidens sprog ud fra dine WordPress-indstillinger html-lang En header-skabelon, hvis <html>-element udelader sproget eller har en fast lang-værdi, der ikke er gyldig, får WordPress’ language_attributes(), som udskriver webstedets sprog.

    Opskriften får <html>-elementet i dine header-skabeloner til at hente sit sprog fra WordPress’ language_attributes(), som udskriver webstedets sprog eller det sprog, et flersproget plugin angiver, så skærmlæsere udtaler siden rigtigt. En header-skabelon, der udelader sproget, får kaldet tilføjet, og en fast lang-værdi, der ikke er gyldig, erstattes af det. Hvis den forkerte værdi kommer fra indstillingen for webstedets sprog i din WordPress-administration, ændrer opskriften intet, fordi det er en indstilling og ikke temakode. Hvor temaet allerede læser et sprogfelt for hver side, for eksempel til tyske juridiske sider i en engelsksproget webshop, angiver et filter i functions.php den sides sprog, og sidehovedet og sidefoden på webstedet beholder webshoppens sprog. Uden et sådant felt gætter opskriften ikke på sproget.

    Regler, den dækker
    • html-has-lang AUTO kontrolleres via vs-lang
    • html-lang-valid AUTO kontrolleres via vs-lang
    • vs-lang AUTO
    Filtyper, den ændrer
    .php
    adds language_attributes() to the checkout header of the fixture theme Eksempeldata

    header-checkout.php Ændringer i header-checkout.php: 1 tilføjet, 1 fjernet

    Ændringer i header-checkout.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <html>
    11 Tilføjet <html <?php language_attributes(); ?>>
    12 12 <head>
    13 13 <meta charset="<?php bloginfo( 'charset' ); ?>">
    14 14 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled. ?>
  • En titel på hver side document-title-template Det, der i temaet forhindrer WordPress’ genererede sidetitel i at blive vist, repareres; en titel fra et SEO-plugin eller fra en sides egne indstillinger bliver, som den er.

    WordPress bygger selv en sidetitel ud fra navnet på siden eller produktet, sidetallet på en liste med sideinddeling og webshoppens navn. Opskriften reparerer det, der i temaet forhindrer den titel i at blive vist. Et titelfilter, der returnerer en tilpasset titel, for eksempel fra et SEO-felt, bruger i stedet den genererede titel, når feltet er tomt. En fast <title>-tekst i en header-skabelon erstattes af den titel, WordPress genererer. Et tema, der ikke er et child-tema og slet ikke udskriver nogen titel, får WordPress’ titelunderstøttelse slået til i functions.php. Når titlen kommer fra et SEO-plugin eller fra en sides egne indstillinger, ændrer opskriften intet.

    Regler, den dækker
    • document-title AUTO
    Filtyper, den ændrer
    .php
    lets the empty custom SEO title fall back to the generated title Eksempeldata

    functions.php Ændringer i functions.php: 2 tilføjet, 1 fjernet

    Ændringer i functions.php: 2 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet return (string) get_post_meta( get_the_ID(), '_kb_seo_title', true );
    90 Tilføjet $custom_title = trim( (string) get_post_meta( get_the_ID(), '_kb_seo_title', true ) );
    91 Tilføjet return '' !== $custom_title ? $custom_title : $title;
    91 92 }
    92 93 return $title;
    93 94 }
  • Overskrifter uden oversprungne niveauer heading-levels En overskrift, der springer et niveau over, får niveauet lige under overskriften før den og beholder sine klasser, medmindre temaets stilregler eller scripts udpeger den via dens niveau.

    En overskrift, der springer et niveau over, for eksempel en h4 lige efter en h2, får det niveau, der ligger lige under overskriften før den, i skabelonen eller i den PHP-streng, der udskriver den. Widget-titler og overskrifter i sidefoden eller en sidebjælke bliver h2. Når springet kommer fra en WooCommerce-skabelon, der vises lige efter sidens titel, for eksempel Billing details og Shipping details i kassen, flytter overskrifterne på samme niveau i de nærliggende skabeloner med. Kun niveauet ændres: Hver overskrift beholder sine klasser, og en overskrift, som temaets stilregler eller scripts udpeger via dens niveau, bliver, som den er. En overskrift uden klasse får temaets udseende for sit nye niveau. På en side uden hovedoverskrift bliver det element, der allerede ligner sidens titel, til h1: et element med en titelklasse, der er sat til mindst 24 pixels. Har en side intet sådant element, tilføjer opskriften ingen overskrift og overlader det til et menneske.

    Regler, den dækker
    • heading-order AUTO kontrolleres via vs-headings-landmarks
    • page-has-heading-one AUTO kontrolleres via vs-headings-landmarks
    • vs-headings-landmarks AUTO
    Filtyper, den ændrer
    .php
    gives the home page its <h1> and fixes the teaser and widget title levels Eksempeldata

    front-page.php Ændringer i front-page.php: 2 tilføjet, 2 fjernet

    Ændringer i front-page.php: 2 tilføjet, 2 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <p class="kb-intro__title"><?php esc_html_e( 'Woollen outdoor clothing, made to last', 'kestrel-birch' ); ?></p>
    27 Tilføjet <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 Fjernet <h4 class="kb-teaser__title"><?php echo esc_html( get_the_title( $kb_post ) ); ?></h4>
    47 Tilføjet <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 Ændringer i functions.php: 2 tilføjet, 2 fjernet

    Ændringer i functions.php: 2 tilføjet, 2 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet 'before_title' => '<h4 class="widget-title">',
    57 Fjernet 'after_title' => '</h4>',
    56 Tilføjet 'before_title' => '<h2 class="widget-title">',
    57 Tilføjet 'after_title' => '</h2>',
    58 58 )
    59 59 );
    60 60 }
    moves the checkout section headings from h3 to h2, as in the fixed checkout Eksempeldata

    woocommerce/checkout/form-billing.php Ændringer i woocommerce/checkout/form-billing.php: 1 tilføjet, 1 fjernet

    Ændringer i woocommerce/checkout/form-billing.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    15 15 defined( 'ABSPATH' ) || exit;
    16 16 ?>
    17 17 <div class="woocommerce-billing-fields">
    18 Fjernet <h3><?php esc_html_e( 'Billing details', 'woocommerce' ); ?></h3>
    18 Tilføjet <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 Ændringer i woocommerce/checkout/form-checkout.php: 1 tilføjet, 1 fjernet

    Ændringer i woocommerce/checkout/form-checkout.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    26 26 </div>
    27 27 </div>
    28 28
    29 Fjernet <h3 id="order_review_heading"><?php esc_html_e( 'Your order', 'woocommerce' ); ?></h3>
    29 Tilføjet <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 Ændringer i woocommerce/checkout/form-shipping.php: 2 tilføjet, 2 fjernet

    Ændringer i woocommerce/checkout/form-shipping.php: 2 tilføjet, 2 fjernet
    Linje før Linje efter Ændring Kode
    16 16 defined( 'ABSPATH' ) || exit;
    17 17 ?>
    18 18 <div class="woocommerce-shipping-fields">
    19 Fjernet <h3><?php esc_html_e( 'Shipping details', 'kestrel-birch' ); ?></h3>
    19 Tilføjet <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 Fjernet <h3><?php esc_html_e( 'Additional information', 'woocommerce' ); ?></h3>
    32 Tilføjet <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 ) {

Tastaturbrug og fokus

  • En synlig fokusmarkering focus-visible-styles Én markering af tastaturfokus i en farve fra temaet eller en nuance af den med en kontrast på mindst 3:1 mod sidens baggrund.

    Temaets hovedstilark får én markering af tastaturfokus: en ubrudt streg på 2 pixels, 2 pixels fra elementet, i en farve, som temaet allerede bruger. Det er en farvevariabel, hvis navn nævner focus, accent, brand, primary eller link, ellers farven på links eller på brødteksten. Den første af dem med en kontrast på mindst 3:1 mod sidens baggrund bruges; hvis ingen af dem har det, gøres den første lysere eller mørkere i samme farvetone, indtil den når det. På mørke områder med lys tekst, for eksempel en mørk topbjælke, får markeringen den lyse tekstfarve. En outline: none ved fokus, der ikke efterlader noget i stedet, fjernes fra temaets regler; regler, der kun skjuler markeringen ved museklik, bevares. Et tema, der allerede har en synlig fokusmarkering og ingen regel, der skjuler den, bliver, som det er.

    Regler, den dækker
    • vs-focus-visible AUTO
    Filtyper, den ændrer
    .css
    replaces the outline reset of the fixture theme with a brand-coloured outline Eksempeldata

    assets/css/main.css Ændringer i assets/css/main.css: 9 tilføjet, 3 fjernet

    Ændringer i assets/css/main.css: 9 tilføjet, 3 fjernet
    Linje før Linje efter Ændring Kode
    137 137 box-shadow: 0 0 0 2px var(--kb-ink);
    138 138 }
    139 139
    140 Fjernet /* VALIDISCAN-SEED vs-focus-visible: "remove the ugly focus ring" - nothing replaces it. */
    141 Fjernet :focus {
    142 Fjernet outline: none !important;
    140 Tilføjet /* validiscan:focus-visible-styles */
    141 Tilføjet :focus-visible {
    142 Tilføjet outline: 2px solid var(--kb-focus);
    143 Tilføjet outline-offset: 2px;
    143 144 }
    144 145
    146 Tilføjet .kb-topbar :focus-visible {
    147 Tilføjet outline-color: #fff;
    148 Tilføjet }
    149 Tilføjet /* /validiscan:focus-visible-styles */
    150 Tilføjet
    145 151 /* Buttons ------------------------------------------------------------------ */
    146 152
    147 153 .button,
  • En tab-rækkefølge, der følger siden remove-positive-tabindex Et tabindex over 0 på det skabelontag, der udskriver det rapporterede element, fjernes eller sættes til 0; et, som PHP-kode udskriver, eller som et script sætter, overlades til et menneske.

    Et tabindex over 0 trækker et element forrest i tastaturrækkefølgen. Opskriften fjerner det fra links, knapper og formularfelter, som alligevel kan få fokus, og sætter det til 0 på andre elementer, så de stadig kan nås, mens Tab-tasten følger sidens rækkefølge. Kun det tag i skabelonen, der udskriver det rapporterede element, ændres. Et tabindex, som PHP-kode udskriver, eller som et script sætter, overlades til et menneske.

    Regler, den dækker
    • tabindex AUTO
    • vs-focus-order MANUAL
    Filtyper, den ændrer
    .php
    removes tabindex="1" from the header search field of the fixture theme Eksempeldata

    header.php Ændringer i header.php: 1 tilføjet, 1 fjernet

    Ændringer i header.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <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 Tilføjet <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">
  • Betjeningselementer, der kun virker med mus, bliver til knapper button-semantics I et cookiebanner eller et slideshow i dit tema bliver klikbare elementer, der kun virker med en mus, til rigtige knapper, medmindre temaets stilregler eller scripts udpeger dem via tagnavnet.

    Inde i et cookiebanner eller et slideshow, der er en del af dit tema, bliver klikbare <span>-, <div>-, <li>- eller <i>-elementer, som kun virker med en mus, til rigtige <button>-elementer. Hver klasse og hver attribut bevares, så temaets stilregler og scripts fortsat virker, og Enter og mellemrumstasten gør nu det samme som et klik. En kort nulstilling af stilen for netop de klasser bevarer deres udseende. En knap med kun et ikon i samme banner eller slideshow får et navn på engelsk, som beskrevet under ikonnavnene nedenfor. Et element, som intet script lytter til, som temaets stilregler eller scripts udpeger via tagnavnet, eller som er tomt og har et uklart formål, bliver, som det er.

    Regler, den dækker
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Filtyper, den ændrer
    .css.php
    turns the click-only cookie choices into buttons and names the close button Eksempeldata

    assets/css/main.css Ændringer i assets/css/main.css: 17 tilføjet, 0 fjernet

    Ændringer i assets/css/main.css: 17 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    766 766 gap: 0.75rem;
    767 767 }
    768 768
    769 Tilføjet /* validiscan:button-semantics */
    770 Tilføjet /* Controls that became <button>s: keep the look of the elements they replace. The theme
    771 Tilføjet rules for these classes follow and still win. */
    769 772 .kb-cookie-bar__settings,
    770 773 .kb-cookie-bar__accept {
    774 Tilføjet margin: 0;
    775 Tilføjet padding: 0;
    776 Tilføjet border: 0;
    777 Tilføjet background: none;
    778 Tilføjet color: inherit;
    779 Tilføjet font: inherit;
    780 Tilføjet line-height: inherit;
    781 Tilføjet text-align: inherit;
    782 Tilføjet cursor: pointer;
    783 Tilføjet }
    784 Tilføjet /* /validiscan:button-semantics */
    785 Tilføjet
    786 Tilføjet .kb-cookie-bar__settings,
    787 Tilføjet .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 Ændringer i template-parts/cookie-bar.php: 3 tilføjet, 3 fjernet

    Ændringer i template-parts/cookie-bar.php: 3 tilføjet, 3 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <span class="kb-cookie-bar__settings" data-kb-consent="settings"><?php esc_html_e( 'Cookie settings', 'kestrel-birch' ); ?></span>
    25 Fjernet <span class="kb-cookie-bar__accept" data-kb-consent="accept"><?php esc_html_e( 'Accept', 'kestrel-birch' ); ?></span>
    26 Fjernet <button type="button" class="kb-cookie-bar__close" data-kb-consent="close"><?php kb_icon( 'close' ); ?></button>
    24 Tilføjet <button class="kb-cookie-bar__settings" data-kb-consent="settings" type="button"><?php esc_html_e( 'Cookie settings', 'kestrel-birch' ); ?></button>
    25 Tilføjet <button class="kb-cookie-bar__accept" data-kb-consent="accept" type="button"><?php esc_html_e( 'Accept', 'kestrel-birch' ); ?></button>
    26 Tilføjet <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, klikflader og kontrast

  • Zoom tilladt på mobilen meta-viewport-zoom Viewport-tagget mister user-scalable=no og en maximum-scale under 2, så besøgende igen kan zoome ind på din webshop med to fingre, medmindre PHP beregner taggets indhold, eller et plugin udskriver det.

    Opskriften fjerner user-scalable=no og en maximum-scale under 2 fra viewport-tagget, i header-skabelonerne eller i den PHP-kode, der udskriver tagget, så besøgende igen kan zoome ind på din webshop med to fingre. For axe-cores strengere regel meta-viewport-large fjernes enhver maximum-scale under 5. De øvrige viewport-indstillinger forbliver nøjagtig, som de var. Et viewport-tag, hvis indhold PHP beregner, eller som et plugin udskriver, overlades til et menneske.

    Regler, den dækker
    • meta-viewport AUTO
    • meta-viewport-large AUTO
    Filtyper, den ændrer
    .php
    re-enables zoom in every header template of the fixture theme Eksempeldata

    header-checkout.php Ændringer i header-checkout.php: 1 tilføjet, 1 fjernet

    Ændringer i header-checkout.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    12 12 <head>
    13 13 <meta charset="<?php bloginfo( 'charset' ); ?>">
    14 14 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled. ?>
    15 Fjernet <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    15 Tilføjet <meta name="viewport" content="width=device-width, initial-scale=1">
    16 16 <?php wp_head(); ?>
    17 17 </head>
    18 18

    header.php Ændringer i header.php: 1 tilføjet, 1 fjernet

    Ændringer i header.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
    17 Tilføjet <meta name="viewport" content="width=device-width, initial-scale=1">
    18 18 <?php wp_head(); ?>
    19 19 </head>
    20 20
  • Større klikflader target-size-padding Faste bredder eller højder under 24 pixels på betjeningselementer, som scanningen fandt for små, hæves til 24 pixels.

    Betjeningselementer, som scanningen fandt mindre end 24 × 24 pixels, for eksempel ikoner til sociale medier, farveprøver eller knapper til antal, får den minimumsstørrelse. Opskriften finder de stilregler i stilarkene, der giver netop de elementer en fast bredde eller højde under 24 pixels, og hæver den til 24 pixels; hvor elementet placerer sit ikon med flexbox eller grid, centreres ikonet, så det ikke sidder i et hjørne. Et betjeningselement, hvis størrelse kommer fra padding eller fra dets indhold, kan ikke måles ud fra stilarkene og overlades til et menneske.

    Regler, den dækker
    • vs-target-size AUTO
    Filtyper, den ændrer
    .css
    raises the social icons, quantity steppers and swatches of the fixture theme to 24 × 24 px Eksempeldata

    assets/css/main.css Ændringer i assets/css/main.css: 4 tilføjet, 2 fjernet

    Ændringer i assets/css/main.css: 4 tilføjet, 2 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet width: 18px;
    714 Fjernet height: 18px;
    713 Tilføjet width: 24px;
    714 Tilføjet height: 24px;
    715 715 color: var(--kb-ink);
    716 Tilføjet align-items: center;
    717 Tilføjet justify-content: center;
    716 718 }
    717 719
    718 720 .site-info {

    assets/css/woocommerce.css Ændringer i assets/css/woocommerce.css: 4 tilføjet, 4 fjernet

    Ændringer i assets/css/woocommerce.css: 4 tilføjet, 4 fjernet
    Linje før Linje efter Ændring Kode
    421 421
    422 422 /* VALIDISCAN-SEED vs-target-size: 18 x 18 px colour swatches, 4 px apart. */
    423 423 .kb-swatch {
    424 Fjernet width: 18px;
    425 Fjernet height: 18px;
    424 Tilføjet width: 24px;
    425 Tilføjet 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 Fjernet width: 18px;
    493 Fjernet height: 18px;
    492 Tilføjet width: 24px;
    493 Tilføjet height: 24px;
    494 494 padding: 0;
    495 495 border: 1px solid #b9b3aa;
    496 496 border-radius: 2px;
  • Tekstfarver med tilstrækkelig kontrast contrast-tokens En tekstfarve, der ikke består kontrastkontrollen, er defineret ét sted og ikke også bruges til baggrunde, kanter eller elementer, scanningen ikke målte, flyttes til den nærmeste nuance i samme farvetone, der opnår den krævede kontrast.

    Når en tekst ikke består kontrastkontrollen, og dens farve er defineret ét sted i temaets stilark, som en CSS-variabel eller som farven i den regel, der styler teksten, flyttes den farve til den nærmeste lysere eller mørkere nuance i samme farvetone, som opnår den kontrast, scanningen målte som krævet, på hver baggrund, den målte. En farve, der er defineret flere steder, der også ville ændre elementer, hvis kontrast scanningen ikke har målt, eller som temaet også bruger til baggrunde eller kanter, overlades til et menneske.

    Regler, den dækker
    • color-contrast ASSISTED
    Filtyper, den ændrer
    .css
    darkens the footer text colour when every element it styles was measured Eksempeldata

    assets/css/main.css Ændringer i assets/css/main.css: 1 tilføjet, 1 fjernet

    Ændringer i assets/css/main.css: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    676 676 .kb-footer-about,
    677 677 .kb-footer-newsletter-intro,
    678 678 .site-info {
    679 Fjernet color: #888;
    679 Tilføjet color: #6e6e6e;
    680 680 }
    681 681
    682 682 .site-footer ul.menu {

Bevægelse, slideshows og lyd

  • Mindre bevægelse, når en besøgende beder om det reduced-motion-guard For besøgende, hvis enhed beder om reduceret bevægelse, stopper animationer i deres slutstilling, og et slideshows automatiske afspilning, som temaets egne scripts starter, forbliver slået fra; bevægelse fra et plugin eller et inline-script ændres ikke.

    Når en besøgendes enhed er indstillet til at reducere bevægelse, lader en blok sidst i temaets hovedstilark hver animation køre én gang, for kort til at kunne ses, så den stopper i sin slutstilling; overgange bliver øjeblikkelige, og blød scrolling slås fra. Hvor temaets egne scripts starter et slideshows automatiske afspilning med Slick, Swiper, Splide, Owl eller Flickity, starter den automatiske afspilning kun for besøgende, der ikke har bedt om reduceret bevægelse. Bevægelse, der kommer fra et plugin eller et inline-script, ændres ikke.

    Regler, den dækker
    • vs-motion AUTO
    Filtyper, den ændrer
    .css
    guards the looping hero slide and sale badge animations of the fixture theme Eksempeldata

    assets/css/main.css Ændringer i assets/css/main.css: 13 tilføjet, 0 fjernet

    Ændringer i assets/css/main.css: 13 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    794 794 color: #999;
    795 795 cursor: pointer;
    796 796 }
    797 Tilføjet
    798 Tilføjet /* validiscan:reduced-motion-guard */
    799 Tilføjet @media (prefers-reduced-motion: reduce) {
    800 Tilføjet *,
    801 Tilføjet *::before,
    802 Tilføjet *::after {
    803 Tilføjet animation-duration: 0.01ms !important;
    804 Tilføjet animation-iteration-count: 1 !important;
    805 Tilføjet transition-duration: 0.01ms !important;
    806 Tilføjet scroll-behavior: auto !important;
    807 Tilføjet }
    808 Tilføjet }
    809 Tilføjet /* /validiscan:reduced-motion-guard */
  • En pauseknap til slideshows i bevægelse slider-pause-control Et slideshow i dit temas skabeloner, der bevæger sig af sig selv, får en synlig knap til pause og afspilning med tekst på engelsk, medmindre et plugin eller et inline-script styrer det.

    Et slideshow i dit temas skabeloner, der bevæger sig af sig selv, får en synlig knap til at sætte det på pause og afspille det igen, med teksterne »Pause slideshow« og »Play slideshow« på engelsk. Knappen bliver slideshowets første element, så tastaturbrugere når den før de enkelte slides. Et kort script i temaets hovedscriptfil forbinder knappen med sliderens egen automatiske afspilning: en CSS-animation i temaet, Slick, Swiper eller Flickity. For besøgende, hvis enhed beder om reduceret bevægelse, starter slideshowet på pause. En slider, som et plugin eller et inline-script styrer, overlades til et menneske.

    Regler, den dækker
    • vs-carousel AUTO
    Filtyper, den ændrer
    .css.js.php
    adds a pause button to the CSS-animated hero slider of the fixture theme Eksempeldata

    assets/css/main.css Ændringer i assets/css/main.css: 28 tilføjet, 0 fjernet

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

    assets/js/theme.js Ændringer i assets/js/theme.js: 20 tilføjet, 0 fjernet

    Ændringer i assets/js/theme.js: 20 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    255 255 initCheckout();
    256 256 initShowPassword();
    257 257 })();
    258 Tilføjet
    259 Tilføjet /* validiscan:slider-pause-control */
    260 Tilføjet (function () {
    261 Tilføjet const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches;
    262 Tilføjet for (const slider of document.querySelectorAll('.hero-slider')) {
    263 Tilføjet const button = slider.querySelector('.hero-slider__pause');
    264 Tilføjet if (!button) continue;
    265 Tilføjet const pauseLabel = button.textContent;
    266 Tilføjet const playLabel = button.getAttribute('data-play-label') || pauseLabel;
    267 Tilføjet const set = (paused) => {
    268 Tilføjet slider.classList.toggle('is-paused', paused);
    269 Tilføjet button.textContent = paused ? playLabel : pauseLabel;
    270 Tilføjet };
    271 Tilføjet button.addEventListener('click', () => {
    272 Tilføjet set(!slider.classList.contains('is-paused'));
    273 Tilføjet });
    274 Tilføjet if (reduce) set(true);
    275 Tilføjet }
    276 Tilføjet })();
    277 Tilføjet /* /validiscan:slider-pause-control */

    template-parts/hero-slider.php Ændringer i template-parts/hero-slider.php: 1 tilføjet, 0 fjernet

    Ændringer i template-parts/hero-slider.php: 1 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    37 37 };
    38 38 ?>
    39 39 <div class="hero-slider" data-autoplay="true" data-interval="6000">
    40 Tilføjet <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
  • Ingen lyd, der starter af sig selv mute-autoplay En video i temaets skabeloner, der afspilles af sig selv, gøres lydløs, og lyd starter ikke længere af sig selv, medmindre et script starter den; på WooCommerce bruges opskriften ikke til fund fra vs-media.

    En video i temaets skabeloner, der afspilles af sig selv, får muted og playsinline, så den fortsætter med at spille lydløst og afspilles inde på siden på iPhones i stedet for i fuld skærm; hvor videoen har betjeningsknapper, kan de besøgende stadig slå lyden til. Lyd starter ikke længere af sig selv. Medier, som et script starter, overlades til et menneske. I en Validiscan-scanning rapporteres lyd, der starter af sig selv, af Validiscans mediekontrol vs-media, som erstatter den axe-core-regel, denne opskrift dækker; vs-media har niveau MANUAL (se listen længere nede), så et sådant fund på WooCommerce kommer med vejledning i stedet for denne ændring.

    Regler, den dækker
    • no-autoplay-audio AUTO kontrolleres via vs-media
    Filtyper, den ændrer
    .php
    mutes an autoplaying product video of the fixture theme Eksempeldata

    woocommerce/single-product/tabs/description.php Ændringer i woocommerce/single-product/tabs/description.php: 1 tilføjet, 1 fjernet

    Ændringer i woocommerce/single-product/tabs/description.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <video autoplay loop controls preload="none" poster="<?php echo esc_url( get_the_post_thumbnail_url( $kb_video, 'full' ) ); ?>" width="640" height="360">
    51 Tilføjet <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>

Formularer, priser og kurven

  • Etiketter knyttet til deres felter label-association En etiket, der allerede står i skabelonen, men ikke er knyttet til sit felt, bliver knyttet til det via for eller aria-labelledby.

    Et formularfelt, hvis etikettekst allerede står i skabelonen, men ikke er knyttet til feltet, bliver knyttet til det: Det <label>, der står lige før feltet eller lige efter et afkrydsningsfelt eller en radioknap, får en for, der peger på feltet, eller et tekstelement, der er markeret som etiket, knyttes via aria-labelledby. Skærmlæsere læser så etiketten op, når feltet får fokus, og et klik på et tilknyttet <label> flytter fokus til feltet. Et felt, der kun har en pladsholdertekst, overlades til et menneske, fordi det er en beslutning om indhold at skrive en etiket.

    Regler, den dækker
    • label AUTO kontrolleres via vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    Filtyper, den ændrer
    .php
    ties an unassociated coupon label to its field, as in the fixed cart Eksempeldata

    woocommerce/cart/cart.php Ændringer i woocommerce/cart/cart.php: 1 tilføjet, 1 fjernet

    Ændringer i woocommerce/cart/cart.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    62 62 <tr>
    63 63 <td colspan="6" class="actions">
    64 64 <div class="coupon">
    65 Fjernet <label class="screen-reader-text"><?php esc_html_e( 'Coupon:', 'woocommerce' ); ?></label>
    65 Tilføjet <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>
  • Felter i kassen og på kontoen, som browsere kan udfylde autocomplete-tokens Felter, der spørger efter oplysninger om kunden, får den matchende autocomplete-værdi, hvor koden viser deres formål; for WooCommerces felter til fakturering og levering sætter et filter i functions.php den.

    Felter i temaets skabeloner, der spørger efter oplysninger om kunden, for eksempel felter til login, registrering og kassen, får den autocomplete-værdi, der svarer til det, de spørger efter, for eksempel e-mail, brugernavn, nuværende eller ny adgangskode, for- og efternavn, virksomhed, adresse, postnummer, land eller telefonnummer. Værdien udledes af feltets type, navn, id og etiket. En værdi, der mangler, eller som er off eller ugyldig, erstattes; en gyldig bliver stående. WooCommerces egne felter til fakturering og levering udskrives af WooCommerce, ikke af temaet, så et filter i functions.php sætter deres værdier. Det kører efter temaets egne filtre for de felter, og de filtre kan fjerne værdierne. Felter, der ikke spørger efter personoplysninger, for eksempel felter til søgning, rabatkode eller antal, bliver, som de er, og det samme gælder et felt, hvis formål koden ikke viser.

    Regler, den dækker
    • autocomplete-valid AUTO kontrolleres via vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    Filtyper, den ændrer
    .php
    sets the tokens of the login, registration and checkout fields of the fixture theme Eksempeldata

    functions.php Ændringer i functions.php: 44 tilføjet, 0 fjernet

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

    woocommerce/myaccount/form-login.php Ændringer i woocommerce/myaccount/form-login.php: 3 tilføjet, 3 fjernet

    Ændringer i woocommerce/myaccount/form-login.php: 3 tilføjet, 3 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <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 Tilføjet <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 Fjernet <input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="off" onpaste="return false;">
    37 Tilføjet <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 Fjernet <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 Tilføjet <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
  • Ændringer i pris, lagerstatus og kurv bliver oplæst live-region-cart-variant Skærmlæsere læser den nye pris og lagerstatus for en valgt variant op, medmindre temaets script erstatter området i sin helhed, og, på engelsk, et produkt, der er lagt i eller fjernet fra kurven.

    Når en kunde vælger en anden størrelse eller farve, omskrives det område, der viser prisen og lagerstatussen for den valgte variant, på stedet. Det område bliver et live-område, så skærmlæsere læser den nye pris og lagerstatus op, uden at kunden behøver at gå derhen. Kurvlinket i sidehovedet erstattes i sin helhed, når et produkt lægges i kurven, så det ikke selv kan bære oplæsningen. Ved siden af tilføjer opskriften en visuelt skjult statusbesked, og en kort blok i temaets script skriver »Product added to your cart.« eller »Product removed from your cart.« ind i den, når WooCommerce melder ændringen. Begge beskeder tilføjes på engelsk. Et område, der allerede er eller ligger inde i et live-område, eller som temaets eget script erstatter i sin helhed, bliver, som det er.

    Regler, den dækker
    • vs-live-updates AUTO
    Filtyper, den ændrer
    .js.php
    adds a status region next to the header cart fragment and wires the theme script Eksempeldata

    assets/js/theme.js Ændringer i assets/js/theme.js: 15 tilføjet, 0 fjernet

    Ændringer i assets/js/theme.js: 15 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    255 255 initCheckout();
    256 256 initShowPassword();
    257 257 })();
    258 Tilføjet
    259 Tilføjet /* validiscan:live-region-cart-variant */
    260 Tilføjet // Announces cart changes in the status region next to the header cart (WCAG 4.1.3).
    261 Tilføjet (function () {
    262 Tilføjet const region = document.querySelector('[data-kb-cart-status]');
    263 Tilføjet if (!region || !window.jQuery) return;
    264 Tilføjet window.jQuery(document.body).on('added_to_cart removed_from_cart', (event) => {
    265 Tilføjet const message = region.getAttribute(event.type === 'added_to_cart' ? 'data-added' : 'data-removed');
    266 Tilføjet region.textContent = '';
    267 Tilføjet window.setTimeout(() => {
    268 Tilføjet region.textContent = message || '';
    269 Tilføjet }, 100);
    270 Tilføjet });
    271 Tilføjet })();
    272 Tilføjet /* /validiscan:live-region-cart-variant */

    header.php Ændringer i header.php: 1 tilføjet, 0 fjernet

    Ændringer i header.php: 1 tilføjet, 0 fjernet
    Linje før Linje efter Ændring Kode
    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 Tilføjet <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 Eksempeldata

    woocommerce/single-product/add-to-cart/variable.php Ændringer i woocommerce/single-product/add-to-cart/variable.php: 1 tilføjet, 1 fjernet

    Ændringer i woocommerce/single-product/add-to-cart/variable.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    65 65 </table>
    66 66
    67 67 <div class="single_variation_wrap">
    68 Fjernet <div class="woocommerce-variation single_variation">
    68 Tilføjet <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>

Navne til ikoner, billeder og indlejret indhold

  • Navne til knapper og links, der kun består af et ikon icon-accessible-name Knapper og links, der kun viser et ikon, får et navn på engelsk, der siger, hvad de gør, hvor koden viser deres formål.

    Knapper og links, der kun viser et ikon, får et navn, der siger, hvad de gør, hvor koden viser deres formål: ud fra ikonets eget navn, ud fra betjeningselementets klasse eller id eller ud fra, hvor et link fører hen, for eksempel kurven, kontosiden eller et socialt netværk. Eksempler er Search, Cart, My account, Show password, Close og Menu. Navnet er visuelt skjult tekst inde i betjeningselementet eller en aria-label, hvor temaet ikke har nogen klasse til skjult tekst, og det tilføjes på engelsk. Navne på sociale netværk er brandnavne og bliver, som de er. Et betjeningselement, hvis formål koden ikke viser, overlades til et menneske.

    Regler, den dækker
    • button-name ASSISTED
    • link-name ASSISTED
    Filtyper, den ændrer
    .php
    names the account link and the social links, and leaves the uncertain gallery link Eksempeldata

    header.php Ændringer i header.php: 1 tilføjet, 1 fjernet

    Ændringer i header.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <a class="kb-account-link" href="<?php echo esc_url( wc_get_page_permalink( 'myaccount' ) ); ?>"><?php kb_icon( 'user' ); ?></a>
    63 Tilføjet <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 Ændringer i template-parts/social-links.php: 1 tilføjet, 1 fjernet

    Ændringer i template-parts/social-links.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    17 17 ?>
    18 18 <ul class="kb-social">
    19 19 <?php foreach ( $kb_profiles as $kb_network => $kb_url ) : ?>
    20 Fjernet <a class="kb-social__link" href="<?php echo esc_url( $kb_url ); ?>"><?php kb_icon( $kb_network ); ?></a>
    20 Tilføjet <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 Eksempeldata

    header.php Ændringer i header.php: 1 tilføjet, 1 fjernet

    Ændringer i header.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <button type="submit" value="<?php echo esc_attr_x( 'Search', 'submit button', 'woocommerce' ); ?>" class="kb-search-submit"><?php kb_icon( 'search' ); ?></button>
    54 Tilføjet <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 Ændringer i woocommerce/myaccount/form-login.php: 1 tilføjet, 1 fjernet

    Ændringer i woocommerce/myaccount/form-login.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <button type="button" class="show-password-input"><?php kb_icon( 'eye' ); ?></button>
    38 Tilføjet <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 billeder skjult for skærmlæsere decorative-image-alt Kun billeder, som koden beviser er dekorative, får et tomt alt eller aria-hidden; tekstalternativet til ethvert andet billede overlades til et menneske.

    Et billede markeres kun som dekorativt, når koden beviser, at det ikke tilføjer noget: Det sidder i et link eller en knap, der har sin egen tekst, for eksempel et logo ved siden af webshoppens navn, det er et lille ikon ved siden af sin egen tekstetiket, eller det er en afstandsholder eller en skillelinje. Et <img> får så et tomt alt="", og et SVG-ikon får aria-hidden="true", så skærmlæsere springer det over i stedet for at læse en grafik uden navn op. Ethvert andet billede er indhold, og dets tekstalternativ overlades til et menneske.

    Regler, den dækker
    • image-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    Filtyper, den ændrer
    .php
    hides the logo mark inside the home link that has the shop name Eksempeldata

    header.php Ændringer i header.php: 1 tilføjet, 1 fjernet

    Ændringer i header.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    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 Fjernet <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 Tilføjet <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>
  • Titler til indlejrede kort og videoer iframe-title En indlejret ramme uden titel får en titel på engelsk, der siger, hvad den viser, hvor koden viser det.

    En indlejret ramme uden titel, for eksempel et kort eller en YouTube- eller Vimeo-video, får en titel på engelsk, der siger, hvad den viser. Opskriften henter den fra titlen på en indlejret fil i temaet, fra udbyderen i rammens adresse eller fra ord som map eller video i dens klasse eller id. En ramme, hvis indhold koden ikke viser, får ingen generisk titel; den overlades til et menneske.

    Regler, den dækker
    • frame-title AUTO
    Filtyper, den ændrer
    .php
    titles the store map iframe of the contact page from the embedded document Eksempeldata

    page-contact.php Ændringer i page-contact.php: 1 tilføjet, 1 fjernet

    Ændringer i page-contact.php: 1 tilføjet, 1 fjernet
    Linje før Linje efter Ændring Kode
    81 81
    82 82 <div class="kb-store-map">
    83 83 <?php // VALIDISCAN-SEED frame-title: the map iframe has no title. ?>
    84 Fjernet <iframe src="<?php echo esc_url( get_stylesheet_directory_uri() . '/assets/embeds/store-map.html' ); ?>" width="600" height="320" loading="lazy"></iframe>
    84 Tilføjet <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>
Detaljer: hvad opskrifterne retter, niveauerne og testtemaet

Validiscan har 20 opskrifter til WooCommerce-temaer. De retter sidestruktur og navigation, tastaturfokus, zoom, klikflader og kontrast, bevægelse og lyd, formularfelter og kurven samt navnene på ikoner, billeder og indlejrede rammer. En opskrift er en deterministisk ændring for én slags fejl: Den samme kode får altid den samme ændring. Hver af dem foretager kun en ændring, hvor temaets kode viser, hvad den rigtige ændring er; hvor den ikke gør det, ændrer opskriften intet, og fundet overlades til et menneske.

Under hver opskrift finder du de regler, den dækker, med hver regels niveau i Validiscans regelkatalog. AUTO betyder, at en opskrift er reglens standardrettelse. ASSISTED betyder, at rettelsen kræver en vurdering, så en ændring udarbejdes som udkast og gennemgås derefter. MANUAL betyder, at reglen kræver en persons beslutning, og at Validiscan giver vejledning i stedet for en kodeændring. I et projekt anvendes opskrifter på fund af regler på niveau AUTO. Hvor en opskrift også angiver en regel på niveau ASSISTED eller MANUAL, følger et fund af den regel i stedet ASSISTED- eller MANUAL-forløbet. En regel, der er markeret »kontrolleres via« en anden kontrol, køres ikke selvstændigt i en scanning: Den anden kontrol rapporterer den samme fejl.

Filtyperne og før-og-efter-visningen for hver opskrift stammer fra applikationens egne tests. De fleste kører på applikationens WooCommerce-testtema, et child-tema af temaet Storefront, hvor der med vilje er lagt tilgængelighedsfejl ind. De kommentarer, der er mærket VALIDISCAN-SEED, og som du ser i nogle diffs, markerer fejlene og findes kun i testtemaet. WordPress-sider kan ikke gengives i testmiljøet, så disse tests gengiver ikke sider: De kontrollerer selve ændringen som et før og efter af temaets filer. Dit temas filer ser anderledes ud.

Hvad forbliver på niveau MANUAL på WooCommerce?

Fejl, der kræver en beslutning om indhold eller adfærd, som en fast kodeændring ikke kan træffe, for eksempel undertekster og transskriptioner til dine videoer og din lyd, forbliver på niveau MANUAL på WooCommerce. For et fund på en MANUAL-regel giver Validiscan vejledning i, hvordan det rettes, ikke en ændring af din kode.

Reglerne herunder køres i scanninger og har niveau MANUAL på WooCommerce; regler for god praksis er ikke med på listen.

  • meta-refresh Forsinket genindlæsning under 20 timer må ikke bruges
  • nested-interactive Interaktive betjeningselementer må ikke være indlejret i hinanden
  • scrollable-region-focusable Scrollbare områder skal kunne nås med tastaturet
  • server-side-image-map Serverside-billedkort må ikke bruges
  • vs-keyboard-trap Tastaturfokus må aldrig sidde fast
  • vs-focus-order Fokusrækkefølgen skal følge den visuelle rækkefølge
  • vs-dragging Elementer, der kun kan betjenes ved at trække, skal have et alternativ med et enkelt klik eller tryk
  • vs-media Video skal have undertekster, lyd skal have en transskription, og intet må afspille lyd automatisk
  • vs-documents Linkede dokumenter skal gennemgås manuelt for tilgængelighed
Detaljer: kontrollen af fokusrækkefølgen, og hvad et projekt ikke omfatter

For et fund på en MANUAL-regel giver Validiscan vejledning i, hvordan det rettes, ikke en ændring af din kode. Disse fejl kræver en beslutning om indhold eller adfærd, som en fast kodeændring ikke kan træffe, for eksempel undertekster og transskriptioner til dine videoer og din lyd, en vej ud af en widget, hvor tastaturfokus sidder fast, en anden måde at bruge et betjeningselement på, som kun virker ved at trække, eller en gennemgang af linkede dokumenter som PDF-filer. Hvor et fund fra vs-focus-order kommer fra et tabindex over 0 i en temaskabelon, fjerner opskriften om tab-rækkefølgen ovenfor det.

Arbejdet med fund på niveau MANUAL, der kræver dine egne beslutninger om indhold, er ikke en del af et projekt, og det samme gælder PDF-filer. Mellem reglerne på niveau AUTO og dem på niveau MANUAL ligger reglerne på niveau ASSISTED, for eksempel tekstalternativer til produktbilleder eller navne til knapper: Deres rettelser kræver en vurdering, og Validiscan gennemgår hver rettelse, før den leveres. Hvad automatiseret test af webtilgængelighed kan og ikke kan bevise

Hvad stiller du til rådighed?

Du sørger for skriftlig tilladelse til en fuld scanning, én vej ind i dit tema, dit svar om AI-udkast til ASSISTED-rettelser, en udvikler eller et bureau, der gennemgår og sætter ændringerne live, dine beslutninger om det, der forbliver MANUAL, og til en anderssproget webshop oversættelser af den nye engelske tekst.

  1. Skriftlig tilladelse til en fuld scanning af din webshop. En fuld scanning lægger et produkt i kurven og åbner det første trin i kassen uden at gennemføre et køb eller indtaste betalingsoplysninger.
  2. Én vej ind i dit tema: adgang til det GitHub-repository, der rummer dit tema eller child-tema, eller en ZIP-fil med temamappen, uploadet i kundeportalen.
  3. Dit svar på, om AI må udarbejde rettelser på niveau ASSISTED. AI-udkast er slået fra, indtil du siger ja.
  4. En udvikler eller et bureau, der gennemgår ændringerne, merger pull requesten eller anvender patchpakken og sætter temaet live.
  5. Oversættelser af den nye engelske tekst, hvis din webshop er på et andet sprog.
  6. Dine beslutninger om det, der forbliver MANUAL, for eksempel undertekster til dine videoer.
Detaljer: når ændringerne er live, og hvad et projekt dækker

Når ændringerne er live, kontrollerer en verifikationsscanning de berørte sider igen, og Remediation Evidence Package registrerer resultatet. Sådan forløber et projekt, trin for trin

Et projekt dækker én webshop: ét domæne og ét tema.

Kilder

4 kilder, alle kontrolleret til denne side den 6. oktober 2026.

WooCommerces og WordPress’ udvikler­dokumentation 4
  1. Template structure & Overriding templates via a theme · WooCommerce · kontrolleret
  2. language_attributes() · WordPress.org · kontrolleret
  3. Localization (Common APIs Handbook) · WordPress.org · kontrolleret
  4. Templates (Theme Handbook) · WordPress.org · kontrolleret

Begynd med et gratis tjek af din webshop.

Send din webshops adresse. Validiscan scanner den og svarer med hver fejl, scanningen kan påvise, med siden og koden.

Bestil et gratis tjek

Eller skriv til info@validiscan.com.

Hvad det gratis tjek omfatter, og hvad det udelader
Du sender
din webshops adresse
Sider, der scannes
op til 15
Du får
hver fejl, scanningen kan påvise, med siden og koden
På din webshop
kun offentlige sider; intet login, intet købt, ingen formularer sendt
Hvad det ikke er
et fuldt audit

Skriv til Validiscan

Til et gratis tjek skal du skrive din webshops adresse og platform.

Validiscan bruger det, du sender, til at svare dig. Privatlivspolitik