PHP

Campo de RUC o DNI y tipo de comprobante en el checkout de WooCommerce

Añade al checkout clásico de WooCommerce un selector de Boleta o Factura y un campo de DNI o RUC con validación de dígitos. El dato queda guardado en el pedido y visible en el correo de confirmación.

Dónde pegarlo: Tema hijo (functions.php) o gestor de snippets como Code Snippets Probado con: WooCommerce 10.7.0 Última revisión: 17 Sep, 2026

Prueba este código primero en un entorno de staging. Pégalo siempre en un tema hijo o en un gestor de snippets (como Code Snippets); nunca directamente en un tema padre, porque una actualización del tema lo eliminaría.

PHP
// Campo de RUC o DNI y tipo de comprobante en el checkout de WooCommerce
// Aplica al checkout clásico. Pega este código en un tema hijo (functions.php)
// o en un gestor de snippets como Code Snippets.

// 1. Agregar los campos al checkout clásico
add_filter( 'woocommerce_checkout_fields', 'sa_snippet_add_comprobante_fields' );
function sa_snippet_add_comprobante_fields( $fields ) {
    $fields['billing']['billing_tipo_comprobante'] = [
        'type'     => 'select',
        'label'    => __( 'Tipo de comprobante', 'woocommerce' ),
        'required' => true,
        'class'    => [ 'form-row-wide' ],
        'options'  => [
            'boleta'  => __( 'Boleta (DNI)', 'woocommerce' ),
            'factura' => __( 'Factura (RUC)', 'woocommerce' ),
        ],
        'default'  => 'boleta',
        'priority' => 25,
    ];

    $fields['billing']['billing_numero_documento'] = [
        'type'        => 'text',
        'label'       => __( 'Número de documento', 'woocommerce' ),
        'placeholder' => __( 'DNI (8 dígitos) o RUC (11 dígitos)', 'woocommerce' ),
        'required'    => true,
        'class'       => [ 'form-row-wide' ],
        'priority'    => 26,
    ];

    return $fields;
}

// 2. Validar el número de documento según el tipo de comprobante
add_action( 'woocommerce_checkout_process', 'sa_snippet_validar_documento' );
function sa_snippet_validar_documento() {
    $tipo    = isset( $_POST['billing_tipo_comprobante'] ) ? sanitize_text_field( wp_unslash( $_POST['billing_tipo_comprobante'] ) ) : '';
    $numero  = isset( $_POST['billing_numero_documento'] ) ? sanitize_text_field( wp_unslash( $_POST['billing_numero_documento'] ) ) : '';

    if ( '' === $numero ) {
        wc_add_notice( __( 'Por favor ingresa tu número de documento.', 'woocommerce' ), 'error' );
        return;
    }

    if ( ! ctype_digit( $numero ) ) {
        wc_add_notice( __( 'El número de documento solo debe contener dígitos.', 'woocommerce' ), 'error' );
        return;
    }

    if ( 'boleta' === $tipo && 8 !== strlen( $numero ) ) {
        wc_add_notice( __( 'El DNI debe tener 8 dígitos.', 'woocommerce' ), 'error' );
    }

    if ( 'factura' === $tipo && 11 !== strlen( $numero ) ) {
        wc_add_notice( __( 'El RUC debe tener 11 dígitos.', 'woocommerce' ), 'error' );
    }
}

// 3. Guardar los datos como meta del pedido
add_action( 'woocommerce_checkout_update_order_meta', 'sa_snippet_guardar_documento' );
function sa_snippet_guardar_documento( $order_id ) {
    if ( isset( $_POST['billing_tipo_comprobante'] ) ) {
        update_post_meta( $order_id, '_billing_tipo_comprobante', sanitize_text_field( wp_unslash( $_POST['billing_tipo_comprobante'] ) ) );
    }
    if ( isset( $_POST['billing_numero_documento'] ) ) {
        update_post_meta( $order_id, '_billing_numero_documento', sanitize_text_field( wp_unslash( $_POST['billing_numero_documento'] ) ) );
    }
}

// 4. Mostrar los datos en el detalle del pedido (wp-admin)
add_action( 'woocommerce_admin_order_data_after_billing_address', 'sa_snippet_mostrar_documento_admin' );
function sa_snippet_mostrar_documento_admin( $order ) {
    $tipo   = get_post_meta( $order->get_id(), '_billing_tipo_comprobante', true );
    $numero = get_post_meta( $order->get_id(), '_billing_numero_documento', true );

    if ( ! $numero ) {
        return;
    }

    $tipo_label = 'factura' === $tipo ? __( 'Factura (RUC)', 'woocommerce' ) : __( 'Boleta (DNI)', 'woocommerce' );

    echo '<p><strong>' . esc_html__( 'Tipo de comprobante:', 'woocommerce' ) . '</strong> ' . esc_html( $tipo_label ) . '</p>';
    echo '<p><strong>' . esc_html__( 'Número de documento:', 'woocommerce' ) . '</strong> ' . esc_html( $numero ) . '</p>';
}

// 5. Mostrar los datos en el correo de confirmación del pedido
add_action( 'woocommerce_email_order_meta', 'sa_snippet_mostrar_documento_email', 10, 3 );
function sa_snippet_mostrar_documento_email( $order, $sent_to_admin, $plain_text ) {
    $tipo   = get_post_meta( $order->get_id(), '_billing_tipo_comprobante', true );
    $numero = get_post_meta( $order->get_id(), '_billing_numero_documento', true );

    if ( ! $numero ) {
        return;
    }

    $tipo_label = 'factura' === $tipo ? __( 'Factura (RUC)', 'woocommerce' ) : __( 'Boleta (DNI)', 'woocommerce' );

    if ( $plain_text ) {
        echo esc_html( $tipo_label ) . ': ' . esc_html( $numero ) . "n";
    } else {
        echo '<p><strong>' . esc_html( $tipo_label ) . ':</strong> ' . esc_html( $numero ) . '</p>';
    }
}

Cómo usarlo

Sigue estos tres pasos:

  1. Copia el código en un tema hijo (functions.php) o en un gestor de snippets como Code Snippets.
  2. Guarda los cambios y abre el checkout clásico de tu tienda: verás los campos Tipo de comprobante y Número de documento.
  3. Completa una compra de prueba con un DNI de 8 dígitos (Boleta) y con un RUC de 11 dígitos (Factura) para confirmar que la validación funciona y que el dato aparece en el pedido y en el correo de confirmación.

Este snippet aplica al checkout clásico de WooCommerce. El Block Checkout (basado en bloques de Gutenberg) requiere otra vía, con la API de Store y campos adicionales registrados por PHP, porque no usa woocommerce_checkout_fields.