Tras la solicitud de uno de nuestros clientes, tuvimos que darle alguna vuelta al código que os planteamos en su momento en la entrada ¿Cómo añadir un campo NIF o CIF a WooCommerce 2.1?, para conseguir que además de mostrar el NIF/CIF en todos los campos de dirección de WooCommerce 2.1, se mostrara el teléfono del cliente, y que además, este fuera obligatorio. ¿El motivo? Lo necesitaba para que la empresa de transporte pudiera ponerse en contacto con el cliente.

Pues bien, para que veáis que en realidad es bien sencillo, primero vamos a poner el código PHP completo que es necesario añadir al archivo functions.php de vuestro tema o al hijo de éste, y después analizaremos las líneas que hemos modificado sobre el código publicado en la entrada ¿Cómo añadir un campo NIF o CIF a WooCommerce 2.1?:

//Arreglamos la dirección predeterminada
function campos_de_direccion( $campos ) {
    $campos['nif'] = array( 
        'label' => __( '<abbr title="Código de Identificación Fiscal" lang="es">CIF</abbr>/<abbr title="Número de Identificación Fiscal" lang="es">NIF</abbr>', 'woocommerce' ),
        'placeholder' => _x( 'Introduzca elCIF/NIF', 'placeholder', 'woocommerce' ),
        'required' => true,
        'class' =>array( 'form-row-last' ),
        'clear' => true,
	);

    $campos['company']['class'][0] = 'form-row-first';
    $campos['city']['class'][0] = 'form-row-first';
    $campos['state']['class'][0] = 'form-row-last update_totals_on_change';
    $campos['postcode']['class'][0] .= ' update_totals_on_change';

    //Reordenamos los campos
    $campos_nuevos['country'] = $campos['country'];
    $campos_nuevos['first_name'] = $campos['first_name'];
    $campos_nuevos['last_name'] = $campos['last_name'];
    $campos_nuevos['company'] = $campos['company'];
    $campos_nuevos['nif'] = $campos['nif'];
    $campos_nuevos['address_1'] = $campos['address_1'];
    $campos_nuevos['address_2'] = $campos['address_2'];
    $campos_nuevos['postcode'] = $campos['postcode'];
    $campos_nuevos['city'] = $campos['city'];
    $campos_nuevos['state'] = $campos['state'];
    if ( isset( $campos['email'] ) ) {
		$campos_nuevos['email'] = $campos['email'];
	}
    if ( isset( $campos['phone'] ) ) {
		$campos_nuevos['phone']['required'] = true;
		$campos_nuevos['phone'] = $campos['phone'];
    }
	
    return $campos_nuevos;
}
add_filter( 'woocommerce_default_address_fields' , 'campos_de_direccion' );

//Nueva función para hacer compatible el código con WooCommerce 2.1
function dame_campo_personalizado( $campo, $pedido ) {
    $valor = get_post_meta( $pedido, $campo, false );
	if ( isset( $valor[0] ) ){
		return $valor[0];
	}
	return NULL;
}

//Añadimos el NIF y el teléfono a la dirección de facturación y envío
function anade_campo_nif_direccion_facturacion( $campos, $pedido ) {
    $campos['nif'] = dame_campo_personalizado( '_billing_nif', $pedido->id );
    $campos['phone'] = dame_campo_personalizado( '_billing_phone', $pedido->id );
	
	return $campos;
}
add_filter( 'woocommerce_order_formatted_billing_address','anade_campo_nif_direccion_facturacion', 1, 2 );

function anade_campo_nif_direccion_envio( $campos, $pedido ) {
    $campos['nif'] = dame_campo_personalizado( '_shipping_nif', $pedido->id );
    $campos['phone'] = dame_campo_personalizado( '_shipping_phone', $pedido->id );
	
	return $campos;
}
add_filter( 'woocommerce_order_formatted_shipping_address','anade_campo_nif_direccion_envio', 1, 2 );

