woocommerce_after_checkout_validation
Cómo usar woocommerce_after_checkout_validation para validar datos del checkout y mostrar errores correctamente.
- Revisado
- Compatibilidad
- WooCommerce 3.0+; checkout clásico
- Lectura
- 2 min
- Autor
- Gabriel — infinit8
woocommerce_after_checkout_validation se ejecuta después de que WooCommerce valide los datos básicos del checkout clásico. Es el punto adecuado para reglas que necesitan comparar varios campos o consultar lógica del pedido antes de crearlo.
Firma y parámetros
La acción recibe los datos procesados del checkout y un objeto WP_Error. Para rechazar el envío se añade un error a ese objeto; no es necesario imprimir HTML ni detener la ejecución.
$data- Datos del checkout ya procesados.
$errors- Errores que WooCommerce mostrará al cliente.
do_action(
'woocommerce_after_checkout_validation',
$data,
$errors
);
Validar una regla entre país y NIF
El ejemplo exige un NIF para España. Sanitiza la entrada, usa un código de error estable y devuelve un mensaje que indique cómo corregir el problema.
add_action(
'woocommerce_after_checkout_validation',
function (array $data, WP_Error $errors): void {
$country = isset($data['billing_country'])
? wc_clean($data['billing_country'])
: '';
$vat = isset($_POST['billing_vat'])
? wc_clean(wp_unslash($_POST['billing_vat']))
: '';
if ('ES' === $country && '' === $vat) {
$errors->add(
'billing_vat_required',
'Indica el NIF o CIF para continuar con el pedido.'
);
}
},
10,
2
);
Si añades un campo propio, regístralo y guárdalo mediante las APIs de WooCommerce. Leer $_POST directamente debe ser el último recurso y siempre requiere wp_unslash y sanitización.
Cuándo usar este hook
Es útil para reglas condicionales entre campos, límites asociados al método de entrega o comprobaciones rápidas contra datos internos. Evita llamadas lentas a APIs externas: bloquearían el checkout y empeorarían la conversión.
Por qué una validación puede no ejecutarse
- La tienda usa Checkout Blocks.
- El callback declara una cantidad incorrecta de argumentos.
- El código se carga solo en administración.
- Otro error ocurre antes en el proceso.
- El campo llega con un nombre distinto del esperado.
Preguntas frecuentes
¿Debo usar wc_add_notice()?
En este hook es preferible añadir el error al objeto WP_Error recibido, que forma parte de su contrato.
¿Puedo consultar una API externa?
Es posible, pero no recomendable en una petición crítica sin timeout corto, caché y una estrategia clara cuando el servicio no responde.
Referencias y revisión
Contenido contrastado con documentación oficial. Comprueba siempre el comportamiento en un entorno de pruebas antes de desplegar cambios.