Posted on

WooCommerce: Remove Tax if Checkout Field Value Exists

You can use to exempt someone from Tax/VAT if they enter a Tax/VAT number, or maybe if they specify a given ZIP code.

When I discovered the WooCommerce function set_is_vat_exempt(), together with a little trick to “get” a checkout field programmatically, the snippet was pretty simple to build and test. Here’s the lovely piece of code ๐Ÿ™‚

WooCommerce: zero tax/vat if ZIP code equals ‘XYZ’

PHP Snippet: Remove Tax @ WooCommerce Checkout if Field Value Exists


/**
 * @snippet       Remove Tax @ Checkout if Field Value Exists - WooCommerce
 * @how-to        Watch tutorial @ https://businessbloomer.com/?p=19055
 * @sourcecode    https://businessbloomer.com/?p=21952
 * @author        Rodolfo Melogli
 * @compatible    WC 3.2.6
 */

add_action( 'woocommerce_checkout_update_order_review', 'bbloomer_taxexempt_checkout_based_on_zip' );

function bbloomer_taxexempt_checkout_based_on_zip( $post_data ) {
        global $woocommerce;
        $woocommerce->customer->set_is_vat_exempt( false );
        parse_str($post_data);
        if ( $billing_postcode == '32444' ) $woocommerce->customer->set_is_vat_exempt( true );
}

Where to add this code?

You can place PHP snippets at the bottom of your child theme functions.php file (before "?>" if you have it). CSS, on the other hand, goes in your child theme style.css file. Make sure you know what you are doing when editing such delicate files - if you need more guidance, please take a look at my free WooCommerce Customization video tutorial.

Does this snippet still work?

Please let me know in the comments if everything worked as expected. I would be happy to revise the snippet if you report otherwise (please provide screenshots). I have tested this code with Storefront theme, the WooCommerce version listed above and a WordPress-friendly hosting on PHP 7.

If you think this code saved you time & money, please join other Business Bloomer supporters and avail of 365 days of WooCommerce benefits. Thank you in advance :)

Need Help with WooCommerce?

Check out these free videos, tutorials and tips!

  • how-to-edit-woocommerce-with-php-snippets
  • woocommerce-hooks-add_action-list-visual
  • woocommerce-customize-single-product-page-PHP
  • woocommerce-customize-shop-page-PHP
  • woocommerce-advanced-customization
  • how-to-edit-woocommerce-cart
  • woocommerce-customize-checkout-page-PHP
  • woocommerce-email-customization
  • woocommerce-conditional-logic

Rodolfo Melogli

Author, WooCommerce expert, WordCamp speaker and Internet marketer, Rodolfo Melogli has worked as a WooCommerce freelancer since 2011. He helps entrepreneurs and developers overcome their WooCommerce nightmares :) Rodolfo is the organiser of WordCamp Dublin, the Dublin WooCommerce Meetup, the Dublin Ecommerce Meetup and the Dublin WordPress Meetup. He enjoys interacting with people, travelling and chasing tennis & soccer balls. Of course, he loves pizza too.

15 thoughts on “WooCommerce: Remove Tax if Checkout Field Value Exists

  1. Hi Rodolfo,

    Great Code!
    is there any way to update product subtotal too?

    Thanks

    1. Hello Sigma, thanks so much for your comment! Yes, this is possible – but unfortunately this is custom work and I cannot provide a complementary solution here via the blog comments. Thanks a lot for your understanding! ~R

  2. Thanks Rodolfo, I use your code but unfortunatly it doesn’t work when you place an order. The thank-you page diplays the price with the tax even if at the check out it’s zero. Don’t know why… ๐Ÿ™

    1. Hey Federico ๐Ÿ™‚ Try disabling all plugins and switching theme temporarily – does the snippet work then?

  3. Hi Rodolfo
    excellent snippet
    one question , would this work for specific category of products ?

    thanks in advance

  4. Dear Rodolfo Melogli,

    Many thanks for this contribution! It works when I apply this rule to the following fields:

    billing_address_1
    billing_postcode
    billing_city

    Unfortunately it doesn’t work when I want to apply it to any other fields. Somehow those fields don’t get validated automatically. In face I want to apply it to a new field which is the tax number of the customer. Once the customer has entered a tax number the additional tax should be removed.

    Can you help me? Many thanks in advance!

    Best,

    Matthieu

    1. Matthieu, thanks so much for your comment! Unfortunately this is custom troubleshooting work and I cannot help here via the blog comments. Thanks a lot for your understanding! ~R

  5. Hi ROdolfo, is there a way to Remove Tax if customer selects payment method cash?
    Thanks,
    Sandra

    1. Sandra, thanks for your comment! Yes, there is of course, you will need a little edit to the PHP of this snippet. Unfortunately this is custom work and I cannot provide a complementary solution here via the blog comments. Thanks a lot for your understanding! ~R

  6. Hello dear Rodolfo,

    you are great! Can you please give example how to use this function with Tax/VAT number field? I have setup field for UIC, but i have to remove VAT for order outside the country when VAT number is entered…

    Thank you for this awesome piece of code! ๐Ÿ™‚

    1. Hey Vladimir, thanks for your comment! You’ll need to change the line:

      if ( $billing_postcode == ___ )
      

      … with the name of the variable generated by your new Tax field, which is custom to your code and I can’t help with in here I’m afraid! ๐Ÿ™‚

  7. How about hide Sale Tax if Sale Tax is zero?

    1. Hey Vuster, thanks for your comment! I’m not sure I fully understand – could you send over a screenshot?

    2. I agree. In some stores, there is no tax at all… yet WooCommerce still shows Tax: $0.00 in cart and checkout. I’d like to hide the Tax row if there is a $0 tax value for the cart/order.

Questions? Feedback? Support? Leave your Comment Now!
If you're writing code, please wrap it between: [php] code_here [/php]

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.