function formato_direccion_de_facturacion( $campos, $argumentos ) {
    $campos['{nif}'] = $argumentos['nif'];
    $campos['{nif_upper}'] =strtoupper( $argumentos['nif'] );
    $campos['{phone}'] = $argumentos['phone'];
    $campos['{phone_upper}'] =strtoupper( $argumentos['phone'] );
	
	return $campos;
}
add_filter( 'woocommerce_formatted_address_replacements','formato_direccion_de_facturacion', 1, 2 );

//Reordenamos los campos de la dirección predeterminada
function formato_direccion_localizacion( $campos ) {
    $campos['default'] = "{name}n{company}n{nif}n{address_1}n{address_2}n{city}n{state}n{postcode}n{country}n{phone}";
    $campos['ES'] = "{name}n{company}n{nif}n{address_1}n{address_2}n{postcode} {city}n{state}n{country}n{phone}";
	
	return $campos;
}
add_filter( 'woocommerce_localisation_address_formats','formato_direccion_localizacion' );

//Arreglamos el formulario de envío
function formulario_de_envio( $campos ) {
    $campos['shipping_email'] =array( 
        'label' => __( 'EmailAddress', 'woocommerce' ),
        'required' => false,
        'class' =>array( 'form-row-first' ),
        'validate' =>array(  'email'  ),
	);
    $campos['shipping_phone'] =array( 
        'label' => __( 'Phone', 'woocommerce' ),
        'required' => true,
        'class' =>array( 'form-row-last' ),
        'clear' => true,
	);
    $campos['shipping_postcode'] =array( 
        'label' => __(  'Postcode /Zip', 'woocommerce'  ),
        'placeholder' => __(  'Postcode /Zip', 'woocommerce'  ),
        'required' => true,
        'class' =>array(  'form-row-wide', 'address-field'  ),
        'clear' => true,
        'custom_attributes' =>array( 
            'autocomplete' => 'no'
         )
	);
	 
	return $campos;
}
add_filter( 'woocommerce_shipping_fields' , 'formulario_de_envio' );

//Arreglamos el formulario de cobro
function formulario_de_cobro( $campos ) {
	$campos['billing_postcode'] =array( 
        'label' => __(  'Postcode /Zip', 'woocommerce'  ),
        'placeholder' => __(  'Postcode /Zip', 'woocommerce'  ),
        'required' => true,
        'class' => array(  'form-row-wide', 'address-field'  ),
        'clear' => true,
        'custom_attributes' => array( 
            'autocomplete' => 'no'
         )
	);
	
	return $campos;
}
add_filter( 'woocommerce_billing_fields' , 'formulario_de_cobro' );

