Modificar el checkout de WooCommerce sin plugins
Guía para modificar campos y validaciones del checkout de WooCommerce con hooks, sin instalar plugins innecesarios.
- Revisado
- Compatibilidad
- WooCommerce 8.x–10.x; checkout clásico
- Lectura
- 2 min
- Autor
- Gabriel — infinit8
El checkout se puede adaptar con hooks siempre que el tema utilice el flujo clásico. La clave es separar presentación, validación y guardado para no convertir una personalización pequeña en código difícil de mantener.
Antes de modificar el checkout
Confirma si la página usa el checkout clásico o el bloque Checkout. El filtro woocommerce_checkout_fields pertenece al flujo clásico; los bloques tienen APIs de extensibilidad diferentes. Trabaja en un plugin propio o mu-plugin, no en el tema padre.
Una personalización creada para el checkout clásico no debe darse por compatible automáticamente con Checkout Blocks.
Modificar un campo existente
Este ejemplo cambia la etiqueta, el texto de ayuda y la prioridad del teléfono de facturación. La comprobación evita avisos si otra extensión ha retirado el campo.
add_filter(
'woocommerce_checkout_fields',
function (array $fields): array {
if (!isset($fields['billing']['billing_phone'])) {
return $fields;
}
$fields['billing']['billing_phone']['label'] = 'Teléfono de contacto';
$fields['billing']['billing_phone']['placeholder'] = 'Ej.: 612 345 678';
$fields['billing']['billing_phone']['priority'] = 35;
return $fields;
}
);
Validar el dato en el servidor
Los atributos HTML mejoran la experiencia, pero no sustituyen la validación en PHP. Añade el error al objeto recibido por el hook y no confíes en el valor enviado por el navegador.
add_action(
'woocommerce_after_checkout_validation',
function (array $data, WP_Error $errors): void {
$phone = isset($data['billing_phone'])
? preg_replace('/\D+/', '', (string) $data['billing_phone'])
: '';
if (strlen($phone) < 9) {
$errors->add(
'billing_phone_invalid',
'Introduce un teléfono de contacto válido.'
);
}
},
10,
2
);
Errores frecuentes
- Editar plantillas completas cuando un filtro resuelve el cambio.
- Validar solo con JavaScript.
- Guardar datos sin sanitizar.
- Aplicar código del checkout clásico a Checkout Blocks.
- Probar únicamente pedidos como administrador.
Preguntas frecuentes
¿Es mejor hacerlo en functions.php?
Para una prueba breve puede funcionar, pero una personalización comercial debería vivir en un plugin propio para no depender del tema.
¿Funciona con el bloque de checkout?
No necesariamente. Los hooks de esta guía corresponden al checkout clásico; Checkout Blocks utiliza su propia API de extensibilidad.
Referencias y revisión
Contenido contrastado con documentación oficial. Comprueba siempre el comportamiento en un entorno de pruebas antes de desplegar cambios.