Usamos cookies para mejorar tu experiencia de compra, analizar el tráfico y personalizar el contenido. Al continuar, aceptas nuestra
política de privacidad .
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:
Copia el código en un tema hijo (functions.php) o en un gestor de snippets como Code Snippets.
Guarda los cambios y abre el checkout clásico de tu tienda: verás los campos Tipo de comprobante y Número de documento.
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.