Skip to content

Instantly share code, notes, and snippets.

@Miq3l
Forked from SiR-DanieL/functions.php
Last active June 22, 2021 14:15
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save Miq3l/4870eecc80bb6a1f537c575e848ef2b5 to your computer and use it in GitHub Desktop.
Save Miq3l/4870eecc80bb6a1f537c575e848ef2b5 to your computer and use it in GitHub Desktop.
Adding VAT to WooCommerce
/***************************** FRONTEND ****************************************/
/**************************
Filter to add a VAT field to:
- My Account - Edit Form -- Billing fields
- Checkout - Edit Form - Billing Fields
This function is also reordering the form fields
Source: https://docs.woothemes.com/document/tutorial-customising-checkout-fields-using-actions-and-filters
***************************/
function add_woocommerce_billing_fields($billing_fields){
//reorder woo my billing address form fields
$billing_fields2['billing_first_name'] = $billing_fields['billing_first_name'];
$billing_fields2['billing_last_name'] = $billing_fields['billing_last_name'];
$billing_fields2['billing_vat'] = array(
'type' => 'text',
'label' => __('VAT number', 'keyelp-shop-customization' ),
'class' => array('form-row-wide'),
'required' => false,
'clear' => true
);
//unimos el resto de campos
$merged_billing_fields = $billing_fields2 + $billing_fields;
return $merged_billing_fields;
}
add_filter('woocommerce_billing_fields' , 'add_woocommerce_billing_fields');
/*********
Filters to add VAT when printing billing address on:
- (1) My account
- (2) Checkout - Order Received (after checkout compeltion),
+++ Additional filters to format the printed output.
********/
// (1) Printing the Billing Address on My Account
add_filter( 'woocommerce_my_account_my_address_formatted_address', 'custom_my_account_my_address_formatted_address', 10, 3 );
function custom_my_account_my_address_formatted_address( $fields, $customer_id, $type ) {
if ( $type == 'billing' ) {
$fields['vat'] = get_user_meta( $customer_id, 'billing_vat', true );
}
return $fields;
}
// (2) Checkout -- Order Received (printed after having completed checkout)
add_filter( 'woocommerce_order_formatted_billing_address', 'custom_add_vat_formatted_billing_address', 10, 2 );
function custom_add_vat_formatted_billing_address( $fields, $order ) {
$fields['vat'] = $order->billing_vat;
return $fields;
}
// Creating merger VAT variables for printing formatting
add_filter( 'woocommerce_formatted_address_replacements', 'custom_formatted_address_replacements', 10, 2 );
function custom_formatted_address_replacements( $address, $args ) {
$address['{vat}'] = '';
$address['{vat_upper}']= '';
if ( ! empty( $args['vat'] ) ) {
$address['{vat}'] = $args['vat'];
$address['{vat_upper}'] = strtoupper($args['vat']);
}
return $address;
}
//Defining the Spanish formatting to print the address, including VAT.
add_filter( 'woocommerce_localisation_address_formats', 'custom_localisation_address_format' );
function custom_localisation_address_format( $formats ) {
$formats['ES'] = "{name}\n{company}\n{vat_upper}\n{address_1}\n{address_2}\n{postcode} {city}\n{state}\n{country}";
return $formats;
}
/***************************** ADMIN USER PROFILE PAGE ****************************************/
/***************
Filter to add VAT Customer meta fields (user profile field on the billing address grouping)
*****************/
add_filter( 'woocommerce_customer_meta_fields', 'custom_customer_meta_fields' );
function custom_customer_meta_fields( $fields ) {
$fields['billing']['fields']['billing_vat'] = array(
'label' => __( 'VAT number', 'keyelp-shop-customization' )
);
return $fields;
}
/*************************** ADMIN ORDER PAGE ****************************************/
/*********
Filter to add VAT to the Edit Form on: Order -- Admin page
*********/
add_filter( 'woocommerce_admin_billing_fields', 'custom_admin_billing_fields' );
function custom_admin_billing_fields( $fields ) {
$fields['vat'] = array(
'label' => __( 'VAT number', 'keyelp-shop-customization' ),
'show' => true
);
return $fields;
}
/****************
Filter to copy the VAT field from User meta fields to the Order Admin form (after clicking dedicated button on admin page)
******************/
add_filter( 'woocommerce_found_customer_details', 'custom_found_customer_details' );
function custom_found_customer_details( $customer_data ) {
$customer_data['billing_vat'] = get_user_meta( $_POST['user_id'], 'billing_vat', true );
return $customer_data;
}
@wmachanik
Copy link

Thank you for this code. I have implemented it and it does display the VAT label and text field in the order confirmation form, and in the order form under orders. But it does not add it to the address that get sent as part of the email confirmation of the order. Have I missed something? Has the filter changed name in the latest version of Woo? the site it is implemented on is http://www.quaffee.com

