Formulario de pedido de la tienda virtual de Herves-Vida

Captura de pantalla del formulario de pedido de la tienda virtual de Herves-Vida

En ¿Cómo configurar el IVA para Canarias, Ceuta y Melilla en WooCommerce 2.0? ya os prometimos que os explicaríamos cómo añadir un campo NIF/CIF a WooCommerce de forma fácil y sencilla, y aunque a primera vista parezca que no es fácil ni sencillo, lo cierto es que si lo es, siempre y cuando realicemos todos los pasos que os indicamos a continuación. Aunque por la Internet hay varias soluciones parciales más o menos efectivas, pero no hemos encontrado ninguna completa, APG os ofrece la solución definitiva para añadir el campo NIF/CIF a WooCommerce. Como casi siempre que nos metemos en faena de este tipo, tenemos que modificar el archivo functions.php de nuestro tema o hijo de WordPress, y esta vez no iba a ser menos. Así que vamos a explicar una a una todas las cosas que hay que añadir al archivo functions.php. En primer lugar vamos a crear físicamente los campos necesarios, vamos a maquetarlos y ordenarlos correctamente para su introducción, tanto en el formulario de envío como en el de facturación, además añadiremos los campos Dirección de Email y Teléfono al formulario con los datos de envío:

//Arreglamos la dirección predeterminada
function campos_de_direccion($campos) {
	$campos['nif'] = array(
		'label' => __('<abbr lang="es" title="Código de Identificación Fiscal">CIF</abbr>/<abbr lang="es" title="Número de Identificación Fiscal">NIF</abbr>', 'woocommerce'),
		'placeholder' => _x('Introduzca el CIF/NIF', 'placeholder', 'woocommerce'),
		'required' => false,
		'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'] = $campos['phone'];

	return $campos_nuevos;
}
add_filter('woocommerce_default_address_fields' , 'campos_de_direccion');

Ojo que si queremos que salga correctamente traducido en cada idioma que soportamos en nuestra tienda, os recomendamos que los textos en español que aparecen en las opciones label y placeholder las pongáis en inglés y traduzcáis los textos para cada idioma. Para ello podemos utilizar algún plugin como CodeStyling Localization. El problema de esto es que cada vez que WooCommerce se actualice perderemos todas las modificaciones que hayamos hecho en los archivos de traducción, por ello, nosotros hemos preferido dejarlo en español. Otra cosa que hay que tener en cuenta es la opción class que puede tomar 3 posibles valores:

  • form-row-wide: hará que el campo ocupe todo el ancho disponible en el formulario.
  • form-row-first: hará que el campo ocupe la primera mitad del ancho disponible en el formulario.
  • form-row-last: hará que el campo ocupe la segunda mitad del ancho disponible en el formulario.

La opción class también puede adoptar el valor update_totals_on_change, el cual utilizamos para forzar el cálculo del total del envío, tal y como explicamos en ¿Cómo forzar la actualización del total del pedido en WooCommerce?. Por lo que tendremos que jugar con estos valores para que nuestro nuevo campo se incruste de forma adecuada en nuestro formulario. Además, como podéis ver, en nuestro caso en particular hemos modificado el campo Nombre de la empresa y el campo Ciudad para que adopten la clase form-row-first y el campo Provincia para que adopte la clase form-row-last. Esto es posible que tengáis que personalizarlo en función de las necesidades de vuestros formularios. Ahora continuamos añadiéndole el nuevo campo a los formularios con los datos de facturación y de envío, además debemos alterar el formato de dirección predeterminado y el específico para nuestro idioma para que se muestre el nuevo campo NIF/CIF a lo largo y ancho de WooCommerce:

//Añadimos el NIF a la dirección de facturación y envío
function anade_campo_nif_direccion_facturacion($campos, $pedido){
	$campos['nif'] = $pedido->order_custom_fields['_billing_nif'][0];

	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'] = $pedido->order_custom_fields['_shipping_nif'][0];

	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']);

	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}";
	$campos['ES'] = "{name}\n{company}\n{nif}\n{address_1}\n{address_2}\n{postcode} {city}\n{state}\n{country}";

	return $campos;
}
add_filter('woocommerce_localisation_address_formats','formato_direccion_localizacion');

