以编程方式向 WooCommerce 购物车添加免税费用 [英] Add tax free fees to WooCommerce cart programmatically

查看:22
本文介绍了以编程方式向 WooCommerce 购物车添加免税费用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我尝试根据我在 Woocommerce 购物车上所做的一些计算来增加费用,但我想将其从增值税中排除.这是我的代码:

function woo_add_cart_fee( $cart ) {全球 $woocommerce;$bookable_total = 0;foreach(WC()->cart->get_cart() as $cart_item_key => $values) {$_product = $values['data'];//做我的事情来计算 $fee 变量WC()->cart->add_fee('费用:', $fee, false, '');//WC()->cart->add_fee('费用:', $fee, true, '' );//WC()->cart->add_fee('费用:', $fee, false, '零利率' );//WC()->cart->add_fee('费用:', $fee, true, '零利率' );}add_action('woocommerce_cart_calculate_fees', 'woo_add_cart_fee');

我已经尝试了所有评论版本,每个版本都包含增值税.

知道如何实现它吗?

解决方案

(更新):TAX OPTIONS with

<块引用>

类 WC_Cart add_fee() 方法,向购物车添加额外费用.

add_fee( string $name, float $amount, boolean $taxable = false, string $tax_class = '' )

参数:$name 费用的唯一名称.不能叠加多个同名费用.$amount 费用金额.$taxable(默认值:false)费用是否应纳税?$tax_class (default: '') 费用的税类(如果应税的话).空白字符串是标准税种.

<小时>

原始答案 (更新代码):

<块引用>

您的主要问题在于这一行:global $woocommerce, $bookable_total = 0;

  1. 因为您使用的是 WC()->cart 语法而不是 $woocommerce->cart> 语法,你真的不需要 global $woocommerce;.
  2. 如果您使用 global $bookable_total = 0; 这个 $bookable_total总是 = 0.
    相反,您将使用 global $bookable_total; 没有值 来获取在您的函数之外定义的值.
    但是,如果您想将值设置为零,以防未在您的函数之外定义,您可以这样做:woo_add_cart_fee( $bookable_total=0 )

我们现在可以在函数外定义$bookable_total变量值.

这是您的代码的工作示例:

//这个变量值传递给我们的函数$bookable_total = 1;函数woo_add_cart_fee($bookable_total = 0){全球 $bookable_total;if ( is_admin() && !defined( 'DOING_AJAX' ) )返回;//仅针对此示例$item_count = 0;$item_fee = 5;//遍历每个购物车项目foreach(WC()->cart->get_cart() 作为 $values ) {$item = $values['data'];如果(空($item))休息;//获取购物车 item_id$item_id = $item->id;$item_count++;//你的计算}//我们测试 $bookable_total 值,在我们的函数外定义为1"//如果未在外部定义,则为 'O'(在这种情况下,费用将为 '0')$fee = $item_count * $bookable_total * $item_fee;//add_fee 方法(此处不应用 TAX)WC()->cart->add_fee('费用:', $fee, false );}add_action('woocommerce_cart_calculate_fees','woo_add_cart_fee');

此代码已经过测试并且可以正常工作. 它位于活动子主题或主题的 function.php 文件中.

如果 $bookable_total 变量未在外部定义,则该值将为 0.

<块引用>

注意:最好通过以下方式获取 $items id:$item = $values['data'];$item_id = $item->id;

<小时>

参考:
类 WC_Cart - add_fee( $name, $amount, $taxable = false, $tax_class = '' ) 方法

I try to add fees based on some calculations I do on Woocommerce cart, but I want to exclude it from VAT. This is my code:

function woo_add_cart_fee( $cart ) {
    global $woocommerce; $bookable_total = 0; 

    foreach(WC()->cart->get_cart() as $cart_item_key => $values) { 
        $_product = $values['data'];

        //doing my stuff to calculate $fee variable

    WC()->cart->add_fee( 'Fees: ', $fee, false, '' );
    //WC()->cart->add_fee( 'Fees: ', $fee, true, '' );
    //WC()->cart->add_fee( 'Fees: ', $fee, false, 'zero rate' );
    //WC()->cart->add_fee( 'Fees: ', $fee, true, 'zero rate' );
}

add_action( 'woocommerce_cart_calculate_fees', 'woo_add_cart_fee' );

I have tried all the commented versions and each of them includes a VAT on Fees too.

Any idea how I can achieve it?

解决方案

(Update): TAX OPTIONS with add_fee() method

IMPORTANT: The fact that TAX is working or not with add_fee() method depends first of your tax settings in woocommerce. As you have not tell in your question what are your TAX settings, It's not possible to help you (Tax settings can be much more different for each e-commerce web site).

For example if you want to use 'zero rate' tax class, but you haven't defined the correct 'zero rate' tax class for the customer country, this will not work if you try to use it with:
WC()->cart->add_fee( 'Fees: ', $fee, true, 'zero rate' );depending on your global tax settings.

Here is a screenshot of REAL checkout totals, for 3 items in cart (using the code below):

Class WC_Cart add_fee() method, adds additional fee to the cart.

add_fee( string $name, float $amount, boolean $taxable = false, string $tax_class = ''  )

Parameters:
    $name      Unique name for the fee. Multiple fees of the same name cannot be added.
    $amount    Fee amount.
    $taxable   (default: false) Is the fee taxable?
    $tax_class    (default: '') The tax class for the fee if taxable. A blank string is standard tax class.


Original answer (updated code):

Your main problem is in this line: global $woocommerce, $bookable_total = 0;

  1. As you are using WC()->cart syntax instead of $woocommerce->cart syntax, you don't really need global $woocommerce;.
  2. If you use global $bookable_total = 0; this $bookable_total will be always = 0.
    Instead you will use global $bookable_total; without a value to get the value defined outside your function.
    But if you want to set the value to zero, in case is not defined outside your function, you will do it this way: woo_add_cart_fee( $bookable_total=0 )

We can defined now $bookable_total variable value outside the function.

This is a working example with your code:

// This variable value is passed to our function
$bookable_total = 1;

function woo_add_cart_fee( $bookable_total = 0 ) {
    global $bookable_total;

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    // just for this example
    $item_count = 0;
    $item_fee = 5;

    // going through each cart items
    foreach( WC()->cart->get_cart() as $values ) {
        $item = $values['data'];
        if ( empty( $item ) )
            break;
        // getting the cart item_id
        $item_id = $item->id;
        $item_count++;
        // your calculations
    }

    // We test $bookable_total value, defined to '1' outside our function
    // and to 'O' if not defined outside (in this case the fee will be '0')
    $fee = $item_count * $bookable_total * $item_fee;

    // add_fee method (TAX will NOT be applied here)
    WC()->cart->add_fee( 'Fees: ', $fee, false );

}
add_action( 'woocommerce_cart_calculate_fees','woo_add_cart_fee' );

This code is tested and it works. It goes on function.php file of your active child theme or theme.

If the $bookable_total variable is not defined outside, the value will be 0.

Note: is better to get the $items ids with: $item = $values['data']; $item_id = $item->id;


Reference:
Class WC_Cart - add_fee( $name, $amount, $taxable = false, $tax_class = '' ) method

这篇关于以编程方式向 WooCommerce 购物车添加免税费用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