Apply different tax based on user role and product category (Woocommerce)

I need apply a different tax if the user have a specific role, but only in certains product’s categories.

Example: if customer A with role “Vip” buy an item of category “Bravo” or “Charlie” the tax applied will be at 4% instead 22%

Read More

This is the code in part wrote by me another part taken on google, but I don’t understand where I wrong.

Please someone can help me?

function wc_diff_rate_for_user( $tax_class, $product ) {
  global $woocommerce;

    $lundi_in_cart = false;

    foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
        $_product = $values['data'];
        $terms = get_the_terms( $_product->id, 'product_cat' );

            foreach ($terms as $term) {
                $_categoryid = $term->term_id;
            }
                if (( $_categoryid === 81 ) || ( $_categoryid === 82 ) )) {

                    if ( is_user_logged_in() && current_user_can( 'VIP' ) ) {
                        $tax_class = 'Reduced Rate';
                    }
                }   
    }

  return $tax_class;
}

Related posts

1 comment

  1. Taxes are calculated per lines of items in the cart.. you don’t have to loop the cart items. Instead, check if the current item has the category you are looking for.

    try it like this…

    add_filter( 'woocommerce_product_tax_class', 'wc_diff_rate_for_user', 1, 2 );
    function wc_diff_rate_for_user( $tax_class, $product ) {
    
        // not logged in users are not VIP, let's move on...
        if (!is_user_logged_in()) {return $tax_class;}
    
        // this user is not VIP, let's move on...
        if (!current_user_can( 'VIP' ) ) {return $tax_class;}
    
        // it's already Reduced Rate, let's move on..
        if ($tax_class == 'Reduced Rate') {return $tax_class;}
    
        // let's get all the product category for this product...
        $terms = get_the_terms( $product->id, 'product_cat' );
        foreach ( $terms as $term ) { // checking each category 
            // if it's one of the category we'er looking for
            if(in_array($term->term_id, array(81,82))) {
                $tax_class = 'Reduced Rate';
                // found it... no need to check other $term
                break;
            }
        }
    
        return $tax_class;
    }
    

Comments are closed.