Correcciones de accesibilidad en el código de su tema de WooCommerce
Validiscan corrige los fallos de accesibilidad de su tema de WordPress o tema hijo: sus plantillas PHP, incluidas las plantillas de WooCommerce que sobrescribe, y sus hojas de estilos y scripts. Nada llega a su tienda en producción hasta que usted o su desarrollador fusionen o apliquen los cambios y pongan el tema en producción.
Última actualización:
En esta página: 7 respuestas
¿Qué cambia Validiscan en un tema de WooCommerce?
Validiscan modifica los archivos propios de su tema y nada más: plantillas PHP, incluidas las plantillas de WooCommerce que sobrescribe, functions.php, hojas de estilos y scripts. Un cambio en archivos que no sean PHP, CSS, SCSS, JavaScript, HTML o JSON no supera las comprobaciones de Validiscan, y ninguna corrección añade un plugin ni un overlay.
Las recetas están escritas para los temas clásicos de WordPress, construidos con plantillas PHP, no para los temas de bloques, cuyas plantillas son archivos HTML. En un tema de bloques, un fallo que ninguna receta corrige queda en manos de una persona, y una plantilla modificada en el Editor del sitio se guarda en la base de datos del sitio, así que un cambio en los archivos del tema no llega a ella (el Theme Handbook de WordPress sobre las plantillas). Las recetas solo cambian el marcado allí donde lo imprimen los archivos del tema que Validiscan recibe. El marcado que imprimen otros archivos, como los de WordPress, WooCommerce, otro plugin o un tema padre que no forma parte de ese código fuente, queda en manos de una persona; un banner de cookies añadido por un plugin de consentimiento es un ejemplo. Una excepción son los campos de facturación y de envío propios de WooCommerce: un filtro en el functions.php de su tema establece sus valores de autocompletado (véase la receta más abajo).
Detalles: qué archivos puede tocar un cambio, las comprobaciones de cada cambio y qué puede añadir una corrección
Validiscan modifica los archivos propios de su tema y nada más: las plantillas PHP, incluidas las plantillas de WooCommerce que su tema sobrescribe en su carpeta woocommerce (la documentación de WooCommerce sobre cómo sobrescribir plantillas), el functions.php, las hojas de estilos y los scripts del tema. Un cambio solo puede afectar a archivos PHP, CSS, SCSS, JavaScript, HTML y JSON, y nunca a un archivo de una carpeta vendor, node_modules, wp-admin o wp-includes de nivel superior. Un cambio en cualquier otro archivo no supera las comprobaciones de Validiscan y no se puede aprobar. Además, cada archivo PHP modificado pasa por la propia comprobación de sintaxis de PHP (php -l), que lee el archivo sin ejecutarlo. Las recetas nunca editan un archivo .min.css o .min.js minificado, que es el resultado de una compilación.
Cada cambio es una edición corriente de un archivo del tema que su desarrollador puede leer línea por línea. Unas pocas correcciones añaden algunas líneas al propio script del tema, por ejemplo para conectar un botón de pausa con un carrusel o para anunciar un cambio en el carrito. Ninguna corrección añade un plugin ni un overlay, y no se inyecta nada que corrija sus páginas en el navegador del visitante. Los elementos incrustados de terceros, como los widgets de pago o de chat, no están incluidos en un proyecto.
¿Cómo accede Validiscan a su tema de WooCommerce?
Validiscan llega a su tema de WooCommerce de una de dos maneras: a través del repositorio de GitHub que lo contiene o a partir de un ZIP de la carpeta del tema que usted sube. La vía adecuada depende de dónde esté el código de su tema, y también determina cómo le llegan los cambios.
| Vía de acceso | Lo que usted da | Los cambios vuelven como |
|---|---|---|
| A través de su repositorio de GitHub | Acceso al repositorio que contiene su tema o su tema hijo, mediante la GitHub App de Validiscan o un token de acceso | Un pull request |
| Desde un ZIP de la carpeta de su tema | La carpeta de su tema en wp-content/, con el tema hijo incluido si utiliza uno, como un único archivo ZIP de hasta 100 MB, que sube en el portal del cliente un administrador de su organización | Un paquete de parches |
A través de su repositorio de GitHub
Si su tema o su tema hijo está en un repositorio de GitHub, usted da a Validiscan acceso a ese repositorio. Instala en él la GitHub App de Validiscan o entrega a Validiscan un token de acceso, que Validiscan guarda cifrado. La App pide acceso de lectura y escritura al contenido y a los pull requests del repositorio, y acceso de lectura a sus metadatos. Las recetas esperan encontrar el style.css y el functions.php del tema en el nivel superior del repositorio, así que el repositorio debe contener la carpeta del propio tema, no una instalación completa de WordPress. Los cambios llegan entonces como un pull request.
Desde un ZIP de la carpeta de su tema
Si su tema no está en un repositorio, el portal del cliente le pide que encargue a su desarrollador un ZIP de la carpeta de su tema en wp-content/themes, con el tema hijo incluido si utiliza uno. Después, un administrador de su organización lo sube en el portal del cliente, como un único archivo ZIP de hasta 100 MB. Validiscan prepara los cambios en esa copia de su tema y envía el resultado a su desarrollador como un paquete de parches. Dónde van las correcciones en un tema de WooCommerce y qué puede deshacer una actualización del tema
¿Cómo llegan los cambios a su tienda?
Validiscan solo entrega cambios que ha revisado y aprobado, como un pull request o como un paquete de parches, y ninguno de los dos toca su tienda WooCommerce en producción. Aplicar los cambios y ponerlos en producción es tarea suya o de su desarrollador; la entrega como copia sin publicar del tema existe solo en Shopify.
- Validiscan entrega los cambios que ha revisado y aprobado: un pull request en una rama nueva o un paquete de parches para su desarrollador.
- Su desarrollador o su agencia revisa los cambios. En un pull request, la lista de comprobación pide un entorno de preproducción o de vista previa, no la tienda en producción, y manejar los elementos modificados solo con el teclado.
- Usted o su desarrollador fusionan el pull request, o aplican el paquete de parches y prueban los cambios.
- Usted o su desarrollador ponen el tema en producción.
- Cuando los cambios están en producción, un escaneo de verificación vuelve a comprobar las páginas afectadas.
Un pull request
Con acceso a su repositorio, Validiscan crea una rama nueva llamada validiscan/, registra cada corrección en un commit propio y abre un pull request con una tabla resumen, una explicación de cada cambio y una lista de comprobación para la revisión. No se sube nada a su rama predeterminada. La lista de comprobación pide a su desarrollador que despliegue la rama en un entorno de preproducción o de vista previa, no en la tienda en producción, y que maneje los elementos modificados solo con el teclado. Fusionar y desplegar queda en sus manos.
Un paquete de parches
A partir de una carpeta de tema subida, Validiscan prepara un archivo zip para su desarrollador. Contiene PATCH.md, con cada cambio y cómo aplicarlo; todos los cambios en un único archivo de parche que se aplica con git apply; un archivo de parche por corrección; los archivos modificados completos y un README.md. Su desarrollador aplica los cambios, los prueba y pone el tema en producción. Qué contienen un pull request y un paquete de parches
¿Se añade texto nuevo en el idioma de su tienda?
Solo en inglés. Las recetas de Validiscan para WooCommerce añaden el texto nuevo como una cadena traducible en el dominio de texto de su tema, y no añaden traducciones. Si su tienda está en alemán o en otro idioma, traducir el texto nuevo corresponde a su desarrollador.
- Regenerar el archivo
.potdel tema - Añadir las traducciones a sus archivos
.po - Compilar los archivos
.moque lee WordPress
Detalles: qué texto añaden las recetas y cómo lee WordPress las traducciones
Las recetas de Validiscan para WooCommerce solo añaden texto nuevo en inglés. Cuando una receta añade texto para los visitantes, como las palabras de un enlace para saltar al contenido, la etiqueta de un botón de pausa o el nombre de un botón de icono, lo añade como una cadena traducible en el dominio de texto de su tema, y no añade traducciones. En Shopify, Shopware y Magento las recetas también pueden añadir texto en alemán; en WooCommerce no.
Si su tienda está en alemán o en otro idioma, traducir el texto nuevo corresponde a su desarrollador: regenerar el archivo .pot del tema, añadir las traducciones a sus archivos .po y compilar los archivos .mo que lee WordPress, como describe la documentación de WordPress sobre localización. Las recetas de más abajo indican dónde añaden texto.
¿Qué cambian las recetas en un tema de WooCommerce?
Cada una de las 20 recetas de Validiscan para temas de WooCommerce es un cambio determinista para un tipo de fallo: el mismo código recibe siempre el mismo cambio. Una receta hace un cambio solo donde el código del tema muestra cuál es el cambio correcto; si no, el hallazgo queda en manos de una persona.
Estructura de la página y navegación
-
Idioma de la página según los ajustes de WordPress html-lang Una plantilla de cabecera cuyo elemento
<html>omite el idioma, o tiene un valorlangfijo que no es válido, recibelanguage_attributes()de WordPress, que imprime el idioma del sitio.La receta hace que el elemento
<html>de las plantillas de cabecera tome su idioma delanguage_attributes()de WordPress, que imprime el idioma del sitio, o el idioma que establece un plugin multilingüe, para que los lectores de pantalla pronuncien bien la página. A una plantilla de cabecera que omite el idioma se le añade la llamada, y un valorlangfijo que no es válido se sustituye por ella. Si el valor erróneo procede del ajuste «Idioma del sitio» (Site Language) de la administración de WordPress, la receta no cambia nada, porque eso es un ajuste y no código del tema. Cuando el tema ya lee un campo de idioma para cada página, por ejemplo para las páginas legales en alemán de una tienda en inglés, un filtro enfunctions.phpdeclara el idioma de esa página, y la cabecera y el pie del sitio conservan el idioma de la tienda. Sin un campo así, la receta no adivina el idioma.- Reglas que cubre
-
-
html-has-langAUTO se comprueba mediante vs-lang -
html-lang-validAUTO se comprueba mediante vs-lang -
vs-langAUTO
-
- Tipos de archivo que modifica
-
.php
adds language_attributes() to the checkout header of the fixture theme Datos de ejemplo header-checkout.php Cambios en header-checkout.php (líneas añadidas: 1; eliminadas: 1)
Cambios en header-checkout.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <html> 11 Añadida <html <?php language_attributes(); ?>> 12 12 <head> 13 13 <meta charset="<?php bloginfo( 'charset' ); ?>"> 14 14 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled. ?> -
Enlace para saltar al contenido, área principal y menús con nombre skip-link-main Un enlace para saltar al contenido donde una plantilla de cabecera no lo tiene, un área
<main>a partir del contenedor de contenido de la página donde no existe, y nombres para las áreas de navegación cuya finalidad se ve, todo en inglés.Cada plantilla de cabecera sin enlace para saltar al contenido recibe un enlace «Skip to content» justo después de la etiqueta
<body>de apertura, o después de la llamada awp_body_open()que la sigue. Permanece oculto hasta que recibe el foco y lleva al contenido de la página. Si su tema es un tema hijo de Storefront y ha desactivado los enlaces para saltar al contenido de Storefront, se vuelven a activar en lugar de añadir uno nuevo. Donde las plantillas todavía no tienen un área principal, el contenedor de contenido de las plantillas de página, un<div>con el idmaino con la clasesite-main, pasa a ser un elemento<main>, que lo marca como el área principal de la página; cuando los estilos o los scripts del tema seleccionan ese contenedor comodiv, se deja como está. Las áreas de navegación cuya finalidad se ve en su id o en su clase reciben un nombre, como «Primary navigation», «Breadcrumb», «Footer navigation» o «Pagination». Un enlace para saltar al contenido que ya existe y no apunta a ningún sitio pasa a apuntar al contenido. El texto del enlace y los nombres se añaden en inglés.- Reglas que cubre
-
-
bypassAUTO se comprueba mediante vs-headings-landmarks -
landmark-one-mainAUTO se comprueba mediante vs-headings-landmarks -
regionAUTO -
skip-linkAUTO -
vs-headings-landmarksAUTO -
landmark-uniqueASSISTED
-
- Tipos de archivo que modifica
-
.php
restores the skip links, adds <main> and labels the navigation of the fixture theme Datos de ejemplo 404.php Cambios en 404.php (líneas añadidas: 2; eliminadas: 2)
Cambios en 404.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 9 9 ?> 10 10 11 11 <div id="primary" class="content-area"> 12 Eliminada <div id="main" class="site-main"> 12 Añadida <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 Eliminada </div><!-- #main --> 25 Añadida </main><!-- #main --> 26 26 </div><!-- #primary --> 27 27 28 28 <?php archive-product.php Cambios en archive-product.php (líneas añadidas: 2; eliminadas: 2)
Cambios en archive-product.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 22 22 23 23 <div id="primary" class="content-area"> 24 24 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 25 Eliminada <div id="main" class="site-main"> 25 Añadida <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 Eliminada </div><!-- #main --> 49 Añadida </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 Cambios en front-page.php (líneas añadidas: 2; eliminadas: 2)
Cambios en front-page.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 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 Eliminada <div id="main" class="site-main"> 21 Añadida <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 Eliminada </div><!-- #main --> 65 Añadida </main><!-- #main --> 66 66 </div><!-- #primary --> 67 67 68 68 <?php functions.php Cambios en functions.php (líneas añadidas: 1; eliminadas: 4)
Cambios en functions.php (líneas añadidas: 1; eliminadas: 4) Línea anterior Línea nueva Cambio Código 32 32 * Storefront pieces the child theme does not use. 33 33 */ 34 34 function kb_remove_storefront_parts() { 35 Eliminada // VALIDISCAN-SEED vs-headings-landmarks: Storefront's "Skip to navigation / Skip to content" 36 Eliminada // links are removed because "they flash on the first Tab"; nothing replaces them. 37 Eliminada 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 Eliminada $defaults['wrap_before'] = '<div class="storefront-breadcrumb"><div class="col-full"><nav class="woocommerce-breadcrumb">'; 212 Añadida $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 Cambios en header-checkout.php (líneas añadidas: 1; eliminadas: 0)
Cambios en header-checkout.php (líneas añadidas: 1; eliminadas: 0) Línea anterior Línea nueva Cambio Código 18 18 19 19 <body <?php body_class(); ?>> 20 20 <?php wp_body_open(); ?> 21 Añadida <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 Cambios en header.php (líneas añadidas: 1; eliminadas: 1)
Cambios en header.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <nav id="site-navigation" class="main-navigation"> 77 Añadida <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 Cambios en page-contact.php (líneas añadidas: 2; eliminadas: 2)
Cambios en page-contact.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 24 24 25 25 <div id="primary" class="content-area"> 26 26 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 27 Eliminada <div id="main" class="site-main"> 27 Añadida <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 Eliminada </div><!-- #main --> 88 Añadida </main><!-- #main --> 89 89 </div><!-- #primary --> 90 90 91 91 <?php page.php Cambios en page.php (líneas añadidas: 2; eliminadas: 2)
Cambios en page.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 13 13 14 14 <div id="primary" class="content-area"> 15 15 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 16 Eliminada <div id="main" class="site-main"> 16 Añadida <main id="main" class="site-main"> 17 17 18 18 <?php 19 19 while ( have_posts() ) : 35 35 endwhile; 36 36 ?> 37 37 38 Eliminada </div><!-- #main --> 38 Añadida </main><!-- #main --> 39 39 </div><!-- #primary --> 40 40 41 41 <?php search.php Cambios en search.php (líneas añadidas: 2; eliminadas: 2)
Cambios en search.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 11 11 12 12 <div id="primary" class="content-area"> 13 13 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 14 Eliminada <div id="main" class="site-main"> 14 Añadida <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 Eliminada </div><!-- #main --> 39 Añadida </main><!-- #main --> 40 40 </div><!-- #primary --> 41 41 42 42 <?php single-product.php Cambios en single-product.php (líneas añadidas: 2; eliminadas: 2)
Cambios en single-product.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 13 13 14 14 <div id="primary" class="content-area"> 15 15 <?php // VALIDISCAN-SEED vs-headings-landmarks + region: <div> instead of <main>. ?> 16 Eliminada <div id="main" class="site-main"> 16 Añadida <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 Eliminada </div><!-- #main --> 23 Añadida </main><!-- #main --> 24 24 </div><!-- #primary --> 25 25 26 26 <?php -
Un título en cada página document-title-template Se repara lo que, en el tema, impide que aparezca el título de página que genera WordPress; un título de un plugin de SEO o de los ajustes propios de una página se deja como está.
WordPress genera por sí mismo el título de una página, a partir del nombre de la página o del producto, el número de página de una lista paginada y el nombre de la tienda. La receta repara lo que, en el tema, impide que ese título aparezca. Un filtro de título que devuelve un título personalizado, por ejemplo desde un campo de SEO, recurre al título generado cuando el campo está vacío. Un texto de
<title>fijo en una plantilla de cabecera se sustituye por el título que genera WordPress. En un tema que no es un tema hijo y no imprime ningún título, se activa enfunctions.phpla compatibilidad de WordPress con los títulos. Cuando el título procede de un plugin de SEO o de los ajustes propios de una página, la receta no cambia nada.- Reglas que cubre
-
-
document-titleAUTO
-
- Tipos de archivo que modifica
-
.php
lets the empty custom SEO title fall back to the generated title Datos de ejemplo functions.php Cambios en functions.php (líneas añadidas: 2; eliminadas: 1)
Cambios en functions.php (líneas añadidas: 2; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada return (string) get_post_meta( get_the_ID(), '_kb_seo_title', true ); 90 Añadida $custom_title = trim( (string) get_post_meta( get_the_ID(), '_kb_seo_title', true ) ); 91 Añadida return '' !== $custom_title ? $custom_title : $title; 91 92 } 92 93 return $title; 93 94 } -
Encabezados sin niveles omitidos heading-levels Un encabezado que se salta un nivel recibe el nivel siguiente al del encabezado anterior y conserva sus clases, salvo que los estilos o los scripts del tema lo seleccionen por su nivel.
Un encabezado que se salta un nivel, como un h4 justo después de un h2, recibe el nivel siguiente al del encabezado anterior, en la plantilla o en la cadena PHP que lo imprime. Los títulos de los widgets y los encabezados del pie de página o de una barra lateral pasan a h2. Cuando el salto procede de una plantilla de WooCommerce que se muestra justo después del título de la página, como «Billing details» y «Shipping details» en el proceso de pago, los encabezados del mismo nivel de las plantillas vecinas se mueven con él. Solo cambia el nivel: cada encabezado conserva sus clases, y un encabezado que los estilos o los scripts del tema seleccionan por su nivel se deja como está. Un encabezado sin clase adopta el aspecto que el tema da a su nuevo nivel. En una página sin encabezado principal, el elemento que ya tiene el aspecto de su título, con una clase de título fijada en al menos 24 píxeles, se convierte en el h1. Si una página no tiene ningún elemento así, la receta no añade ningún encabezado y lo deja en manos de una persona.
- Reglas que cubre
-
-
heading-orderAUTO se comprueba mediante vs-headings-landmarks -
page-has-heading-oneAUTO se comprueba mediante vs-headings-landmarks -
vs-headings-landmarksAUTO
-
- Tipos de archivo que modifica
-
.php
gives the home page its <h1> and fixes the teaser and widget title levels Datos de ejemplo front-page.php Cambios en front-page.php (líneas añadidas: 2; eliminadas: 2)
Cambios en front-page.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 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 Eliminada <p class="kb-intro__title"><?php esc_html_e( 'Woollen outdoor clothing, made to last', 'kestrel-birch' ); ?></p> 27 Añadida <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 Eliminada <h4 class="kb-teaser__title"><?php echo esc_html( get_the_title( $kb_post ) ); ?></h4> 47 Añadida <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 Cambios en functions.php (líneas añadidas: 2; eliminadas: 2)
Cambios en functions.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 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 Eliminada 'before_title' => '<h4 class="widget-title">', 57 Eliminada 'after_title' => '</h4>', 56 Añadida 'before_title' => '<h2 class="widget-title">', 57 Añadida 'after_title' => '</h2>', 58 58 ) 59 59 ); 60 60 } moves the checkout section headings from h3 to h2, as in the fixed checkout Datos de ejemplo woocommerce/checkout/form-billing.php Cambios en woocommerce/checkout/form-billing.php (líneas añadidas: 1; eliminadas: 1)
Cambios en woocommerce/checkout/form-billing.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 15 15 defined( 'ABSPATH' ) || exit; 16 16 ?> 17 17 <div class="woocommerce-billing-fields"> 18 Eliminada <h3><?php esc_html_e( 'Billing details', 'woocommerce' ); ?></h3> 18 Añadida <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 Cambios en woocommerce/checkout/form-checkout.php (líneas añadidas: 1; eliminadas: 1)
Cambios en woocommerce/checkout/form-checkout.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 26 26 </div> 27 27 </div> 28 28 29 Eliminada <h3 id="order_review_heading"><?php esc_html_e( 'Your order', 'woocommerce' ); ?></h3> 29 Añadida <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 Cambios en woocommerce/checkout/form-shipping.php (líneas añadidas: 2; eliminadas: 2)
Cambios en woocommerce/checkout/form-shipping.php (líneas añadidas: 2; eliminadas: 2) Línea anterior Línea nueva Cambio Código 16 16 defined( 'ABSPATH' ) || exit; 17 17 ?> 18 18 <div class="woocommerce-shipping-fields"> 19 Eliminada <h3><?php esc_html_e( 'Shipping details', 'kestrel-birch' ); ?></h3> 19 Añadida <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 Eliminada <h3><?php esc_html_e( 'Additional information', 'woocommerce' ); ?></h3> 32 Añadida <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 ) {
Uso del teclado y foco
-
Un contorno de foco visible focus-visible-styles Un contorno para el foco del teclado, en un color del tema o un tono de ese color, con un contraste de al menos 3:1 con el fondo de la página.
La hoja de estilos principal del tema recibe un contorno para el foco del teclado: de 2 píxeles, continuo, a 2 píxeles del elemento, en un color que el tema ya usa. Es una variable de color cuyo nombre indica
focus,accent,brand,primaryolink, o bien el color de los enlaces o del texto del cuerpo. Se usa el primero de ellos que tenga un contraste de al menos 3:1 con el fondo de la página; si ninguno lo tiene, el primero se aclara o se oscurece sin salir del mismo matiz hasta que lo alcanza. En las zonas oscuras con texto claro, como una barra superior oscura, el contorno toma el color del texto claro. Unoutline: noneen el foco que no deja nada en su lugar se elimina de las reglas del tema; las reglas que ocultan el contorno solo en los clics del ratón se mantienen. Un tema que ya tiene un contorno de foco visible, y ninguna regla que lo oculte, se deja como está.- Reglas que cubre
-
-
vs-focus-visibleAUTO
-
- Tipos de archivo que modifica
-
.css
replaces the outline reset of the fixture theme with a brand-coloured outline Datos de ejemplo assets/css/main.css Cambios en assets/css/main.css (líneas añadidas: 9; eliminadas: 3)
Cambios en assets/css/main.css (líneas añadidas: 9; eliminadas: 3) Línea anterior Línea nueva Cambio Código 137 137 box-shadow: 0 0 0 2px var(--kb-ink); 138 138 } 139 139 140 Eliminada /* VALIDISCAN-SEED vs-focus-visible: "remove the ugly focus ring" - nothing replaces it. */ 141 Eliminada :focus { 142 Eliminada outline: none !important; 140 Añadida /* validiscan:focus-visible-styles */ 141 Añadida :focus-visible { 142 Añadida outline: 2px solid var(--kb-focus); 143 Añadida outline-offset: 2px; 143 144 } 144 145 146 Añadida .kb-topbar :focus-visible { 147 Añadida outline-color: #fff; 148 Añadida } 149 Añadida /* /validiscan:focus-visible-styles */ 150 Añadida 145 151 /* Buttons ------------------------------------------------------------------ */ 146 152 147 153 .button, -
Un orden de tabulación que sigue el orden de la página remove-positive-tabindex Un
tabindexmayor que 0 en la etiqueta de la plantilla que genera el elemento notificado se elimina o se pone a 0; uno que imprime el código PHP o que establece un script queda en manos de una persona.Un
tabindexmayor que 0 lleva un elemento al principio del orden del teclado. La receta lo elimina de los enlaces, los botones y los campos de formulario, que pueden recibir el foco de todos modos, y lo pone a 0 en los demás elementos, de modo que siguen siendo alcanzables y la tecla Tab recorre la página en su orden. Solo se cambia la etiqueta de la plantilla que genera el elemento notificado. Untabindexque imprime el código PHP o que establece un script queda en manos de una persona.- Reglas que cubre
-
-
tabindexAUTO -
vs-focus-orderMANUAL
-
- Tipos de archivo que modifica
-
.php
removes tabindex="1" from the header search field of the fixture theme Datos de ejemplo header.php Cambios en header.php (líneas añadidas: 1; eliminadas: 1)
Cambios en header.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <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 Añadida <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, zonas táctiles y contraste
-
Zoom permitido en los móviles meta-viewport-zoom La etiqueta viewport pierde
user-scalable=noy unmaximum-scaleinferior a 2, para que los visitantes puedan volver a ampliar su tienda con el gesto de pellizco, salvo que PHP calcule el contenido de la etiqueta o la imprima un plugin.La receta elimina
user-scalable=noy cualquiermaximum-scaleinferior a 2 de la etiqueta viewport, en las plantillas de cabecera o en el código PHP que imprime la etiqueta, para que los visitantes puedan volver a ampliar su tienda con el gesto de pellizco. Para la regla más estrictameta-viewport-largede axe-core, se elimina cualquiermaximum-scaleinferior a 5. Los demás ajustes del viewport quedan exactamente como estaban. Una etiqueta viewport cuyo contenido calcula PHP, o que imprime un plugin, queda en manos de una persona.- Reglas que cubre
-
-
meta-viewportAUTO -
meta-viewport-largeAUTO
-
- Tipos de archivo que modifica
-
.php
re-enables zoom in every header template of the fixture theme Datos de ejemplo header-checkout.php Cambios en header-checkout.php (líneas añadidas: 1; eliminadas: 1)
Cambios en header-checkout.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 12 12 <head> 13 13 <meta charset="<?php bloginfo( 'charset' ); ?>"> 14 14 <?php // VALIDISCAN-SEED meta-viewport: zooming is disabled. ?> 15 Eliminada <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 15 Añadida <meta name="viewport" content="width=device-width, initial-scale=1"> 16 16 <?php wp_head(); ?> 17 17 </head> 18 18 header.php Cambios en header.php (líneas añadidas: 1; eliminadas: 1)
Cambios en header.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no"> 17 Añadida <meta name="viewport" content="width=device-width, initial-scale=1"> 18 18 <?php wp_head(); ?> 19 19 </head> 20 20 -
Zonas táctiles más grandes target-size-padding Los anchos o altos fijos inferiores a 24 píxeles de los controles que el escaneo encontró demasiado pequeños suben a 24 píxeles.
Los controles que el escaneo encontró con un tamaño inferior a 24 × 24 píxeles, como los iconos de redes sociales, las muestras de color o los botones de cantidad, reciben ese tamaño mínimo. La receta busca las reglas de las hojas de estilos que dan precisamente a esos elementos un ancho o un alto fijo inferior a 24 píxeles y lo sube a 24 píxeles; cuando el elemento maqueta su icono con flexbox o grid, el icono se centra para que no quede en una esquina. Un control cuyo tamaño procede del relleno (padding) o de su contenido no se puede medir a partir de las hojas de estilos y queda en manos de una persona.
- Reglas que cubre
-
-
vs-target-sizeAUTO
-
- Tipos de archivo que modifica
-
.css
raises the social icons, quantity steppers and swatches of the fixture theme to 24 × 24 px Datos de ejemplo assets/css/main.css Cambios en assets/css/main.css (líneas añadidas: 4; eliminadas: 2)
Cambios en assets/css/main.css (líneas añadidas: 4; eliminadas: 2) Línea anterior Línea nueva Cambio Código 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 Eliminada width: 18px; 714 Eliminada height: 18px; 713 Añadida width: 24px; 714 Añadida height: 24px; 715 715 color: var(--kb-ink); 716 Añadida align-items: center; 717 Añadida justify-content: center; 716 718 } 717 719 718 720 .site-info { assets/css/woocommerce.css Cambios en assets/css/woocommerce.css (líneas añadidas: 4; eliminadas: 4)
Cambios en assets/css/woocommerce.css (líneas añadidas: 4; eliminadas: 4) Línea anterior Línea nueva Cambio Código 421 421 422 422 /* VALIDISCAN-SEED vs-target-size: 18 x 18 px colour swatches, 4 px apart. */ 423 423 .kb-swatch { 424 Eliminada width: 18px; 425 Eliminada height: 18px; 424 Añadida width: 24px; 425 Añadida 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 Eliminada width: 18px; 493 Eliminada height: 18px; 492 Añadida width: 24px; 493 Añadida height: 24px; 494 494 padding: 0; 495 495 border: 1px solid #b9b3aa; 496 496 border-radius: 2px; -
Colores de texto con contraste suficiente contrast-tokens Un color de texto que no supera la comprobación de contraste, definido en un solo lugar y que no se usa también para fondos, bordes o elementos que el escaneo no midió, pasa al tono más próximo del mismo matiz que alcanza el contraste requerido.
Cuando un texto no supera la comprobación de contraste y su color está definido en un solo lugar de las hojas de estilos del tema, como una variable CSS o como el color de la regla que da estilo a ese texto, ese color pasa al tono más próximo, más claro o más oscuro, del mismo matiz que alcanza el contraste que el escaneo midió como necesario, sobre todos los fondos que midió. Un color que está definido en varios lugares, que cambiaría también elementos cuyo contraste el escaneo no midió, o que el tema usa también para fondos o bordes, queda en manos de una persona.
- Reglas que cubre
-
-
color-contrastASSISTED
-
- Tipos de archivo que modifica
-
.css
darkens the footer text colour when every element it styles was measured Datos de ejemplo assets/css/main.css Cambios en assets/css/main.css (líneas añadidas: 1; eliminadas: 1)
Cambios en assets/css/main.css (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 676 676 .kb-footer-about, 677 677 .kb-footer-newsletter-intro, 678 678 .site-info { 679 Eliminada color: #888; 679 Añadida color: #6e6e6e; 680 680 } 681 681 682 682 .site-footer ul.menu {
Movimiento, carruseles y sonido
-
Menos movimiento cuando el visitante lo pide reduced-motion-guard Para los visitantes cuyo dispositivo pide reducir el movimiento, las animaciones se detienen en su estado final y el avance automático que inician los propios scripts del tema no arranca; el movimiento de un plugin o de un script en línea no se modifica.
Cuando el dispositivo del visitante está configurado para reducir el movimiento, un bloque al final de la hoja de estilos principal del tema hace que cada animación se ejecute una sola vez, durante un tiempo demasiado breve para verse, de modo que se detiene en su estado final; las transiciones pasan a ser instantáneas y se desactiva el desplazamiento suave. Cuando los propios scripts del tema inician el avance automático de un carrusel, con Slick, Swiper, Splide, Owl o Flickity, el avance automático solo se inicia para los visitantes que no han pedido reducir el movimiento. El movimiento que procede de un plugin o de un script en línea no se modifica.
- Reglas que cubre
-
-
vs-motionAUTO
-
- Tipos de archivo que modifica
-
.css
guards the looping hero slide and sale badge animations of the fixture theme Datos de ejemplo assets/css/main.css Cambios en assets/css/main.css (líneas añadidas: 13; eliminadas: 0)
Cambios en assets/css/main.css (líneas añadidas: 13; eliminadas: 0) Línea anterior Línea nueva Cambio Código 794 794 color: #999; 795 795 cursor: pointer; 796 796 } 797 Añadida 798 Añadida /* validiscan:reduced-motion-guard */ 799 Añadida @media (prefers-reduced-motion: reduce) { 800 Añadida *, 801 Añadida *::before, 802 Añadida *::after { 803 Añadida animation-duration: 0.01ms !important; 804 Añadida animation-iteration-count: 1 !important; 805 Añadida transition-duration: 0.01ms !important; 806 Añadida scroll-behavior: auto !important; 807 Añadida } 808 Añadida } 809 Añadida /* /validiscan:reduced-motion-guard */ -
Un botón de pausa para los carruseles en movimiento slider-pause-control Un carrusel de las plantillas de su tema que se mueve por sí solo recibe un botón visible de pausa y reproducción, con texto en inglés, salvo que lo controle un plugin o un script en línea.
Un carrusel de las plantillas de su tema que se mueve por sí solo recibe un botón visible para ponerlo en pausa y reanudarlo, con los textos en inglés «Pause slideshow» y «Play slideshow». El botón pasa a ser el primer elemento del carrusel, de modo que quienes usan el teclado llegan a él antes que a las diapositivas. Un script breve en el archivo de script principal del tema conecta el botón con el avance automático del propio carrusel: una animación CSS del tema, Slick, Swiper o Flickity. Para los visitantes cuyo dispositivo pide reducir el movimiento, el carrusel empieza en pausa. Un carrusel que controla un plugin o un script en línea queda en manos de una persona.
- Reglas que cubre
-
-
vs-carouselAUTO
-
- Tipos de archivo que modifica
-
.css.js.php
adds a pause button to the CSS-animated hero slider of the fixture theme Datos de ejemplo assets/css/main.css Cambios en assets/css/main.css (líneas añadidas: 28; eliminadas: 0)
Cambios en assets/css/main.css (líneas añadidas: 28; eliminadas: 0) Línea anterior Línea nueva Cambio Código 508 508 background: var(--kb-navy); 509 509 } 510 510 511 Añadida /* validiscan:slider-pause-control */ 512 Añadida .hero-slider.is-paused .hero-slider__track { 513 Añadida animation-play-state: paused; 514 Añadida } 515 Añadida 516 Añadida @media (prefers-reduced-motion: reduce) { 517 Añadida .hero-slider__track { 518 Añadida animation-play-state: paused; 519 Añadida } 520 Añadida } 521 Añadida 522 Añadida .hero-slider__pause { 523 Añadida position: absolute; 524 Añadida top: 1rem; 525 Añadida right: 1rem; 526 Añadida z-index: 2; 527 Añadida min-height: 24px; 528 Añadida padding: 0.4em 0.9em; 529 Añadida border: 2px solid currentColor; 530 Añadida border-radius: 4px; 531 Añadida background: #ffffff; 532 Añadida color: var(--kb-ink); 533 Añadida font: inherit; 534 Añadida font-weight: 600; 535 Añadida cursor: pointer; 536 Añadida } 537 Añadida /* /validiscan:slider-pause-control */ 538 Añadida 511 539 .hero-slide img { 512 540 width: 100%; 513 541 aspect-ratio: 5 / 2; assets/js/theme.js Cambios en assets/js/theme.js (líneas añadidas: 20; eliminadas: 0)
Cambios en assets/js/theme.js (líneas añadidas: 20; eliminadas: 0) Línea anterior Línea nueva Cambio Código 255 255 initCheckout(); 256 256 initShowPassword(); 257 257 })(); 258 Añadida 259 Añadida /* validiscan:slider-pause-control */ 260 Añadida (function () { 261 Añadida const reduce = window.matchMedia('(prefers-reduced-motion: reduce)').matches; 262 Añadida for (const slider of document.querySelectorAll('.hero-slider')) { 263 Añadida const button = slider.querySelector('.hero-slider__pause'); 264 Añadida if (!button) continue; 265 Añadida const pauseLabel = button.textContent; 266 Añadida const playLabel = button.getAttribute('data-play-label') || pauseLabel; 267 Añadida const set = (paused) => { 268 Añadida slider.classList.toggle('is-paused', paused); 269 Añadida button.textContent = paused ? playLabel : pauseLabel; 270 Añadida }; 271 Añadida button.addEventListener('click', () => { 272 Añadida set(!slider.classList.contains('is-paused')); 273 Añadida }); 274 Añadida if (reduce) set(true); 275 Añadida } 276 Añadida })(); 277 Añadida /* /validiscan:slider-pause-control */ template-parts/hero-slider.php Cambios en template-parts/hero-slider.php (líneas añadidas: 1; eliminadas: 0)
Cambios en template-parts/hero-slider.php (líneas añadidas: 1; eliminadas: 0) Línea anterior Línea nueva Cambio Código 37 37 }; 38 38 ?> 39 39 <div class="hero-slider" data-autoplay="true" data-interval="6000"> 40 Añadida <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 -
Sin texto que parpadee ni se desplace remove-blink-marquee Los elementos
<blink>y<marquee>de las plantillas del tema pasan a ser elementos estáticos con el mismo contenido, las mismas clases y los mismos ids, de modo que ningún texto se mueve por sí solo.Los elementos
<blink>y<marquee>de las plantillas del tema, y de las cadenas PHP que los imprimen, pasan a ser elementos estáticos con el mismo contenido, las mismas clases y los mismos ids: un<span>para blink, un<div>para marquee o un<span>cuando el marquee está dentro de un párrafo. Los ajustes de desplazamiento del marquee se eliminan, de modo que ningún texto se mueve por sí solo. Un elemento que el código abre y cierra en lugares distintos queda en manos de una persona.- Reglas que cubre
-
-
blinkAUTO -
marqueeAUTO
-
- Tipos de archivo que modifica
-
.php
makes a marquee and a blink added to the fixture theme static Datos de ejemplo footer.php Cambios en footer.php (líneas añadidas: 1; eliminadas: 1)
Cambios en footer.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 31 31 <?php endfor; ?> 32 32 </div> 33 33 34 Eliminada <marquee class="kb-ticker" behavior="scroll" scrollamount="3"><?php esc_html_e( 'Free returns within 30 days', 'kestrel-birch' ); ?></marquee> 34 Añadida <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 Cambios en functions.php (líneas añadidas: 1; eliminadas: 1)
Cambios en functions.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada 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 Añadida 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 Datos de ejemplo functions.php Cambios en functions.php (líneas añadidas: 1; eliminadas: 1)
Cambios en functions.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 11 11 add_action( 'after_setup_theme', 'minimal_setup' ); 12 12 13 13 function minimal_sale() { 14 Eliminada echo '<p><blink class="sale">' . esc_html__( 'Sale', 'minimal' ) . '</blink></p>'; 14 Añadida echo '<p><span class="sale">' . esc_html__( 'Sale', 'minimal' ) . '</span></p>'; 15 15 } template-parts/notice.php Cambios en template-parts/notice.php (líneas añadidas: 3; eliminadas: 3)
Cambios en template-parts/notice.php (líneas añadidas: 3; eliminadas: 3) Línea anterior Línea nueva Cambio Código 1 1 <div class="notice"> 2 Eliminada <marquee class="notice__ticker" behavior="scroll" direction="left" scrollamount="4"> 2 Añadida <div class="notice__ticker"> 3 3 <?php esc_html_e( 'Free shipping this week', 'minimal' ); ?> 4 Eliminada </marquee> 5 Eliminada <blink><?php esc_html_e( 'New!', 'minimal' ); ?></blink> 4 Añadida </div> 5 Añadida <span><?php esc_html_e( 'New!', 'minimal' ); ?></span> 6 6 </div> -
Sin sonido que empiece por sí solo mute-autoplay Un vídeo de las plantillas del tema que se reproduce por sí solo se silencia y el audio deja de empezar por sí solo, salvo que lo inicie un script; en WooCommerce la receta no se usa para los hallazgos de
vs-media.Un vídeo de las plantillas del tema que se reproduce por sí solo recibe
mutedyplaysinline, de modo que sigue reproduciéndose en silencio y, en los iPhone, se reproduce dentro de la página en lugar de a pantalla completa; si el vídeo tiene controles, los visitantes siguen pudiendo activar el sonido. El audio que empieza por sí solo deja de hacerlo. Los medios que inicia un script quedan en manos de una persona. En un escaneo de Validiscan, el sonido que empieza por sí solo lo notifica la comprobación multimediavs-media, que sustituye a la regla de axe-core que cubre esta receta;vs-mediaes MANUAL (véase la lista de más abajo), así que en WooCommerce un hallazgo así viene con orientación en lugar de con este cambio.- Reglas que cubre
-
-
no-autoplay-audioAUTO se comprueba mediante vs-media
-
- Tipos de archivo que modifica
-
.php
mutes an autoplaying product video of the fixture theme Datos de ejemplo woocommerce/single-product/tabs/description.php Cambios en woocommerce/single-product/tabs/description.php (líneas añadidas: 1; eliminadas: 1)
Cambios en woocommerce/single-product/tabs/description.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <video autoplay loop controls preload="none" poster="<?php echo esc_url( get_the_post_thumbnail_url( $kb_video, 'full' ) ); ?>" width="640" height="360"> 51 Añadida <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>
Formularios, precios y carrito
-
Etiquetas conectadas a sus campos label-association Una etiqueta que ya está en la plantilla pero no está conectada con su campo se conecta, mediante
foroaria-labelledby.Un campo de formulario cuyo texto de etiqueta ya está en la plantilla, pero no está conectado con el campo, se conecta: el
<label>situado justo antes del campo, o justo después de una casilla de verificación o de un botón de opción, recibe unforque apunta al campo, o un elemento de texto marcado como etiqueta se conecta mediantearia-labelledby. Los lectores de pantalla leen entonces la etiqueta cuando el campo recibe el foco, y al hacer clic en un<label>conectado el foco pasa al campo. Un campo que solo tiene un placeholder queda en manos de una persona, porque redactar una etiqueta es una decisión de contenido.- Reglas que cubre
-
-
labelAUTO se comprueba mediante vs-forms-ecommerce -
select-nameASSISTED -
vs-forms-ecommerceAUTO
-
- Tipos de archivo que modifica
-
.php
ties an unassociated coupon label to its field, as in the fixed cart Datos de ejemplo woocommerce/cart/cart.php Cambios en woocommerce/cart/cart.php (líneas añadidas: 1; eliminadas: 1)
Cambios en woocommerce/cart/cart.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 62 62 <tr> 63 63 <td colspan="6" class="actions"> 64 64 <div class="coupon"> 65 Eliminada <label class="screen-reader-text"><?php esc_html_e( 'Coupon:', 'woocommerce' ); ?></label> 65 Añadida <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> -
Campos del proceso de pago y de la cuenta que los navegadores pueden rellenar autocomplete-tokens Los campos que piden datos del cliente reciben el valor de
autocompletecorrespondiente cuando el código muestra su finalidad; en los campos de facturación y de envío de WooCommerce lo establece un filtro enfunctions.php.Los campos de las plantillas del tema que piden datos del cliente, como los de inicio de sesión, registro y proceso de pago, reciben el valor de
autocompletecorrespondiente a lo que piden, como correo electrónico, nombre de usuario, contraseña actual o nueva, nombre y apellidos, empresa, dirección, código postal, país o número de teléfono. El valor se deduce del tipo, el nombre, el id y la etiqueta del campo. Se sustituye un valor que falta, que esoffo que no es válido; uno válido se conserva. Los campos de facturación y de envío propios de WooCommerce los imprime WooCommerce, no el tema, así que un filtro enfunctions.phpestablece sus valores. Se ejecuta después de los filtros propios del tema para esos campos, que pueden eliminar los valores. Los campos que no piden datos personales, como los de búsqueda, cupón o cantidad, se dejan como están, y lo mismo ocurre con un campo cuya finalidad no muestra el código.- Reglas que cubre
-
-
autocomplete-validAUTO se comprueba mediante vs-forms-ecommerce -
vs-forms-ecommerceAUTO
-
- Tipos de archivo que modifica
-
.php
sets the tokens of the login, registration and checkout fields of the fixture theme Datos de ejemplo functions.php Cambios en functions.php (líneas añadidas: 44; eliminadas: 0)
Cambios en functions.php (líneas añadidas: 44; eliminadas: 0) Línea anterior Línea nueva Cambio Código 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 Añadida 312 Añadida /* validiscan:autocomplete-tokens */ 313 Añadida /** 314 Añadida * Autocomplete tokens for the WooCommerce address fields, so browsers and assistive 315 Añadida * technology know what each field asks for (WCAG 1.3.5). Runs after the theme's own 316 Añadida * field filters. 317 Añadida * 318 Añadida * @param array $fields Checkout fields (grouped by section) or one address section. 319 Añadida * @return array 320 Añadida */ 321 Añadida function kb_address_autocomplete( $fields ) { 322 Añadida $tokens = array( 323 Añadida 'first_name' => 'given-name', 324 Añadida 'last_name' => 'family-name', 325 Añadida 'company' => 'organization', 326 Añadida 'country' => 'country', 327 Añadida 'address_1' => 'address-line1', 328 Añadida 'address_2' => 'address-line2', 329 Añadida 'city' => 'address-level2', 330 Añadida 'state' => 'address-level1', 331 Añadida 'postcode' => 'postal-code', 332 Añadida 'phone' => 'tel', 333 Añadida 'email' => 'email', 334 Añadida ); 335 Añadida foreach ( $fields as $key => $field ) { 336 Añadida if ( ! is_array( $field ) ) { 337 Añadida continue; 338 Añadida } 339 Añadida if ( 'billing' === $key || 'shipping' === $key ) { 340 Añadida $fields[ $key ] = kb_address_autocomplete( $field ); 341 Añadida continue; 342 Añadida } 343 Añadida if ( ! preg_match( '/^(billing|shipping)_(.+)$/', (string) $key, $match ) || ! isset( $tokens[ $match[2] ] ) ) { 344 Añadida continue; 345 Añadida } 346 Añadida $fields[ $key ]['autocomplete'] = ( 'shipping' === $match[1] ? 'shipping ' : '' ) . $tokens[ $match[2] ]; 347 Añadida unset( $fields[ $key ]['custom_attributes']['autocomplete'] ); 348 Añadida } 349 Añadida return $fields; 350 Añadida } 351 Añadida add_filter( 'woocommerce_checkout_fields', 'kb_address_autocomplete', 99 ); 352 Añadida add_filter( 'woocommerce_billing_fields', 'kb_address_autocomplete', 99 ); 353 Añadida add_filter( 'woocommerce_shipping_fields', 'kb_address_autocomplete', 99 ); 354 Añadida /* /validiscan:autocomplete-tokens */ woocommerce/myaccount/form-login.php Cambios en woocommerce/myaccount/form-login.php (líneas añadidas: 3; eliminadas: 3)
Cambios en woocommerce/myaccount/form-login.php (líneas añadidas: 3; eliminadas: 3) Línea anterior Línea nueva Cambio Código 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 Eliminada <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 Añadida <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 Eliminada <input class="woocommerce-Input woocommerce-Input--text input-text" type="password" name="password" id="password" autocomplete="off" onpaste="return false;"> 37 Añadida <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 Eliminada <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 Añadida <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 -
Cambios de precio, de existencias y del carrito anunciados live-region-cart-variant Los lectores de pantalla anuncian el precio y las existencias nuevos de la variación elegida, salvo que el script del tema sustituya esa área entera, y, en inglés, un producto añadido al carrito o eliminado de él.
Cuando un cliente elige otra talla u otro color, el área que muestra el precio y las existencias de la variación elegida se reescribe en el mismo sitio. Esa área pasa a ser una región dinámica, de modo que los lectores de pantalla anuncian el precio y las existencias nuevos sin que el cliente tenga que moverse hasta allí. El enlace al carrito de la cabecera se sustituye entero cuando se añade un producto, así que no puede llevar él mismo el anuncio. Junto a él, la receta añade un mensaje de estado oculto visualmente, y un breve bloque en el script del tema escribe en él «Product added to your cart.» o «Product removed from your cart.» cuando WooCommerce informa del cambio. Ambos mensajes se añaden en inglés. Un área que ya es una región dinámica o está dentro de una, o que el propio script del tema sustituye entera, se deja como está.
- Reglas que cubre
-
-
vs-live-updatesAUTO
-
- Tipos de archivo que modifica
-
.js.php
adds a status region next to the header cart fragment and wires the theme script Datos de ejemplo assets/js/theme.js Cambios en assets/js/theme.js (líneas añadidas: 15; eliminadas: 0)
Cambios en assets/js/theme.js (líneas añadidas: 15; eliminadas: 0) Línea anterior Línea nueva Cambio Código 255 255 initCheckout(); 256 256 initShowPassword(); 257 257 })(); 258 Añadida 259 Añadida /* validiscan:live-region-cart-variant */ 260 Añadida // Announces cart changes in the status region next to the header cart (WCAG 4.1.3). 261 Añadida (function () { 262 Añadida const region = document.querySelector('[data-kb-cart-status]'); 263 Añadida if (!region || !window.jQuery) return; 264 Añadida window.jQuery(document.body).on('added_to_cart removed_from_cart', (event) => { 265 Añadida const message = region.getAttribute(event.type === 'added_to_cart' ? 'data-added' : 'data-removed'); 266 Añadida region.textContent = ''; 267 Añadida window.setTimeout(() => { 268 Añadida region.textContent = message || ''; 269 Añadida }, 100); 270 Añadida }); 271 Añadida })(); 272 Añadida /* /validiscan:live-region-cart-variant */ header.php Cambios en header.php (líneas añadidas: 1; eliminadas: 0)
Cambios en header.php (líneas añadidas: 1; eliminadas: 0) Línea anterior Línea nueva Cambio Código 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 Añadida <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 Datos de ejemplo woocommerce/single-product/add-to-cart/variable.php Cambios en woocommerce/single-product/add-to-cart/variable.php (líneas añadidas: 1; eliminadas: 1)
Cambios en woocommerce/single-product/add-to-cart/variable.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 65 65 </table> 66 66 67 67 <div class="single_variation_wrap"> 68 Eliminada <div class="woocommerce-variation single_variation"> 68 Añadida <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>
Nombres para iconos, imágenes y elementos incrustados
-
Nombres para botones y enlaces que solo muestran un icono icon-accessible-name Los botones y enlaces que solo muestran un icono reciben un nombre en inglés que dice qué hacen, cuando el código muestra su finalidad.
Los botones y enlaces que solo muestran un icono reciben un nombre que dice qué hacen, cuando el código muestra su finalidad: a partir del nombre del propio icono, de la clase o el id del control, o de adónde lleva un enlace, como el carrito, la página de la cuenta o una red social. Algunos ejemplos son «Search», «Cart», «My account», «Show password», «Close» y «Menu». El nombre es un texto oculto visualmente dentro del control, o un
aria-labelcuando el tema no tiene una clase para texto oculto, y se añade en inglés. Los nombres de las redes sociales son nombres de marca y se dejan como están. Un control cuya finalidad no muestra el código queda en manos de una persona.- Reglas que cubre
-
-
button-nameASSISTED -
link-nameASSISTED
-
- Tipos de archivo que modifica
-
.php
names the account link and the social links, and leaves the uncertain gallery link Datos de ejemplo header.php Cambios en header.php (líneas añadidas: 1; eliminadas: 1)
Cambios en header.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <a class="kb-account-link" href="<?php echo esc_url( wc_get_page_permalink( 'myaccount' ) ); ?>"><?php kb_icon( 'user' ); ?></a> 63 Añadida <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 Cambios en template-parts/social-links.php (líneas añadidas: 1; eliminadas: 1)
Cambios en template-parts/social-links.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 17 17 ?> 18 18 <ul class="kb-social"> 19 19 <?php foreach ( $kb_profiles as $kb_network => $kb_url ) : ?> 20 Eliminada <a class="kb-social__link" href="<?php echo esc_url( $kb_url ); ?>"><?php kb_icon( $kb_network ); ?></a> 20 Añadida <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 Datos de ejemplo header.php Cambios en header.php (líneas añadidas: 1; eliminadas: 1)
Cambios en header.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <button type="submit" value="<?php echo esc_attr_x( 'Search', 'submit button', 'woocommerce' ); ?>" class="kb-search-submit"><?php kb_icon( 'search' ); ?></button> 54 Añadida <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 Cambios en woocommerce/myaccount/form-login.php (líneas añadidas: 1; eliminadas: 1)
Cambios en woocommerce/myaccount/form-login.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <button type="button" class="show-password-input"><?php kb_icon( 'eye' ); ?></button> 38 Añadida <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 -
Imágenes decorativas ocultas a los lectores de pantalla decorative-image-alt Solo las imágenes que el código demuestra decorativas reciben un
altvacío oaria-hidden; la alternativa textual de cualquier otra imagen queda en manos de una persona.Una imagen se marca como decorativa solo cuando el código demuestra que no aporta nada: está dentro de un enlace o un botón que tiene su propio texto, como un logotipo junto al nombre de la tienda; es un icono pequeño junto a su propia etiqueta de texto; o es un espaciador o un separador. Un
<img>recibe entonces unalt=""vacío, y un icono SVG recibearia-hidden="true", de modo que los lectores de pantalla lo omiten en lugar de anunciar un gráfico sin nombre. Cualquier otra imagen es contenido, y su alternativa textual queda en manos de una persona.- Reglas que cubre
-
-
image-altASSISTED -
role-img-altASSISTED -
svg-img-altASSISTED
-
- Tipos de archivo que modifica
-
.php
hides the logo mark inside the home link that has the shop name Datos de ejemplo header.php Cambios en header.php (líneas añadidas: 1; eliminadas: 1)
Cambios en header.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 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 Eliminada <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 Añadida <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> -
Títulos para mapas y vídeos incrustados iframe-title Un marco incrustado sin título recibe un título en inglés que dice qué muestra, cuando el código lo muestra.
Un marco incrustado sin título, como un mapa o un vídeo de YouTube o de Vimeo, recibe un título en inglés que dice qué muestra. La receta lo toma del título de un archivo incrustado en el tema, del proveedor que figura en la dirección del marco o de palabras como
mapovideoen su clase o su id. Un marco cuyo contenido no muestra el código no recibe ningún título genérico; queda en manos de una persona.- Reglas que cubre
-
-
frame-titleAUTO
-
- Tipos de archivo que modifica
-
.php
titles the store map iframe of the contact page from the embedded document Datos de ejemplo page-contact.php Cambios en page-contact.php (líneas añadidas: 1; eliminadas: 1)
Cambios en page-contact.php (líneas añadidas: 1; eliminadas: 1) Línea anterior Línea nueva Cambio Código 81 81 82 82 <div class="kb-store-map"> 83 83 <?php // VALIDISCAN-SEED frame-title: the map iframe has no title. ?> 84 Eliminada <iframe src="<?php echo esc_url( get_stylesheet_directory_uri() . '/assets/embeds/store-map.html' ); ?>" width="600" height="320" loading="lazy"></iframe> 84 Añadida <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>
Detalles: qué corrigen las recetas, los niveles y el tema de prueba
Validiscan tiene 20 recetas para temas de WooCommerce. Corrigen la estructura de la página y la navegación, el foco del teclado, el zoom, las zonas táctiles y el contraste, el movimiento y el sonido, los campos de formulario y el carrito, y los nombres de iconos, imágenes y marcos incrustados. Una receta es un cambio determinista para un tipo de fallo: el mismo código recibe siempre el mismo cambio. Cada una hace un cambio solo donde el código del tema muestra cuál es el cambio correcto; donde no lo muestra, la receta no cambia nada y el hallazgo queda en manos de una persona.
Debajo de cada receta encontrará las reglas que cubre, con el nivel de cada regla en el catálogo de Validiscan. AUTO significa que una receta es la corrección estándar de la regla. ASSISTED significa que la corrección requiere criterio, así que se redacta un cambio y después se revisa. MANUAL significa que la regla requiere la decisión de una persona, y Validiscan ofrece orientación en lugar de un cambio de código. En un proyecto, las recetas se aplican a los hallazgos de reglas de nivel AUTO. Cuando una receta enumera también una regla de nivel ASSISTED o MANUAL, un hallazgo de esa regla sigue en su lugar la vía ASSISTED o MANUAL. Una regla marcada como «se comprueba mediante» otra comprobación no se ejecuta por sí sola en un escaneo: esa comprobación informa del mismo fallo.
Los tipos de archivo y el antes y el después de cada receta proceden de las pruebas de la propia aplicación. La mayoría se ejecuta en el tema de prueba de WooCommerce de la aplicación, un tema hijo del tema Storefront con fallos de accesibilidad introducidos a propósito; los comentarios marcados con VALIDISCAN-SEED que verá en algunos diffs los señalan y existen solo en el tema de prueba. Las páginas de WordPress no se pueden renderizar en el entorno de pruebas, así que estas pruebas no renderizan páginas: comprueban el cambio en sí, como un antes y un después de los archivos del tema. Los archivos de su tema serán distintos.
¿Qué sigue siendo MANUAL en WooCommerce?
Los fallos que requieren una decisión sobre el contenido o el comportamiento que un cambio de código fijo no puede tomar, por ejemplo subtítulos y transcripciones de sus vídeos y su audio, siguen siendo MANUAL en WooCommerce. Para un hallazgo de una regla MANUAL, Validiscan ofrece orientación sobre cómo corregirlo, no un cambio en su código.
Las reglas de más abajo se ejecutan en los escaneos y tienen el nivel MANUAL en WooCommerce; las reglas de buenas prácticas no se enumeran.
-
meta-refreshNo debe usarse una actualización diferida de menos de 20 horas -
nested-interactiveLos controles interactivos no deben estar anidados -
scrollable-region-focusableLas zonas desplazables deben ser accesibles con el teclado -
server-side-image-mapNo deben usarse mapas de imagen del lado del servidor -
vs-keyboard-trapEl foco del teclado nunca debe quedar atrapado -
vs-focus-orderEl orden del foco debe seguir el orden visual -
vs-draggingLos controles que solo funcionan arrastrando necesitan una alternativa con un solo puntero -
vs-mediaLos vídeos necesitan subtítulos, el audio necesita una transcripción y nada debe reproducirse automáticamente con sonido -
vs-documentsLos documentos enlazados necesitan una revisión manual de accesibilidad
Detalles: la comprobación del orden del foco y lo que un proyecto deja fuera
Para un hallazgo de una regla MANUAL, Validiscan ofrece orientación sobre cómo corregirlo, no un cambio en su código. Estos fallos requieren una decisión sobre el contenido o el comportamiento que un cambio de código fijo no puede tomar, por ejemplo los subtítulos y las transcripciones de sus vídeos y su audio, una forma de salir de un widget que atrapa el foco del teclado, otra forma de usar un control que solo funciona arrastrando, o una revisión de los documentos enlazados, como los PDF. Cuando un hallazgo de vs-focus-order procede de un tabindex mayor que 0 en una plantilla del tema, la receta del orden de tabulación de más arriba lo elimina.
El trabajo que suponen los hallazgos MANUAL que requieren decisiones sobre su propio contenido no forma parte de un proyecto, como tampoco los PDF. Entre las reglas de nivel AUTO y las de nivel MANUAL están las de nivel ASSISTED, como las alternativas textuales de las imágenes de producto o los nombres de los botones: sus correcciones requieren criterio, y Validiscan revisa cada corrección antes de entregarla. Lo que las pruebas automatizadas de accesibilidad pueden demostrar y lo que no
¿Qué aporta usted?
Usted aporta permiso por escrito para un escaneo completo, una vía de acceso a su tema, su respuesta sobre la redacción con IA de correcciones ASSISTED, un desarrollador o una agencia que revise y ponga en producción los cambios, sus decisiones sobre lo que sigue siendo MANUAL y, si su tienda no está en inglés, la traducción del texto nuevo.
- Permiso por escrito para un escaneo completo de su tienda. Un escaneo completo añade un producto al carrito y abre el primer paso del proceso de pago, sin completar una compra ni introducir datos de pago.
- Una vía de acceso a su tema: acceso al repositorio de GitHub que contiene su tema o su tema hijo, o un ZIP de la carpeta del tema subido en el portal del cliente.
- Su respuesta sobre si la IA puede redactar correcciones de nivel ASSISTED. La redacción con IA está desactivada hasta que usted lo acepte.
- Un desarrollador o una agencia que revise los cambios, fusione el pull request o aplique el paquete de parches y ponga el tema en producción.
- Las traducciones del texto nuevo en inglés, si su tienda está en otro idioma.
- Sus decisiones sobre lo que sigue siendo MANUAL, como los subtítulos de sus vídeos.
Detalles: cuando los cambios están en producción y qué cubre un proyecto
Cuando los cambios están en producción, un escaneo de verificación vuelve a comprobar las páginas afectadas y el Remediation Evidence Package registra el resultado. Cómo se desarrolla un proyecto, paso a paso
Un proyecto cubre una tienda: un dominio y un tema.
Fuentes
4 fuentes, todas comprobadas para esta página el 6 de octubre de 2026.
Documentación de WooCommerce y WordPress para desarrolladores 4
- Template structure & Overriding templates via a theme · WooCommerce · comprobado el
- language_attributes() · WordPress.org · comprobado el
- Localization (Common APIs Handbook) · WordPress.org · comprobado el
- Templates (Theme Handbook) · WordPress.org · comprobado el
Empiece con una revisión gratuita de su tienda.
Envíe la dirección de su tienda. Validiscan la escanea y le responde con cada fallo que el escaneo pueda demostrar, con la página y el código.
Solicitar revisión gratuitaO escriba a info@validiscan.com.
Qué cubre la revisión gratuita y qué deja fuera- Usted envía
- la dirección de su tienda
- Páginas escaneadas
- hasta 15
- Usted recibe
- todos los fallos que el escaneo puede demostrar, con la página y el código
- En su tienda
- solo páginas públicas; sin inicio de sesión, nada comprado, ningún formulario enviado
- Lo que no es
- una auditoría completa