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:

¿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.

Las dos vías de acceso a un tema de WooCommerce
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/themes, 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.

De la entrega a su tienda en producción, en cinco pasos
  1. Validiscan entrega los cambios que ha revisado y aprobado: un pull request en una rama nueva o un paquete de parches para su desarrollador.
  2. 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.
  3. Usted o su desarrollador fusionan el pull request, o aplican el paquete de parches y prueban los cambios.
  4. Usted o su desarrollador ponen el tema en producción.
  5. 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/a11y-<date>-<id>, 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.

Traducir el texto nuevo, en tres pasos
  1. Regenerar el archivo .pot del tema
  2. Añadir las traducciones a sus archivos .po
  3. Compilar los archivos .mo que 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 valor lang fijo que no es válido, recibe language_attributes() de WordPress, que imprime el idioma del sitio.

    La receta hace que el elemento <html> de las plantillas de cabecera tome su idioma de language_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 valor lang fijo 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 en functions.php declara 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-lang AUTO se comprueba mediante vs-lang
    • html-lang-valid AUTO se comprueba mediante vs-lang
    • vs-lang AUTO
    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. ?>
  • 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 en functions.php la 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-title AUTO
    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-order AUTO se comprueba mediante vs-headings-landmarks
    • page-has-heading-one AUTO se comprueba mediante vs-headings-landmarks
    • vs-headings-landmarks AUTO
    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, primary o link, 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. Un outline: none en 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-visible AUTO
    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 tabindex mayor 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 tabindex mayor 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. Un tabindex que imprime el código PHP o que establece un script queda en manos de una persona.

    Reglas que cubre
    • tabindex AUTO
    • vs-focus-order MANUAL
    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&hellip;', '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&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">
  • Controles que solo funcionan con el ratón, convertidos en botones button-semantics En un banner de cookies o un carrusel de su tema, los elementos en los que se hace clic y que solo funcionan con el ratón pasan a ser botones de verdad, salvo que el tema los estilice o controle por el nombre de su etiqueta.

    Dentro de un banner de cookies o de un carrusel que forma parte de su tema, los elementos <span>, <div>, <li> o <i> en los que se hace clic pero que solo funcionan con el ratón pasan a ser elementos <button> de verdad. Se conservan todas las clases y atributos, de modo que los estilos y los scripts del tema siguen funcionando, y ahora Enter y la barra espaciadora hacen lo que hace un clic. Un breve restablecimiento de estilos para exactamente esas clases mantiene su aspecto. Un botón que solo muestra un icono en el mismo banner o carrusel recibe un nombre en inglés, como se describe más abajo en los nombres de iconos. Un elemento al que no responde ningún script, uno que el tema estiliza o controla por el nombre de su etiqueta, o uno vacío cuya finalidad no está clara, se deja como está.

    Reglas que cubre
    • vs-carousel AUTO
    • vs-cookie-banner ASSISTED
    Tipos de archivo que modifica
    .css.php
    turns the click-only cookie choices into buttons and names the close button Datos de ejemplo

    assets/css/main.css Cambios en assets/css/main.css (líneas añadidas: 17; eliminadas: 0)

    Cambios en assets/css/main.css (líneas añadidas: 17; eliminadas: 0)
    Línea anterior Línea nueva Cambio Código
    766 766 gap: 0.75rem;
    767 767 }
    768 768
    769 Añadida /* validiscan:button-semantics */
    770 Añadida /* Controls that became <button>s: keep the look of the elements they replace. The theme
    771 Añadida rules for these classes follow and still win. */
    769 772 .kb-cookie-bar__settings,
    770 773 .kb-cookie-bar__accept {
    774 Añadida margin: 0;
    775 Añadida padding: 0;
    776 Añadida border: 0;
    777 Añadida background: none;
    778 Añadida color: inherit;
    779 Añadida font: inherit;
    780 Añadida line-height: inherit;
    781 Añadida text-align: inherit;
    782 Añadida cursor: pointer;
    783 Añadida }
    784 Añadida /* /validiscan:button-semantics */
    785 Añadida
    786 Añadida .kb-cookie-bar__settings,
    787 Añadida .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 Cambios en template-parts/cookie-bar.php (líneas añadidas: 3; eliminadas: 3)

    Cambios en template-parts/cookie-bar.php (líneas añadidas: 3; eliminadas: 3)
    Línea anterior Línea nueva Cambio Código
    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 Eliminada <span class="kb-cookie-bar__settings" data-kb-consent="settings"><?php esc_html_e( 'Cookie settings', 'kestrel-birch' ); ?></span>
    25 Eliminada <span class="kb-cookie-bar__accept" data-kb-consent="accept"><?php esc_html_e( 'Accept', 'kestrel-birch' ); ?></span>
    26 Eliminada <button type="button" class="kb-cookie-bar__close" data-kb-consent="close"><?php kb_icon( 'close' ); ?></button>
    24 Añadida <button class="kb-cookie-bar__settings" data-kb-consent="settings" type="button"><?php esc_html_e( 'Cookie settings', 'kestrel-birch' ); ?></button>
    25 Añadida <button class="kb-cookie-bar__accept" data-kb-consent="accept" type="button"><?php esc_html_e( 'Accept', 'kestrel-birch' ); ?></button>
    26 Añadida <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, zonas táctiles y contraste

  • Zoom permitido en los móviles meta-viewport-zoom La etiqueta viewport pierde user-scalable=no y un maximum-scale inferior 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=no y cualquier maximum-scale inferior 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 estricta meta-viewport-large de axe-core, se elimina cualquier maximum-scale inferior 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-viewport AUTO
    • meta-viewport-large AUTO
    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-size AUTO
    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-contrast ASSISTED
    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-motion AUTO
    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-carousel AUTO
    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 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 muted y playsinline, 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 multimedia vs-media, que sustituye a la regla de axe-core que cubre esta receta; vs-media es 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-audio AUTO 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 for o aria-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 un for que apunta al campo, o un elemento de texto marcado como etiqueta se conecta mediante aria-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
    • label AUTO se comprueba mediante vs-forms-ecommerce
    • select-name ASSISTED
    • vs-forms-ecommerce AUTO
    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 autocomplete correspondiente cuando el código muestra su finalidad; en los campos de facturación y de envío de WooCommerce lo establece un filtro en functions.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 autocomplete correspondiente 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 es off o 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 en functions.php establece 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-valid AUTO se comprueba mediante vs-forms-ecommerce
    • vs-forms-ecommerce AUTO
    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' ); ?>&nbsp;<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' ); ?>&nbsp;<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-updates AUTO
    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-label cuando 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-name ASSISTED
    • link-name ASSISTED
    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&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 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' ); ?>&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 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 alt vacío o aria-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 un alt="" vacío, y un icono SVG recibe aria-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-alt ASSISTED
    • role-img-alt ASSISTED
    • svg-img-alt ASSISTED
    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 map o video en 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-title AUTO
    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-refresh No debe usarse una actualización diferida de menos de 20 horas
  • nested-interactive Los controles interactivos no deben estar anidados
  • scrollable-region-focusable Las zonas desplazables deben ser accesibles con el teclado
  • server-side-image-map No deben usarse mapas de imagen del lado del servidor
  • vs-keyboard-trap El foco del teclado nunca debe quedar atrapado
  • vs-focus-order El orden del foco debe seguir el orden visual
  • vs-dragging Los controles que solo funcionan arrastrando necesitan una alternativa con un solo puntero
  • vs-media Los vídeos necesitan subtítulos, el audio necesita una transcripción y nada debe reproducirse automáticamente con sonido
  • vs-documents Los 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.

  1. 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.
  2. 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.
  3. Su respuesta sobre si la IA puede redactar correcciones de nivel ASSISTED. La redacción con IA está desactivada hasta que usted lo acepte.
  4. 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.
  5. Las traducciones del texto nuevo en inglés, si su tienda está en otro idioma.
  6. 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
  1. Template structure & Overriding templates via a theme · WooCommerce · comprobado el
  2. language_attributes() · WordPress.org · comprobado el
  3. Localization (Common APIs Handbook) · WordPress.org · comprobado el
  4. 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 gratuita

O 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

Escribir a Validiscan

Para una revisión gratuita, indique la dirección web de su tienda y su plataforma.

Validiscan utiliza lo que usted envía para responderle. Política de privacidad