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

  • WooCommerce - Blog

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

Formulario de pedido de la tienda virtual de Herves-Vida

Formulario de pedido de la tienda virtual de Herves-Vida

En ¿Cómo añadir un campo NIF o CIF a WooCommerce 2.0? os explicamos cómo añadir un campo NIF/CIF a WooCommerce, y el código funciona perfectamente en WooCommerce 2.0, pero al haberse publicado la nueva versión 2.1, ha dejado de funcionar. Por ello abrimos esta nueva entrada con el nuevo código, al que en realidad sólo hay que cambiarle dos líneas y añadirle una nueva función, para que todos aquellos que decidan continuar con WooCommerce 2.0 puedan seguir usando el código antiguo, y los que ya habéis actualizado a WooCommerce 2.1, podáis utilizar este nuevo que hoy os proponemos.

Esta vez no vamos a entrar a detallar el código, ya que el que necesite conocer a fondo cada función puede hacerlo en la anterior entrada.

Al igual que en las funciones anteriores, vamos a añadir el siguiente código PHP al archivo functions.php de nuestra plantilla o hijo de la plantilla:

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

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

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

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

Tras modificarlo y guardarlo, veremos que los errores y problemas que nos habían aparecido con WooCommerce 2.1 desaparecerán.

Esperamos que os resulte útil y que nos aviséis de los posibles problemas que os aparezcan para ir actualizando el código cuando sea necesario.

2017-03-27T18:07:34+02:00 domingo, 16 de febrero de 2014|Categorías: Art Project Group|Etiquetas: , , , , , , , |33 comentarios