//Añade el campo CIF/NIF a usuarios
function anade_campos_administracion_usuarios( $campos ) {
    $campos['billing']['fields']['billing_nif'] = array( 
            'label' => __( 'CIF/NIF', 'woocommerce' ),
            'description' => ''
	);

    $campos['shipping']['fields']['shipping_nif'] = array( 
            'label' => __( 'CIF/NIF', 'woocommerce' ),
            'description' => ''
	);
    $campos['shipping']['fields']['shipping_email'] = array( 
            'label' => __( 'Email', 'woocommerce' ),
            'description' => ''
	);
	$campos['shipping']['fields']['shipping_phone'] = array( 
            'label' => __( 'Telephone', 'woocommerce' ),
            'description' => ''
	);

    //Reordenamos los campos
    $campos_nuevos['billing']['title'] = $campos['billing']['title'];
    $campos_nuevos['billing']['fields']['billing_first_name'] = $campos['billing']['fields']['billing_first_name'];
    $campos_nuevos['billing']['fields']['billing_last_name'] = $campos['billing']['fields']['billing_last_name'];
    $campos_nuevos['billing']['fields']['billing_company'] = $campos['billing']['fields']['billing_company'];
    $campos_nuevos['billing']['fields']['billing_nif'] = $campos['billing']['fields']['billing_nif'];
    $campos_nuevos['billing']['fields']['billing_address_1'] = $campos['billing']['fields']['billing_address_1'];
    $campos_nuevos['billing']['fields']['billing_address_2'] = $campos['billing']['fields']['billing_address_2'];
    $campos_nuevos['billing']['fields']['billing_postcode'] = $campos['billing']['fields']['billing_postcode'];
    $campos_nuevos['billing']['fields']['billing_city'] = $campos['billing']['fields']['billing_city'];
    $campos_nuevos['billing']['fields']['billing_state'] = $campos['billing']['fields']['billing_state'];
    $campos_nuevos['billing']['fields']['billing_country'] = $campos['billing']['fields']['billing_country'];
    $campos_nuevos['billing']['fields']['billing_phone'] = $campos['billing']['fields']['billing_phone'];
    $campos_nuevos['billing']['fields']['billing_email'] = $campos['billing']['fields']['billing_email'];

    $campos_nuevos['shipping']['title'] = $campos['shipping']['title'];
    $campos_nuevos['shipping']['fields']['shipping_first_name'] = $campos['shipping']['fields']['shipping_first_name'];
    $campos_nuevos['shipping']['fields']['shipping_last_name'] = $campos['shipping']['fields']['shipping_last_name'];
    $campos_nuevos['shipping']['fields']['shipping_company'] = $campos['shipping']['fields']['shipping_company'];
    $campos_nuevos['shipping']['fields']['shipping_nif'] = $campos['shipping']['fields']['shipping_nif'];
    $campos_nuevos['shipping']['fields']['shipping_address_1'] = $campos['shipping']['fields']['shipping_address_1'];
    $campos_nuevos['shipping']['fields']['shipping_address_2'] = $campos['shipping']['fields']['shipping_address_2'];
    $campos_nuevos['shipping']['fields']['shipping_postcode'] = $campos['shipping']['fields']['shipping_postcode'];
    $campos_nuevos['shipping']['fields']['shipping_city'] = $campos['shipping']['fields']['shipping_city'];
    $campos_nuevos['shipping']['fields']['shipping_state'] = $campos['shipping']['fields']['shipping_state'];
    $campos_nuevos['shipping']['fields']['shipping_country'] = $campos['shipping']['fields']['shipping_country'];
    $campos_nuevos['shipping']['fields']['shipping_phone'] = $campos['shipping']['fields']['shipping_phone'];
    $campos_nuevos['shipping']['fields']['shipping_email'] = $campos['shipping']['fields']['shipping_email'];

    $campos_nuevos = apply_filters( 'wcbcf_customer_meta_fields', $campos_nuevos );
	
	return $campos_nuevos;
}
add_filter( 'woocommerce_customer_meta_fields', 'anade_campos_administracion_usuarios' );

//Añadimos el NIF a la dirección de facturación y envío
function anade_campo_nif_usuario_direccion_facturacion( $campos, $usuario ) {
    $campos['nif'] = get_user_meta( $usuario, 'billing_nif', true );
    $campos['phone'] = get_user_meta( $usuario, 'billing_phone', true );return $campos;
}
add_filter( 'woocommerce_user_column_billing_address','anade_campo_nif_usuario_direccion_facturacion', 1, 2 );

function anade_campo_nif_usuario_direccion_envio( $campos, $usuario ) {
    $campos['nif'] = get_user_meta( $usuario, 'shipping_nif', true );
    $campos['phone'] = get_user_meta( $usuario, 'shipping_phone', true );return $campos;
}
add_filter( 'woocommerce_user_column_shipping_address','anade_campo_nif_usuario_direccion_envio', 1, 2 );

//Añade el campo NIF a Editar mi dirección
function anade_campo_nif_editar_direccion( $campos, $usuario, $nombre ) {
    $campos['nif'] = get_user_meta( $usuario, $nombre . '_nif', true );
    $campos['phone'] = get_user_meta( $usuario, $nombre . '_phone', true );

    //Ordena los campos
    $campos_nuevos['first_name'] = $campos['first_name'];
    $campos_nuevos['last_name'] = $campos['last_name'];
    $campos_nuevos['company'] = $campos['company'];
    $campos_nuevos['nif'] = $campos['nif'];
    $campos_nuevos['address_1'] = $campos['address_1'];
    $campos_nuevos['address_2'] = $campos['address_2'];
    $campos_nuevos['postcode'] = $campos['postcode'];
    $campos_nuevos['city'] = $campos['city'];
    $campos_nuevos['state'] = $campos['state'];
    $campos_nuevos['country'] = $campos['country'];
    $campos_nuevos['phone'] = $campos['phone'];
	
	return $campos_nuevos;
}
add_filter( 'woocommerce_my_account_my_address_formatted_address', 'anade_campo_nif_editar_direccion', 10, 3 );

