In How do you configure VAT for the Canary Islands, Ceuta and Melilla in WooCommerce 2.0? we already promised you that we would explain how to add a NIF/CIF field to WooCommerce easily and simply, and although at first sight it may look as though it is neither easy nor simple, the truth is that it is, as long as we carry out all the steps we state for you below. Although around the Internet there are several partial solutions that are more or less effective, we have not found a complete one, so APG offers you the definitive solution for adding the NIF/CIF field to WooCommerce. As almost always when we get stuck into this kind of job, we have to modify the functions.php file of our WordPress child theme, and this time was not going to be any different. So we are going to explain one by one all the things that have to be added to the functions.php file. In the first place we are going to physically create the fields we need, we are going to lay them out and arrange them correctly for their entry, both in the shipping form and in the billing form, and we will also add the Email Address and Phone fields to the form with the shipping details:
Note that if we want it to come out correctly translated into each language we support in our shop, we recommend that you put the Spanish texts that appear in the label and placeholder options into English and translate the texts for each language. For that we can use a plugin such as CodeStyling Localization. The problem with this is that every time WooCommerce is updated we will lose all the modifications we have made to the translation files, which is why we have preferred to leave it in Spanish. Another thing that has to be taken into account is the class option, which can take 3 possible values:
- form-row-wide: will make the field take up the whole of the width available in the form.
- form-row-first: will make the field take up the first half of the width available in the form.
- form-row-last: will make the field take up the second half of the width available in the form.
The class option can also adopt the value update_totals_on_change, which we use to force the calculation of the shipping total, just as we explain in How do you force the order total to update in WooCommerce?. So we will have to play with these values so that our new field is embedded appropriately in our form. Also, as you can see, in our particular case we have modified the Company Name field and the Town / City field so that they adopt the form-row-first class and the State / County field so that it adopts the form-row-last class. You may have to customise this depending on the needs of your forms. Now we carry on by adding the new field to the forms with the billing and shipping details; we must also alter the default address format and the one specific to our language so that the new NIF/CIF field is shown throughout WooCommerce:
If you use more languages, you will only have to go on adding them in the last function, altering its specific format so that it includes the field we have just created in the previous function. We now have almost everything ready. Now we are going to alter the form with the shipping details so that the newly added Email Address and Phone fields are shown as they should be. We are also going to fix a problem we have detected in the Postcode / Zip field, both in the form with the shipping details and in the form with the billing details. For that we are going to include these functions:
In our case we have made only the Phone field required, although you can modify the required option by stating true or false as you need it. The forms and addresses that appear in Users and in WooCommerce -> Order Details, both in the administration panel of our WordPress, also have to be modified. We are going to achieve it by adding these three new functions:
Thanks to them we will add the NIF/CIF fields, as well as the telephone and email address in the shipping address. Lastly, the new NIF/CIF field has to be added to the addresses that appear in My Account -> Edit My Address.
So that you do not get into a muddle, we are going to give you the whole code together, which is the one you have to add to your functions.php file:
With this, everything is now finished, configured and working perfectly normally. If you want to see all this code in action, you can do so in the Herves-Vida online shop. We hope that, as always, you find this solution useful and that, in the event that you come across any kind of problem or error, you let us know, as well as your comments about this tutorial.
Update: We have slightly modified the code to repair a couple of errors we have detected and to add the new fields to the addresses in Users and Edit My Address. We have also detected that some PHP errors and warnings were being caused in the online shop, so we have modified the code to prevent any kind of error or warning from appearing. We fixed a problem with the placeholder attribute of the Postcode / Zip field, we simplified the code even further and we added the new fields to the addresses in Order details. We also updated the screenshot. We force the order to update when the state or province and/or the postcode is changed, in order to provide a solution to a WooCommerce error detected by Raquel.
Related posts
Comments







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,
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 ;-)
Ok, ¡perfecto! y gracias a vosotros por vuestros aportes.
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 ;-).
He sustituido el código por el nuevo en functions.php y funciona perfecto. ¡BUEN TRABAJO!… a compartir :D. Un abrazo.
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.
Actualizado y perfecto. Gracias de nuevo!.
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
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 ;-)
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
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;
}
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.
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
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 */
Pero eso, ya te lo dejamos como deberes ;-)
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;
}
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.
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
Hola Bernardo. No es por aguarte la fiesta, pero WooCommerce no soporta campos
inputtipofile, por lo que mucho nos tememos que no es posible sin modificar el código fuente del plugin.Un saludo.
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.
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 ;-).
Ahora sí que funciona. Ofrecéis una gran ayuda, muchísimas gracias.
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!
No hace falta nada.
En los correos electrónicos aparecerá el DNI/CIF al igual que en el resto de WooCommerce.
¡Pruébalo!
Hola:
Lo he probado y funciona perfectísimamente!!!!! Muchísimas gracias!!!!!
Excelente, me ha funcionado de maravilla. Muchas gracias.
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!
Efectivamente hay un par de líneas que no le gustan a WooCommerce 2.1. Échale un vistazo a la nueva entrada ¿Cómo añadir un campo NIF o CIF a WooCommerce 2.1?.
Gracias por el aviso.
Genial!
Muchas gracias!
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?
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.
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.
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!!
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 Soporte técnico ;-).
Muchas gracias por el comentario.
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.
Tiene buena pinta, lo probaremos.
De todas formas para WooCommerce 2.1 tienes esta otra entrada: ¿Cómo añadir un campo NIF o CIF a WooCommerce 2.1?.
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.
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.
Hola, ya os he mandado por email las capturas y una explicación un poco más extensa.
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.
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;
}
Comprueba que estás usando WooCommecer 2.0.x.
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
Claro, para eso tienes nuestra Soporte técnico.