En caso de que uses más idiomas, sólo tendrás que ir añadiendolos en la última función alterando su formato específico para que incluya el campo {nif} que acabamos de crear en la función anterior. Ya lo tenemos todo casi a punto. Ahora vamos a alterar el formulario con los datos de envío para que los campos  Dirección de Email y Teléfono recién añadidos se muestren como es debido. Además vamos a arreglar un problema que hemos detectado en el campo Código postal tanto en el formulario con los datos de envío como en el formulario con los datos de facturación. Para ello vamos a incluir estas funciones:

//Arreglamos el formulario de envío
function formulario_de_envio($campos) {
	$campos['shipping_email'] = array(
		'label' => __('Email Address', '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');

En nuestro caso hemos puesto como requerido sólo el campo Teléfono, aunque puedes modificar la opción required indicándole true o false según lo precises. También hay que modificar los formularios y direcciones que aparecen en Usuarios y en WooCommerce -> Detalles del Pedido, ambos en el Panel de Administración de nuestro WordPress. Lo vamos a conseguir añadiendo estas tres nuevas funciones:

//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);

	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);

	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);

	//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'];

	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
	);

	//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'];

	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');

Gracias a ellas añadiremos los campos NIF/CIF, así como el teléfono y correo electrónico en la dirección de envío. Por último hay que añadir el nuevo campo NIF/CIF a las direcciones que aparecen en Mi cuenta -> Editar mi dirección.

//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);

    //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['city'] = $campos['city'];
    $campos_nuevos['postcode'] = $campos['postcode'];
    $campos_nuevos['state'] = $campos['state'];
    $campos_nuevos['country'] = $campos['country'];

    return $campos_nuevos;
}
add_filter('woocommerce_my_account_my_address_formatted_address', 'anade_campo_nif_editar_direccion', 10, 3);

Para que no te líes, te vamos poner todo el código junto, que es el que tienes que añadir a tu fichero functions.php:

//Arreglamos la dirección predeterminada
function campos_de_direccion($campos) {
	$campos['nif'] = array(
		'label' => __('<abbr lang="es" title="Código de Identificación Fiscal">CIF</abbr>/<abbr lang="es" title="Número de Identificación Fiscal">NIF</abbr>', 'woocommerce'),
		'placeholder' => _x('Introduzca el CIF/NIF', 'placeholder', 'woocommerce'),
		'required' => false,
		'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'] = $campos['phone'];

	return $campos_nuevos;
}
add_filter('woocommerce_default_address_fields' , 'campos_de_direccion');

//Añadimos el NIF a la dirección de facturación y envío
function anade_campo_nif_direccion_facturacion($campos, $pedido){
	$campos['nif'] = $pedido->order_custom_fields['_billing_nif'][0];

	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'] = $pedido->order_custom_fields['_shipping_nif'][0];

	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']);

	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}";
	$campos['ES'] = "{name}\n{company}\n{nif}\n{address_1}\n{address_2}\n{postcode} {city}\n{state}\n{country}";

	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' => __('Email Address', '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);

	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);

	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);

	//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'];

	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
	);

	//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'];

	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');

Con esto ya está todo terminado, configurado y funcionando con toda normalidad. Si quieres ver todo este código en acción, puedes hacerlo en la tienda virtual de Herves-Vida. Esperamos que como siempre esta solución os resulte útil y que en caso de que os encontréis con algún tipo de problema o error nos lo hagáis llegar, así como vuestros comentarios sobre este tutorial.

Actualización: Hemos modificado levemente el código para reparar  un par de errores que hemos detectado y añadir los nuevos campos a las direcciones en Usuarios y Editar mi dirección. También hemos detectado que se provocaban algunos errores y avisos PHP en la tienda virtual, por lo que hemos modificado el código para evitar que aparezca ningún tipo de error o aviso. Arreglamos un problema con el atributo placeholder del campo Código postal, simplificamos aún más el código y añadimos los nuevos campos a las direcciones en Detalles del pedido. Además actualizamos la captura de pantalla. Forzamos la actualización del pedido cuando se cambia de provincia o estado y/o el código postal para dar solución a un error de WooCommerce detectado por Raquel.