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:
[/fusion_builder_column]//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.
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.
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.
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
Ni en uno, ni en otro, en el del tema (plantilla), o tema hijo (child).
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.
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.
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.
Seria interesante ciertamente implementar eso que comentas
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?
En la misma tabla donde se guardan todos los demás metacampos de WordPress, en la tabla wp_postmeta.
Un saludo.
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?
Confirma si tienes instalado WooCommerce 2.1.x, ya que este código funciona perfectamente, confirmado por cientos de instalaciones.
Un saludo.
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 [email protected]
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.
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 :)
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!!!
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.
Es un bug de WooCommerce 2.1.11.
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?
Hay que omitir todo lo relacionado con los campos billing y mantener todo lo relacionado con los campos shipping.
Un saludo.
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.
En principio no hay que hacer nada, debería incluirlo de forma automática.
Si continúas con problemas, recuerda nuestra Soporte técnico.
Un saludo.
Muchas gracias!!
Funciona perfectamente!!
Me habeis salvado de un marrón al que le estaba dando vueltas desde hace unos días.
Muchas gracias!!
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??
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.
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.
Lo revisamos y actualizamos lo antes posible.
Un saludo.
Ya lo tienes solucionado en ¿Cómo añadir un campo NIF o CIF con validación a WooCommerce 2.4?.
Gracias por el aviso.
Un saludo.
Hola.
Funciona en WooCommerce 2.2.x. Tenía la duda.
Gracias por el código.
Saludos.
Si. Este código ha funcionado sin problemas hasta la versión 2.3 inclusive.
Un saludo.
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,
Seguro que algo no estás haciendo bien ya que el código publicado es totalmente funcional.
Un saludo.
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
No funcionan los botones para ver el código posteando en redes :/
Gracias por el aviso. Ya está resuelto el problema.
Un saludo.