¿Cómo añadir un campo NIF o CIF a WooCommerce 2.0?

  • WooCommerce - Blog

¿Cómo añadir un campo NIF o CIF a WooCommerce 2.0?

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.

2017-07-17T21:27:27+02:00 viernes, 29 de noviembre de 2013|Categorías: Art Project Group|Etiquetas: , , , , , , |50 comentarios

50 Comentarios

  1. josecostaros domingo, 1 de diciembre de 2013 en 12:31- Responder

    Hola!

    He seguido todos los pasos y el formulario muestra el campo para el CIF/NIF.

    ¿Donde veo ese dato como administrador?…

    Entro como cliente y veo mis datos correctamente.

    Un saludo,

    • Art Project Group domingo, 1 de diciembre de 2013 en 12:53- Responder

      En el Panel de Administrador, puedes ver los datos en los detalles del pedido y en el propio pedido, puedes acceder a ellos en WooCommerce -> Pedidos.

      Lo que si hemos visto es que no aparece en los datos de Usuario, por lo que vamos a investigar un poco y vamos a añadir la nueva función.

      En un rato publicaremos la función necesaria para añadir el campo NIF/CIF a a esta ventana.

      Muchas gracias por el aviso 😉

      • josecostaros domingo, 1 de diciembre de 2013 en 13:19- Responder

        Ok, ¡perfecto! y gracias a vosotros por vuestros aportes.

        • Art Project Group domingo, 1 de diciembre de 2013 en 15:20- Responder

          Ya tienes arreglados un par de errores que hemos detectado y añadidos los nuevos campos a las direcciones de facturación y envío en Usuarios.

          Ahora ya si podemos decir que es la solución DEFINITIVA ;-).

          • josecostaros domingo, 1 de diciembre de 2013 en 17:10

            He sustituido el código por el nuevo en functions.php y funciona perfecto. ¡BUEN TRABAJO!… a compartir :D. Un abrazo.

  2. Art Project Group lunes, 2 de diciembre de 2013 en 9:28- Responder

    Hemos vuelto a editar la “fórmula secreta” ya que hemos encontrado otro sitio donde faltaba el nuevo campo NIF/CIF, concretamente en Mi cuenta -> Editar mi dirección.

    Esperamos que sea la última modificación y si no iremos actualizando la entrada hasta dejarla perfecta.

    Esperamos que os resulte útil esta entrada.

  3. Sergey domingo, 8 de diciembre de 2013 en 9:32- Responder

    Una pregunta, como puedo poner como campo obligatorio el NIF, y quitar de obligatorio el nombre y apellidos?

    he añadido esto:

    $campos[‘shipping_nif’] = array(
    ‘label’ => __(‘nif’, ‘woocommerce’),
    ‘required’ => true,
    ‘class’ => array(‘form-row-last’),
    ‘clear’ => true,
    );

    Pero no me hace caso

    Por cierto gran trabajo! y gran blog con grandes consejos sobre Woo commerce y WP

    • Art Project Group domingo, 8 de diciembre de 2013 en 10:26- Responder

      En principio así es, tienes que cambiar en todos los campos nif, ojo todos, y no sólo el que estás editando. Por otro lado debes llamar a los campos nombre y apellidos y cambiarles el atributo required a false.

      Y funcionar funciona, ya que lo acabamos de probar en una tienda de prueba sin problema alguno.

      Por cierto, muchas gracias 😉

  4. Sergey domingo, 8 de diciembre de 2013 en 10:50- Responder

    Perdon me he equivocado, lo que quiero que sea obligatorio en la direccion de facturacion no en la de envio.

    En la de envio si unciona, pero lo ideal seria en la de facturacion

    • Art Project Group domingo, 8 de diciembre de 2013 en 11:20- Responder

      Hay que hacer un pequeño hack al código. Cambia la función formulario_de_direccion por esta otra:

      //Arreglamos el formulario de facturación
      function formulario_de_direccion($campos) {
      $requerido = true;
      if (isset($_GET['address']) && $_GET['address'] == 'shipping') $requerido = false;

      $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' => $requerido,
          'class' => array('form-row-last'),
          'clear' => true,
      );
      
      $campos['company']['class'][0] = 'form-row-first';
      $campos['state']['class'][0] = 'form-row-wide';
      
      return $campos;
      

      }
      add_filter('woocommerce_default_address_fields' , 'formulario_de_direccion');

      Se hará magia 😉

      P.D: Ojo que el código no se muestra correctamente ya que WordPress interpreta la etiqueta abbr y la muestra como HTML.

  5. Sergey domingo, 8 de diciembre de 2013 en 11:44- Responder

    Oleee, perfecto,

    Pero ahora hay otro problema, en Ciudad no pone por ejemplo “barcelona, madrid, etc..) sale una B

    ejemplo:

    rrrrr nbvbvb
    ,n,mn,mn,m
    .,nm,n,mn,m67
    nvbnvnbv
    B
    09876

    Ideas para añadir:

    Un añadido , seria que chequease que se ha introducido el nif o cif correcto

    • Art Project Group domingo, 8 de diciembre de 2013 en 12:07- Responder

      En principio no se ha alterado nada en el campo Población/Ciudad, por lo que si te muestra sólo una B es por que es lo que tienes introducido en tu base de datos.

      Por otro lado lo de añadir una validación en el campo NIF/CIF es fácil, sólo tienes que añadirle al campo en cuestión esto:
      'validate' => array('nif'),

      Y añadir una llamada a un nuevo script de JavaScript en functions.php, del estilo a esto:

      function nombre_del_tema_scripts() {
      wp_enqueue_script( 'nombre-del-script', get_template_directory_uri() . '/js/nombre-del-script.js', array(), '1.0.0', true );
      }
      add_action( 'wp_enqueue_scripts', 'nombre_del_tema_scripts' );

      E introducir en la carpeta js el script nombre-del-script.js que valide la clase .validate-nif al estilo del javascript original de WooCommerce que se encarga de validar la clase .validate-email, escrito en JQuery:

      /* Inline validation */

      .on( 'blur change', '.input-text, select', function() {
          var $this = $(this);
          var $parent = $this.closest('.form-row');
          var validated = true;
      
          if ( $parent.is( '.validate-required' ) ) {
              if ( $this.val() == '' ) {
                  $parent.removeClass( 'woocommerce-validated' ).addClass( 'woocommerce-invalid woocommerce-invalid-required-field' );
                  validated = false;
              }
          }
      
          if ( $parent.is( '.validate-email' ) ) {
              if ( $this.val() ) {
      
                  /* http://stackoverflow.com/questions/2855865/jquery-validate-e-mail-address-regex */
                  var pattern = new RegExp(/^((([a-z]|d|[!#$%&'*+-/=?^_`{|}~]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])+(.([a-z]|d|[!#$%&'*+-/=?^_`{|}~]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])+)*)|((x22)((((x20|x09)*(x0dx0a))?(x20|x09)+)?(([x01-x08x0bx0cx0e-x1fx7f]|x21|[x23-x5b]|[x5d-x7e]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(\([x01-x09x0bx0cx0d-x7f]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))))*(((x20|x09)*(x0dx0a))?(x20|x09)+)?(x22)))@((([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])*([a-z]|d|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))).)+(([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])|(([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])([a-z]|d|-|.|_|~|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF])*([a-z]|[u00A0-uD7FFuF900-uFDCFuFDF0-uFFEF]))).?$/i);
      
                  if ( ! pattern.test( $this.val()  ) ) {
                      $parent.removeClass( 'woocommerce-validated' ).addClass( 'woocommerce-invalid woocommerce-invalid-email' );
                      validated = false;
                  }
              }
          }
      
          if ( validated ) {
              $parent.removeClass( 'woocommerce-invalid woocommerce-invalid-required-field' ).addClass( 'woocommerce-validated' );
          }
      } )
      

      Pero eso, ya te lo dejamos como deberes 😉

  6. maxehhh miércoles, 11 de diciembre de 2013 en 21:20- Responder

    Jose, excelente tutorial, estoy tratando de mostrar un capo especifico como el NIF en el billing_address pero no logro que lo muestre (si se ve cuando edito la dirección), me podrías ayudar? Muchas gracias.

    add_filter(‘woocommerce_order_formatted_billing_address’,’cuit_usuario’, 10, 1);
    function cuit_usuario($fields, $order){
    $fields[‘billing_cuit’] = $order->order_custom_fields[‘_billing_cuit’][0];

    return $fields;
    }

    • Art Project Group miércoles, 11 de diciembre de 2013 en 21:34- Responder

      La verdad es que te faltan muchas cosas. Lee bien la entrada ya que tienes que repetir buena parte de ella para crear ese nuevo campo.

  7. bernardo martes, 7 de enero de 2014 en 20:12- Responder

    Hola a todos una pregunta como añadir un campo para adjuntar un archivo en el proceso de compra en woocommerce, si alguien me puede hechar una mano se lo agradezco feliz año a todos

    • Art Project Group martes, 7 de enero de 2014 en 21:05- Responder

      Hola Bernardo. No es por aguarte la fiesta, pero WooCommerce no soporta campos input tipo file, por lo que mucho nos tememos que no es posible sin modificar el código fuente del plugin.

      Un saludo.

  8. pruebafjavierpe lunes, 13 de enero de 2014 en 18:35- Responder

    El código esta muy bien pero a mi me da un problema. No me aparece el placeholder del Código Postal. La entrada de este queda como una línea más de la dirección y no como una entrada aparte que es lo que corresponde.

    • Art Project Group martes, 14 de enero de 2014 en 12:33- Responder

      Hemos reescrito buena parte del código para arreglar ese problema y otro más que hemos detectado en el Panel de Administración de WordPress.

      Muchas gracias por el aviso.

      Esperamos que ahora te guste aún más ;-).

  9. pruebafjavierpe jueves, 16 de enero de 2014 en 10:33- Responder

    Ahora sí que funciona. Ofrecéis una gran ayuda, muchísimas gracias.

  10. Raquel miércoles, 22 de enero de 2014 en 8:38- Responder

    Hola:
    Me gustaría probar este código para mi tienda, pero necesitaría que el campo DNI-CIF también apareciera en los emails de notificación que llegan tanto al cliente como al administrador de la tienda. ¿qué código haría falta?

    Muchas gracias!

    • Art Project Group miércoles, 22 de enero de 2014 en 9:21- Responder

      No hace falta nada.

      En los correos electrónicos aparecerá el DNI/CIF al igual que en el resto de WooCommerce.

      ¡Pruébalo!

  11. raquel jueves, 23 de enero de 2014 en 19:53- Responder

    Hola:
    Lo he probado y funciona perfectísimamente!!!!! Muchísimas gracias!!!!!

  12. Ernesto Blanco C. (@bc_ernesto) miércoles, 29 de enero de 2014 en 22:29- Responder

    Excelente, me ha funcionado de maravilla. Muchas gracias.

  13. Jordi domingo, 16 de febrero de 2014 en 18:42- Responder

    Hola!
    Funcionó perfecto hasta Woocommerce 2.1…
    Con el código se queda colgado en el último paso, después de escojer método de pago, “confirmar pedido”.
    Si quito el código funciona.
    Alguna solución?
    Gracias por el trabajo!

  14. Paco miércoles, 19 de febrero de 2014 en 0:58- Responder

    Al poner el código en el fichero functions.php del tema-child me aparece:
    PHP Parse error: syntax error, unexpected T_VARIABLE in xxxxxx
    Parece que se refiere a la línea:    $campos[‘nif’] = array(
    ¿Que puede ser?

    • Art Project Group miércoles, 19 de febrero de 2014 en 8:09- Responder

      Sin conocer el error exacto y sin conocer el contenido exacto del archivo que lo produce no podemos aseverar nada.

      En cuanto a que el fallo lo provoque una de las dos líneas que indicas, aunque es posible, la verdad es que es poco probable, pero sin conocer el contenido exacto del error y del archivo que lo produce, poco más podemos decir.

      Por otro lado asegúrate de la versión de WooCommerce que estás utilizando. Recuerda que este código ya no funciona en WooCommerce 2.1.

  15. David miércoles, 26 de febrero de 2014 en 12:15- Responder

    Muchas felicidades!!
    He leido en otros foros algunos códigos para añadir a funtions.php y siempre le faltaba algo o no quedaba perfecto. Este es sin duda el mejor que he leído y el que he incorporado a mi web.
    Me habeis ayudado mucho!!!
    Muchas gracias.

  16. Alvaro jueves, 6 de marzo de 2014 en 19:48- Responder

    Hola!!
    Lo primero de todo enhorabuena por este magnífico tutorial, funciona a la perfección. La cuestión es la siguiente:

    ¿Sería posible incorporar el campo NIF en el WooCommerce PDF Invoices & Packing Slips? Soy bastante torpe programando, pero me imagino que no debería ser complicado añadir el campo en los PDF de las facturas que genera ese plugin a través de los datos de Woocommerce.

    Hasta ahora no he sido capaz de conseguirlo. El código que he usado en la plantilla del plugin invoices.php es el siguiente:

    export->order->id,’ nif’,true);
    if (isset($nif)) {
    echo $nif;
    }
    ?>

    La verdad es que tengo poca idea de programar, así que cualquier ayuda es bienvenida.

    Muchas gracias!!

    • Art Project Group jueves, 6 de marzo de 2014 en 20:11- Responder

      Si es posible, pero necesitaríamos tener el código fuente del plugin, y, dado que ya no damos soporte gratuito, que te dieras un paseo por Ticket de soporte ;-).

      Muchas gracias por el comentario.

  17. Paco lunes, 10 de marzo de 2014 en 17:20- Responder

    Efectivamente estoy utilizando la versión 2.1+ de Woocommerce y por ese motivo es posible que no funcione. He encontrado un plugin llamado “WooCommerce Poor Guys Swiss Knife” que parece que permite personalizar esos campos adicionales.

    Muchas gracias por la ayuda.

  18. David lunes, 21 de abril de 2014 en 15:42- Responder

    Hola, hace 1 mes y pico copié el código vuestro en el archivo functions.php para añadir el NIF. Todo funciona perfectamente salvo un detalle. Llevo una semana intentando solucionar un problema que no sabía de donde surgía y que por fin descubro: es por el código vuestro que tengo añadido en el functions.php. El problema que genera es el siguiente:
    Si un cliente hace un pedido a través de la web, el woocommerce manda el correspondiente email a shop manager y al cliente. Hasta aqui todo normal. El problema surge si el shop manager entra en el panel de administración Woocommerce / Pedidos y selecciona ese pedido (que si se realiza seleccionando el pago por Transferencia Bancaria estará en modo de espera). Al entrar en ese pedido y se abre la ventana de “estado de pedido” y selecciono “completado” el pedido parece que no se acaba porque no manda el email de pedido completado (que en mi caso lleva como adjunto un pdf con la factura).
    Lo curioso del asunto es que si en lugar de entrar en el pedido en concreto me quedo en el listado de pedido y le doy a la “V” de completar que hay en la columna de “Acciones”, entonces sí que manda el email de completado.
    Espero haberme explicado bien. Si necesitais alguna otra explicación o capturas de pantalla no dudeis en decidmelo.

    • Art Project Group lunes, 21 de abril de 2014 en 15:58- Responder

      Hola David, gracias por el aviso. Te agradaceríamos que nos mandaras algunas capturas de pantalla o vídeo explicando el problema concretamente a nuestro correo electrónico, sobre todo para ver si se replica el problema en un WooCommerce 2.1.

      Un saludo.

      • David lunes, 21 de abril de 2014 en 20:01- Responder

        Hola, ya os he mandado por email las capturas y una explicación un poco más extensa.

        • Art Project Group martes, 22 de abril de 2014 en 13:28- Responder

          Hola David. Tal y como te acabamos de comentar por correo electrónico, en principio todo nos funciona correctamente, al menos con la última versión de WooCommerce PDF Invoices & Packing Slips bajo WooCommerce 2.17 y WordPress 3.9. Lo que si hemos detectado es un error en el propio plugin que ya hemos reportado al creador del plugin, aunque él dice que no se trata de ningún error, pero eso es ya otra historia ;-).

          Un saludo.

  19. orli19mindali viernes, 9 de mayo de 2014 en 4:58- Responder

    buenas tardes me da error en esta linea de codigo disculpa

    function anade_campo_nif_direccion_facturacion($campos, $pedido){
    $campos[‘nif’] = $pedido->order_custom_fields[‘_billing_nif’][0];

    return $campos;

    }

  20. orli19mindali viernes, 9 de mayo de 2014 en 5:03- Responder

    quisiera ver si se puede acomodar ya q no encuentor otra forma de colocar un nuevos campo y al quitarle ese codigo no me sale con {nif}

    como que no guarda la informacion que se coloca alli es q necesito colocarle al formulario 3 campos mas y quisiera ver si me podrian ayudar

  21. orli19mindali viernes, 9 de mayo de 2014 en 17:12- Responder

    estoy utilizando la Versión 2.1.7

  22. Darío LM sábado, 5 de septiembre de 2015 en 1:23- Responder

    Madre mia, sois unos cracks.

  23. yukikomaid lunes, 5 de octubre de 2015 en 12:51- Responder

    Me funciona perfectamente, pero en el apartado “pedidos” tengo 2 errores:

    Warning: Illegal string offset ‘_billing_nif’ ……………..
    Warning: Illegal string offset ‘_shipping_nif’ …………

    Como puedo arreglar dichos errores?

    • Art Project Group lunes, 5 de octubre de 2015 en 13:26- Responder

      Seguramente no estás usando WooCommerce 2.0, y el código que estás usando es para WooCommerce 2.0.

      Comprueba tu versión de WooCommerce y busca el código adecuado en nuestro blog.

      Un saludo.

  24. Eric miércoles, 16 de marzo de 2016 en 20:46- Responder

    Hola! Para cuándo cómo insertar el código en WC2.5?
    A mí también me da error en los pedidos:
    Warning: Illegal string offset ‘_shipping_nif’

    He pegado el código de las versiones anteriores pero no me funciona…..
    No sé mucho de programación, así que la verdad no sé cómo solucionarlo…

    Un saludo!

  25. Eric jueves, 17 de marzo de 2016 en 9:10- Responder

    Sois geniales!!!
    Muchísimas gracias!

Deje un comentario

Comparte esto con un amigo