//Añade el campo NIF a Detalles del pedido
function anade_campo_nif_editar_direccion_pedido( $campos ) {
    $campos['nif'] = array( 
        'label' => __( 'CIF/NIF', 'woocommerce' ),
        'show'  => false
     );
    $campos['phone'] = array( 
        'label' => __( 'Telephone', 'woocommerce' ),
        'show'  => false
     );

    //Ordena los campos
    $campos_nuevos['first_name'] = $campos['first_name'];
    $campos_nuevos['last_name'] = $campos['last_name'];
    $campos_nuevos['company'] = $campos['company'];
    $campos_nuevos['nif'] = $campos['nif'];
    $campos_nuevos['address_1'] = $campos['address_1'];
    $campos_nuevos['address_2'] = $campos['address_2'];
    $campos_nuevos['postcode'] = $campos['postcode'];
    $campos_nuevos['city'] = $campos['city'];
    $campos_nuevos['state'] = $campos['state'];
    $campos_nuevos['country'] = $campos['country'];
    $campos_nuevos['phone'] = $campos['phone'];

    return $campos_nuevos;
}
add_filter( 'woocommerce_admin_billing_fields', 'anade_campo_nif_editar_direccion_pedido' );
add_filter( 'woocommerce_admin_shipping_fields', 'anade_campo_nif_editar_direccion_pedido' );

function carga_hoja_de_estilo_editar_direccion_pedido() {
    echo '</pre>
<style type="text/css"><!--
#order_data .order_data_column ._billing_company_field, #order_data .order_data_column ._shipping_company_field { float: left; margin: 9px 0 0; padding: 0; width: 48%; }
#order_data .order_data_column ._billing_nif_field, #order_data .order_data_column ._shipping_nif_field { float: right; margin: 9px 0 0; padding: 0; width: 48%; }
--></style>
<pre>';
}
add_action( 'woocommerce_admin_order_data_after_billing_address', 'carga_hoja_de_estilo_editar_direccion_pedido' );

En él hemos realizado las siguientes modificaciones:

  1. Función campos_de_direccion, donde le hemos indicado que el campo teléfono es obligatorio.
  2. Función anade_campo_nif_direccion_facturacion, donde le hemos añadido el campo teléfono a la dirección de facturación.
  3. Función anade_campo_nif_direccion_envio, donde le hemos añadido el campo teléfono a la dirección de envío.
  4. Función formato_direccion_de_facturacion, donde le hemos añadido el campo teléfono a los campos de reemplazo en el formato local de dirección.
  5. Función formato_direccion_localizacion, donde le hemos añadido el campo teléfono al formato local, España, de dirección.
  6. Función anade_campo_nif_usuario_direccion_facturacion, donde le hemos añadido el campo teléfono al formulario de dirección.
  7. Función anade_campo_nif_usuario_direccion_envio, donde le hemos añadido el campo teléfono al formulario de envío.
  8. Función anade_campo_nif_editar_direccion, donde le hemos añadido el campo teléfono a los formularios de dirección de la página Mi cuenta.
  9. Función anade_campo_nif_editar_direccion_pedido, donde le hemos añadido el campo teléfono a los formularios de dirección de Pedidos en el Panel de Administración de WooCommerce.
  10. Función carga_hoja_de_estilo_editar_direccion_pedido, donde editamos el código CSS del campo teléfono de los formularios anteriores.

Con estas modificaciones habremos cubierto el 100% de las necesidades que nos plantea WooCommerce a la hora de hacer obligatorio un campo, en este caso el teléfono, y de mostrarlo en el pedido y en la factura junto a otro campo no “nativo”, como es el campo NIF/CIF.

Esperamos que, como siempre, os guste y os resulte útil esta entrada, y esperamos vuestros comentarios.