33 Comentarios

  1. Vincent miércoles, 9 de abril de 2014 en 0:04- Responder

    Hola, muchas gracias por este aporte. Tengo una duda donde se incluye este codigo, al final o donde del archivo del functions.php y tambien si funciona con la última versión de woocommerce 2.1.6.
    Muchas gracias de antemano.

    • Art Project Group miércoles, 9 de abril de 2014 en 6:56- Responder

      Da igual dónde lo coloques, mientras lo coloques en el archivo functions.php, y si, es 100% funcional para todas las versiones de WooCommerce 2.1.x publicadas hasta ahora.

      Un saludo.

  2. John Dante Lopez Paredes viernes, 25 de abril de 2014 en 23:06- Responder

    Hola, tengo una duda y disculpen la molestia, pero en cual functions.php va el código, el de WP o en el woocommerce, gracias de antemano

  3. pacor martes, 6 de mayo de 2014 en 13:53- Responder

    gracias por el aporte, mi pregunta es que necesito que el campo cif sea obligatorio, he puesto en el codigo “true” en vez de “False” y me aparece bien pero el problema es al ir a realizar el pago y no pongo nada en el campo me sale un error en vez de salirme ningun mensaje de que tengo que rellenar el campo. Donde se encuentran estos mensajes o como crees que lo puedo solucionar?

    gracias de antemano por la ayuda.

    • Art Project Group viernes, 9 de mayo de 2014 en 18:33- Responder

      A ver si sacamos un poco de tiempo y lo probamos, ya que teoricamente funciona, al menos en las pruebas que hemos hecho en el pasado funcionar, funcionaba, aunque también es verdad que fueron sobre WooCommerce 2.0. En cuanto tengamos alguna novedad te respondemos por esta misma vía.

      Gracias por el aviso.

    • Art Project Group lunes, 19 de mayo de 2014 en 14:07- Responder

      Buenas tardes. Acabamos de hacer la prueba y funciona perfectamente, si dejas el campo NIF/CIF en blanco te sale este mensaje de error:
      CIF/NIF es un campo requerido.

      En cuanto, a de donde sale ese mensaje de error, sale del archivo class-wc-checkout.php, en la carpeta includes de WooCommerce, concretamente de la línea 500, y es editable desde la traducción del propio WooCommerce con algún plugin del estilo a Codestyling Localization.

      Si te sale cualquier otra cosa, es posible que tu plantilla no esté bien configurada para WooCommerce 2.1 o que tengas algún tipo de problema con AJAX, ya que el error que se muestra es generado por una consulta AJAX.

      Esperamos haberte servido de ayuda.

      Un saludo.

  4. black_mamba martes, 6 de mayo de 2014 en 18:53- Responder

    Seria interesante ciertamente implementar eso que comentas

  5. Max miércoles, 14 de mayo de 2014 en 18:37- Responder

    Muy buen aporte! Lo he estado probando y funciona correctamente. Solo tengo una duda, en qué sitio de la base de datos guarda el cif/nif del cliente?

    • Art Project Group miércoles, 14 de mayo de 2014 en 18:43- Responder

      En la misma tabla donde se guardan todos los demás metacampos de WordPress, en la tabla wp_postmeta.

      Un saludo.

  6. Enrique miércoles, 4 de junio de 2014 en 11:28- Responder

    No me funciona, me da el error:

    Parse error: syntax error, unexpected ‘$campos’ (T_VARIABLE) in C:\xampp\htdocs\wordpress\wp-content\themes\mommerce\functions.php on line 19

    ¿Cómo podría solucionarlo?

    • Art Project Group jueves, 5 de junio de 2014 en 9:11- Responder

      Confirma si tienes instalado WooCommerce 2.1.x, ya que este código funciona perfectamente, confirmado por cientos de instalaciones.

      Un saludo.

  7. manuel martes, 10 de junio de 2014 en 12:19- Responder

    Antes de nada agradeceros este codigo. Está genial.
    Pero creo que tiene un fallito o yo hice algo mal…

    Si tu creas un pedido de manera manual desde el panel de administrador, seleccionas un cliente que tiene el campo CIF cubierto, y luego le das a “cargar dirección de facturación” el formulario se autorellena… MENOS EN EL CAMPO DEL NIF… 🙁

    jejeje seguro que es una pijada que se soluciona muy facilmente… pero a mi se me escapa por ahora como arreglarlo.
    Si le encontráis una solucion… SERIA PERFECTO… MUCHAS GRACIAS. 🙂

    Un saludo a tod@s.

    • Art Project Group martes, 10 de junio de 2014 en 15:46- Responder

      En realidad no es ninguna ‘pijada’, ya que hay que modificar los archivos meta-boxes.js y class-wc-ajax.php para que WooCommerce soportara los campos añadidos manualmente, lo que implica que cuando actualices tu WooCommerce, las modificaciones resultarían inútiles. Aún utilizando el filtro woocommerce_found_customer_details, no tendría mucho sentido sin crear un nuevo JavaScript para controlar el evento click del botón.

      Por otro lado, efectivamente el campo NIF/CIF se come todo lo que sea texto, ya que no tiene ningún filtro. Puedes probar a añadirle el argumento custom_attributes en el array, e introducirle un array con el atributo pattern y una expresión regular que haga lo que necesitas.

      Un saludo.

      • manuel martes, 10 de junio de 2014 en 16:03- Responder

        Lamentablemente mis conocimientos no llegan tanto en programación… y menos en woocomerce (vengo de otras plataformas, pero en esta soy novatillo). Solo lo comenté por si era algo fácil de modificar. Si no pues se copia manualmente este dato de la ficha del cliente y listo.

        Muchisimas gracias por vuestra atención 🙂

  8. manuel martes, 10 de junio de 2014 en 12:28- Responder

    y por cierto… otro detalle también a tener en cuenta sería una posible validación de los datos que se introducen en ese campo… porque he comprobado que puedes meter cualquier dato… sin letra, con letra… INCLUSO TODO LETRAS jajajajaja la verdad es que el código está muy bien, pero yo le he encontrado un par de cosillas que igual se pueden retocar…

    Un saludo!!!

  9. Marc viernes, 13 de junio de 2014 en 21:54- Responder

    Hola,

    utilizo este código sin problema alguno, pero después de que woocommerce se haya actualizado a la última versión (2.1.11) los campos del formulario de compra salen en ingles, los únicos que salen en español son los campos de NIF y Codigo postal.

    Puede deberse al código indicado arriba o es cosa de woocommerce?

    Muchas gracias y saludos.

  10. extruendo viernes, 20 de junio de 2014 en 1:01- Responder

    Hola, estoy intentando que el nuevo campo solo aparezca en el formulario de “dirección de envió”, pero no logro hacerlo.
    que línea tendría que eliminar?

    • Art Project Group viernes, 20 de junio de 2014 en 7:36- Responder

      Hay que omitir todo lo relacionado con los campos billing y mantener todo lo relacionado con los campos shipping.

      Un saludo.

  11. thegrip domingo, 31 de agosto de 2014 en 11:27- Responder

    Hola, funciona perfectamente. Una consulta, si se tiene el plugin PDF Invoice para generar la factura en PDF como hago para que me aparezca en el PDF generado. El campo es _billing_nif. Lo intento así
    export->order->id,’_billing_nif’,true); ?>
    pero no sale nada.
    Gracias, un saludo.

  12. irene viernes, 12 de septiembre de 2014 en 10:09- Responder

    Muchas gracias!!
    Funciona perfectamente!!
    Me habeis salvado de un marrón al que le estaba dando vueltas desde hace unos días.
    Muchas gracias!!

  13. irene jueves, 18 de septiembre de 2014 en 9:41- Responder

    hola!!
    Tengo un problemilla no me funciona que el campo CIF sea obligatorio. Tengo WooCommerce Versión 2.1.12 . y mi THEME en MyStile. No se como solucionarlo porque decís que os funciona a todos pero en mi caso si no lo relleno no pasa nada, ni da error ni nada, se puede seguir con la compra. Alguna sugerencia??

  14. irene jueves, 18 de septiembre de 2014 en 9:51- Responder

    Hola de nuevo!!
    Repasando los comentarios he conseguido la respuesta para solucionarlo.
    He puesto en la función :
    function campos_de_direccion($campos) {
    ‘required’ => true,
    Perdonar mi torpeza pero soy novatilla en estas cosillas.
    Lo pongo por si hay gente como yo que no se entera mucho de la fiesta.
    Muchas gracias de todas maneras.
    Un saludo.

  15. power sábado, 15 de agosto de 2015 en 22:07- Responder

    Tendrían que actualizar el orden de los campos esta ultima versión de woocomerce Versión 2.4.4 salen desordenados hay algo que cambiado en woocommerce que no queda como por ejemplo hasta versión anterior a esta a partir de esta versión tanto formulario de finalizar compra como cuenta del usuario los campos no salen organizados como estaban.

  16. David miércoles, 16 de septiembre de 2015 en 15:47- Responder

    Hola.
    Funciona en WooCommerce 2.2.x. Tenía la duda.
    Gracias por el código.

    Saludos.

    • Art Project Group miércoles, 16 de septiembre de 2015 en 18:06- Responder

      Si. Este código ha funcionado sin problemas hasta la versión 2.3 inclusive.

      Un saludo.

  17. David jueves, 17 de septiembre de 2015 en 13:30- Responder

    Hola de nuevo,
    La opción de hacer el campo CIF/NIF obligatorio no funciona. Tengo WooCommerce 2.2.X. He puesto el valor ‘true’ en ‘required’ => true. Después he realizado una prueba no rellenando dicho campo y al pinchar en “Siguiente”, me ha llevado a la página de pago… ¿No me estaré dejando algo?.
    Saludos,

    • Art Project Group jueves, 17 de septiembre de 2015 en 14:40- Responder

      Seguro que algo no estás haciendo bien ya que el código publicado es totalmente funcional.

      Un saludo.

      • David jueves, 17 de septiembre de 2015 en 15:13- Responder

        Acabo de darme cuenta que la validación de los campos obligatorios sucede después de elegir la opción de pago.
        He dejado todos los campos vacíos, he pinchado en “siguiente”, me ha llevado a la opción de pago, he elegido “transferencia bancaria”, “siguiente”, me aparece el producto con el coste final, he pinchado en “Realizar pedido” y acto seguido he sido redirigido a la página del formulario donde se me han mostrado los campos que son requeridos ?¿ Que funcionamiento más raro, no?
        Este mensaje se debería de mostrar antes de llevarte a la página de pago… Lo dejo como un “mal menor”, dado que el CIF es uno de los campos requeridos también.
        Saludos

Deje un comentario

Comparte esto con un amigo