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.

Importante

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.

i8-checkout.php
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.

i8-checkout.php
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.