在Woocommerce结帐时有条件地禁用特定产品类别的增值税

时间:2018-09-06 16:49:14

标签: php jquery ajax woocommerce checkout

在woocommerce中,我正在使用Timologia for WooCommerce插件,该插件检查用户是否需要发票或普通收据(在希腊是必需的)。因此,此插件在结帐页面中添加一个选择字段,并以“否” (默认)或“是”作为选项。

如果客户选择“是”,则“零增值税”适用于特定类别的产品,并且在结帐页面上一切正常。

但是,当客户下订单时,在收到的订单页面和后端(订单编辑页面)上,特定商品的价格就不再需要增值税。

这是我的代码:

add_action( 'woocommerce_checkout_update_order_review', 'tfwc_taxexempt_checkout_based_invoice_choice' ); 

function tfwc_taxexempt_checkout_based_invoice_choice( $post_data ) {
    global $woocommerce;
    $woocommerce->customer->set_is_vat_exempt( false );
    parse_str($post_data);
    if ( $billing_timologio == 'Y' ) 

    add_filter( 'woocommerce_product_get_tax_class', 'wc_diff_rate_for_user', 1, 2 );

    function wc_diff_rate_for_user( $tax_class, $product ) {

    // 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(228,231,222))) {
        $tax_class = 'Zero Rate';
        // found it... no need to check other $term
        break;
    }
}

    return $tax_class;
  }
}

此代码在WC 2.X版本上工作正常,在3+版本中停止工作

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

更新3

该插件和您的代码已过时,存在一些错误和错误。在下面的代码中,我对ajax和WC_Session使用了另一种方法。

  

输入的含税产品的“税率”行为。

     

要使操纵税率的任何代码有效,需要输入不含税的产品价格。如果没有,则需要附加代码来获取不含税的产品价格作为自定义购物车商品数据,使“零税率”税有效。

我添加了一个从插件代码中部分复制的自定义函数,该函数添加了一个检出选择字段billing_timologio,以使该代码可测试。

当我们将不含税的产品价格添加为自定义购物车项目数据时,添加到购物车ajax按钮也将替换为链接到已定义产品类别的单个产品页面的按钮。

代码(仅适用于Woocommerce 3.3+版本):

// Your product categories settings
function get_my_terms(){
    return array( 'clothing' );
    return array( 222, 228, 231 );
}

// Change add to cart ajax button to a button linked to single product pages for specific product categories
add_filter( 'woocommerce_loop_add_to_cart_link', 'conditionally_replace_add_to_cart', 10, 2 );
function conditionally_replace_add_to_cart( $html, $product ) {
    if ( has_term( get_my_terms(), 'product_cat', $product_id )  && $product->is_type('simple') ) {
        // Set HERE your button link
        $link = get_permalink($product_id);
        $text = __("Read More", "woocommerce");
        $html = '<a href="' . $link . '" class="button alt add_to_cart_button">' . $text . '</a>';
    }
    return $html;
}

// Adding a custom checkout select field
add_filter( 'woocommerce_billing_fields', 'custom_billing_fields', 20, 1 );
function custom_billing_fields($billing_fields) {

    $billing_fields['billing_timologio'] = array(
        'type'        => 'select',
        'label'       => __('INVOICE'),
        'placeholder' => _x('INVOICE', 'placeholder'),
        'required'    => false,
        'class'       => array('form-row-wide'),
        'clear'       => true,
        'options'     => array(
            'N' => __('No'),
            'Y' => __('Yes'),
        ),
        'value' => '',
    );
    return $billing_fields;
}

// The jQuery Ajax script
add_action( 'wp_footer', 'custom_checkout_script' );
function custom_checkout_script() {
    // Only checkout page
    if( is_checkout() && ! is_wc_endpoint_url() ):

    // Removing WC_Session "
    if( WC()->session->__isset('billing_timologio') ){
        WC()->session->__unset('billing_timologio');
    }
    ?>
    <script type="text/javascript">
    jQuery( function($){
        if (typeof wc_checkout_params === 'undefined')
            return false;

        // On load reset value to 'N'
        $('#billing_timologio_field select').val('N');

        // On change (Ajax)
        $('#billing_timologio_field select').change( function () {
            $.ajax({
                type: 'POST',
                url: wc_checkout_params.ajax_url,
                data: {
                    'action': 'get_ajax_billing_timologio',
                    'b_timologio': $(this).val() == 'Y' ? 1 : 0,
                },
                success: function (result) {
                    $('body').trigger('update_checkout');
                }
            });
        });
    });
    </script>
    <?php
    endif;
}

// The Wordpress Ajax receiver
add_action( 'wp_ajax_get_ajax_billing_timologio', 'get_ajax_billing_timologio' );
add_action( 'wp_ajax_nopriv_get_ajax_billing_timologio', 'get_ajax_billing_timologio' );
function get_ajax_billing_timologio() {
    if ( $_POST['b_timologio'] == '1' ){
        WC()->session->set('billing_timologio', '1');
    } else {
        WC()->session->set('billing_timologio', '0');
    }
    die();
}

// Save the product price excluding tax as custom cart item data
add_filter('woocommerce_add_cart_item_data', 'add_price_excl_vat_as_custom_cart_item_data', 20, 3);
function add_price_excl_vat_as_custom_cart_item_data( $cart_item_data, $product_id, $variation_id ) {
    if ( ! wc_prices_include_tax() )
        return $cart_item_data;

    $_product_id = $variation_id > 0 ? $variation_id : $product_id;
    $product = wc_get_product($_product_id); // The WC_Product Object

    // Save the price excluding tax as custom cart item data
    if( has_term( get_my_terms(), 'product_cat', $product_id ) ) {
        $cart_item_data['price_excl_tax'] = wc_get_price_excluding_tax( $product, array( 'price' => $product->get_price() ) );
    }

    return $cart_item_data;
}

// Changing conditionally specific items tax rate
add_action( 'woocommerce_before_calculate_totals', 'zero_tax_items_based_on_invoice_choice', 30, 1 );
function zero_tax_items_based_on_invoice_choice( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item ) {
        // Check for product categories and enabled "billing_timologio" field
        if( has_term( get_my_terms(), 'product_cat', $cart_item['product_id'] ) && WC()->session->get('billing_timologio') ){
            // Set the item tax rate to "Zero rate"
            $cart_item['data']->set_tax_class('Zero Rate');

            // Set price excluding taxes
            if( isset($cart_item['price_excl_tax']) ){
                $cart_item['data']->set_price($cart_item['price_excl_tax']);
            }
        }
    }
}

代码进入您的活动子主题(或活动主题)的function.php文件中。经过测试,可以正常工作。

  

在收到订单,订单视图和(管理员)订单编辑页面上,当客户为“账单”选择“是”时,特定商品的税费将设置为“零费率” (ΤΙΜΟΛΟΓΙΟ)。

     

定义的产品类别中剩余的相关产品价格这次将具有不含税的正确价格


原始答案。

我似乎有2个错误:

  • 第一个是$product->id,将替换为$product->get_id()
  • 第二,您需要将内部函数放在外部

还可以简化代码。

没有任何保证,因为您的代码无法真正测试,请尝试以下方法:

add_action( 'woocommerce_checkout_update_order_review', 'tfwc_taxexempt_checkout_based_invoice_choice' ); 
function tfwc_taxexempt_checkout_based_invoice_choice( $post_data ) {
    WC()->customer->set_is_vat_exempt( false );

    parse_str($post_data);

    if ( $billing_timologio == 'Y' ) 
        add_filter( 'woocommerce_product_get_tax_class', 'wc_diff_rate_for_user', 1, 2 );
    }
}

function wc_diff_rate_for_user( $tax_class, $product ) {
    // Checking for specific product categories
    if( has_term( array(228,231,222), 'product_cat', $product->get_id() ) ) {
        return 'Zero Rate';
    }
    return $tax_class;
}

我希望它能起作用。