Este código incorpora un nuevo campo para el NIF en la página de pago de tu tienda. Sin embargo, su funcionalidad va más allá. Además de mostrar el NIF en la página de pago, también lo registra en la ficha del cliente, en los detalles de los pedidos y lo presenta en las facturas correspondientes.
Adicionalmente, tendrás la capacidad de editar el NIF de cualquier cliente en caso de necesidad futura y actualizar sus facturas con la nueva información.
/** ###################################################################### * Añade el campo NIF al formulario de pago y lo guarda en los datos del pedido * ###################################################################### */ if ( in_array( 'woocommerce/woocommerce.php', get_option( 'active_plugins' ) ) ){ // Añade el campo NIF al formulario de datos de facturación del checkout add_filter("woocommerce_checkout_fields", function($fields){ error_log(print_r($fields, true)); $nifField = array( 'label' => __('<abbr lang="es" title="Número de Identificación Fiscal">NIF</abbr>', 'woocommerce'), 'placeholder' => _x('Ej: 99999999E', 'placeholder', 'woocommerce'), 'required' => false, 'class' => array('form-row-first'), ); //Asigna nuevas clases de estilo a algunos campos del formulario $fields[ 'billing' ][ 'billing_company' ][ 'class' ][0] = 'form-row-last'; $fields[ 'billing' ][ 'billing_company' ][ 'clear' ] = true; $fields[ 'billing' ][ 'billing_city' ][ 'class' ][0] = 'form-row-first'; $fields[ 'billing' ][ 'billing_state' ][ 'class' ][0] = 'form-row-last update_totals_on_change'; $fields[ 'billing' ][ 'billing_postcode' ][ 'class' ][0] .= ' update_totals_on_change'; //Ordena los campos del formulario $orderedFields = array(); $orderedFields = array_slice( $fields[ 'billing' ], 0, 2, true ); $orderedFields[ 'billing_nif' ] = $nifField; $orderedFields = array_merge( $orderedFields, array_slice( $fields[ 'billing' ], 2 ) ); $fields[ 'billing' ] = $orderedFields; return $fields; }); //Nueva función para hacer compatible el código con WooCommerce 2.1 function obtener_campo_personalizado( $field, $order) { $value = get_post_meta( $order, $field, false ); if ( isset( $value[0] ) ) return $value[0]; return NULL; } //Añade el NIF a la dirección de facturación y envío add_filter('woocommerce_order_formatted_billing_address','agrega_campo_nif_direccion_facturacion', 1, 2); function agrega_campo_nif_direccion_facturacion($fields, $order) { // Mantiene compatibilidad con versiones de WC < 3.0.0 if ( version_compare( WC()->version, '3.0.0', '<' ) ) { $fields['nif'] = obtener_campo_personalizado('_billing_nif', $order->id); }else{ $fields['nif'] = obtener_campo_personalizado('_billing_nif', $order->get_id()); } return $fields; } add_filter('woocommerce_order_formatted_shipping_address','agrega_campo_nif_direccion_envio', 1, 2); function agrega_campo_nif_direccion_envio($fields, $order) { // Mantiene compatibilidad con versiones de WC < 3.0.0 if ( version_compare( WC()->version, '3.0.0', '<' ) ) { $fields['nif'] = obtener_campo_personalizado('_shipping_nif', $order->id); }else{ $fields['nif'] = obtener_campo_personalizado('_shipping_nif', $order->get_id()); } return $fields; } add_filter('woocommerce_formatted_address_replacements','formato_direccion_de_facturacion', 1, 2); function formato_direccion_de_facturacion($fields, $argumentos) { if ( isset( $argumentos['nif'] ) ) { $fields['{nif}'] = $argumentos['nif']; $fields['{nif_upper}'] = strtoupper($argumentos['nif']); } return $fields; } //Reordena los campos de la dirección predeterminada add_filter('woocommerce_localisation_address_formats','formato_direccion_localizacion' ); function formato_direccion_localizacion( $fields ) { // No hace nada si está en el carrito de compra if ( is_cart() ) return $fields; $new_fields = $fields; foreach ( $fields as $country => $format ) { $new_fields[ $country ] = str_replace( "{company}" , "{company}\n{nif}", $format ); } return $new_fields; } //Añade el campo CIF/NIF a usuarios add_filter('woocommerce_customer_meta_fields', 'agrega_campos_administracion_usuarios'); function agrega_campos_administracion_usuarios($fields) { $orderedFields = array(); $fields['billing']['fields']['billing_nif'] = array( 'label' => __( 'NIF', 'woocommerce' ), 'description' => '' ); //Ordena los campos en el perfil del cliente $orderedFields[ 'billing' ][ 'title' ] = $fields['billing']['title']; $orderedFields[ 'billing' ][ 'fields' ] = array_slice( $fields['billing']['fields'], 0, 3, true ); $orderedFields['billing']['fields']['billing_nif'] = $fields['billing']['fields']['billing_nif']; $orderedFields[ 'billing' ][ 'fields' ] = array_merge( $orderedFields[ 'billing' ][ 'fields' ], array_slice( $fields[ 'billing' ][ 'fields' ], 3 ) ); $orderedFields[ 'shipping' ] = $fields['shipping']; return $orderedFields; } //Añadimos el NIF a la dirección de facturación y envío add_filter('woocommerce_user_column_billing_address','agrega_campo_nif_usuario_direccion_facturacion', 1, 2); function agrega_campo_nif_usuario_direccion_facturacion($fields, $user) { $fields['nif'] = get_user_meta($user, 'billing_nif', true); return $fields; } //Añade el campo NIF a Editar mi dirección add_filter('woocommerce_my_account_my_address_formatted_address', 'agrega_campo_nif_editar_direccion', 10, 3); function agrega_campo_nif_editar_direccion($fields, $user, $name) { $fields['nif'] = get_user_meta($user, $name . '_nif', true); //Ordena los campos $fields_nuevos['first_name'] = $fields['first_name']; $fields_nuevos['last_name'] = $fields['last_name']; $fields_nuevos['company'] = $fields['company']; $fields_nuevos['nif'] = $fields['nif']; $fields_nuevos['address_1'] = $fields['address_1']; $fields_nuevos['address_2'] = $fields['address_2']; $fields_nuevos['postcode'] = $fields['postcode']; $fields_nuevos['city'] = $fields['city']; $fields_nuevos['state'] = $fields['state']; $fields_nuevos['country'] = $fields['country']; return $fields_nuevos; } //Añade el campo NIF a Detalles del pedido add_filter('woocommerce_admin_billing_fields', 'agrega_campo_nif_editar_direccion_pedido'); add_filter('woocommerce_admin_shipping_fields', 'agrega_campo_nif_editar_direccion_pedido'); function agrega_campo_nif_editar_direccion_pedido( $fields ) { $fields['nif'] = array( 'label' => __('NIF', 'woocommerce') ); //Ordena los campos $fields_nuevos['first_name'] = $fields['first_name']; $fields_nuevos['last_name'] = $fields['last_name']; $fields_nuevos['company'] = $fields['company']; $fields_nuevos['nif'] = $fields['nif']; $fields_nuevos['address_1'] = $fields['address_1']; $fields_nuevos['address_2'] = $fields['address_2']; $fields_nuevos['postcode'] = $fields['postcode']; $fields_nuevos['city'] = $fields['city']; $fields_nuevos['state'] = $fields['state']; $fields_nuevos['country'] = $fields['country']; if ( !empty( $fields['email'] ) ) { $fields_nuevos['email'] = $fields['email']; } if ( !empty( $fields['phone'] ) ) { $fields_nuevos['phone'] = $fields['phone']; } return $fields_nuevos; } add_filter( 'woocommerce_found_customer_details', 'carga_el_nif_en_datos_cliente_crear_nuevo_pedido', 10, 3 ); function carga_el_nif_en_datos_cliente_crear_nuevo_pedido( $customer_data, $user_id, $type_to_load ){ $customer_data[ $type_to_load . '_nif' ] = get_user_meta( $user_id, $type_to_load . '_nif', true ); return $customer_data; } }