@stefanoconsole
Copy link

stefanoconsole commented Mar 29, 2018

Hi, if i want to translate the label in other language?
And if i've two user roles (Customer and Company) and i want to hide the VAT label for Customer user?
How can i do?
Thanks a lot

@peaceofcake
Copy link

Hello,

Your code works great. Thank you!

The only thing that isn't working is in the page 'edit order' the 'Load billing address' link does not load the VAT number stored in the user profile.

Do you have any idea how to fix this?

Thanks
Steven

@Membele
Copy link

Membele commented Jun 29, 2019

Hello,

Your code works great. Thank you!

The only thing that isn't working is in the page 'edit order' the 'Load billing address' link does not load the VAT number stored in the user profile.

Do you have any idea how to fix this?

Thanks
Steven

Hi, you can fix this by changing the function custom_add_vat_formatted_billing_address in line 59 by

add_filter( 'woocommerce_order_formatted_billing_address', 'custom_add_vat_formatted_billing_address', 10, 2 );
function custom_add_vat_formatted_billing_address( $fields, $order ) {
	
	$values = get_post_custom( $order->get_id() );
	
	if(isset($values['_billing_vat'][0])) {
		$fields['vat'] = $values['_billing_vat'][0];
	}
	
	return $fields;	
}

@DayleySenior
Copy link

Hi, I used this code and all seems to be working perfectly first time! Many thanks for providing.
I am just wondering how I can add the string translations as our website uses the Polylang plugin for multilingual purposes, but the strings do not appear in the available strings list for me to add language translations. Can you advise?

@farynaio
Copy link

farynaio commented Feb 1, 2020

Amazing, thank you!

@kingofcopy
Copy link

Hello all
The code works good but i have error in error_log

[18-Jun-2020 21:35:46 UTC] billing_vat was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_COD->process_payment, WC_Order->update_status, WC_Order->save, WC_Order->status_transition, do_action('woocommerce_order_status_pending_to_processing'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Emails::send_transactional_email, do_action_ref_array('woocommerce_order_status_pending_to_processing_notification'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Email_New_Order->trigger, WC_Email->get_content, WC_Email_New_Order->get_content_html, wc_get_template_html, wc_get_template, include('/plugins/woocommerce/templates/emails/admin-new-order.php'), do_action('woocommerce_email_customer_details'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Emails->email_addresses, wc_get_template, include('/plugins/woocommerce/templates/emails/email-addresses.php'), WC_Order->get_formatted_billing_address, apply_filters('woocommerce_order_formatted_billing_address'), WP_Hook->apply_filters, custom_add_vat_formatted_billing_address, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.

How to fix this ? WP is latest version also WC
Thanks
Bill

@lonniept
Copy link

Hi! Thx for the code!
However, I also have the same error:
[15-Feb-2021 17:50:15 UTC] billing_vat was called incorrectly. Order properties should not be accessed directly. Backtrace: require('wp-blog-header.php'), require_once('wp-includes/template-loader.php'), do_action('template_redirect'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::do_wc_ajax, do_action('wc_ajax_checkout'), WP_Hook->do_action, WP_Hook->apply_filters, WC_AJAX::checkout, WC_Checkout->process_checkout, WC_Checkout->process_order_payment, WC_Gateway_BACS->process_payment, WC_Order->update_status, WC_Order->save, WC_Order->status_transition, do_action('woocommerce_order_status_pending_to_on-hold'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Emails::send_transactional_email, do_action_ref_array('woocommerce_order_status_pending_to_on-hold_notification'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Email_Customer_On_Hold_Order->trigger, WC_Email->get_content, WC_Email_Customer_On_Hold_Order->get_content_html, wc_get_template_html, wc_get_template, include('/plugins/kadence-woocommerce-email-designer/templates/woo/emails/customer-on-hold-order.php'), do_action('woocommerce_email_customer_details'), WP_Hook->do_action, WP_Hook->apply_filters, WC_Emails->email_addresses, wc_get_template, include('/plugins/kadence-woocommerce-email-designer/templates/woo/emails/email-addresses.php'), WC_Order->get_formatted_billing_address, apply_filters('woocommerce_order_formatted_billing_address'), WP_Hook->apply_filters, njengah_add_vat_formatted_billing_address, WC_Abstract_Legacy_Order->__get, wc_doing_it_wrong. This message was added in version 3.0.

Do you have any idea of what it could be? How can I fix this? Thank you so much in advance!

@jicao
Copy link

jicao commented Jun 22, 2021

Hello,

I found the solution here about
billing_vat was called incorrectly

add_filter( 'woocommerce_order_formatted_billing_address', 'custom_add_vat_formatted_billing_address', 10, 2 );
function custom_add_vat_formatted_billing_address( $fields, $order ) {
    $fields['vat'] = $order->get_meta('billing_vat');

    return $fields;
}

Hope this will help others :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment