php 在“woocommerce_package_rates”挂钩中自定义税额

7rtdyuoh  于 2023-01-12  发布在  PHP
关注(0)|答案(3)|浏览(113)

我最近试图修改我所有的航运率与钩适用折扣。
下面是我的代码:

add_filter( 'woocommerce_package_rates', 'woocommerce_package_rates' );
function woocommerce_package_rates( $rates ) {
    $user_id = get_current_user_id();
    if ( ! wc_memberships_is_user_active_member( $user_id, 'silver' ) ) { return $rates; }
    $discount_amount = 30; // 30%

    foreach($rates as $key => $rate ) {
        $rates[$key]->cost = $rates[$key]->cost - ( $rates[$key]->cost * ( $discount_amount/100 ) );
    }

    return $rates;
}

但还有一步就是税了!我弄错了税。
例如,我有我的运费谁成本3$。与折扣,它现在的2,10$
我买一个项目的2$和航运2.10$。我得到了1美元的税(作为3美元的运费。看起来他不采取的变化),通常它的0.82$
我需要什么才能得到正确的税款计算?

hfyxw5xn

hfyxw5xn1#

    • 更新:**与装运方法的税收成本计算相关

有一些小错误,你的代码,你已经错过了税务计算折扣。我已经重温了你的代码位,你应该试试这个:

add_filter( 'woocommerce_package_rates', 'conditional_shipping_discount', 10, 2 );
function conditional_shipping_discount( $rates, $packages ) {

    $user_id = get_current_user_id();
    if ( ! wc_memberships_is_user_active_member( $user_id, 'silver' ) ) return $rates;

    $percent = 30; // 30%
    $discount = 1 - ($percent / 100);

    foreach($rates as $rate_key => $rate_values ) {
        // Get original cost
        $original_cost = $rates[$rate_id]->cost;
        // Calculate the discounted rate cost
        $new_cost = $original_cost * $discount;
        // Set the discounted rate cost
        $rates[$rate_key]->cost = number_format(new_cost, 2);
        // calculate the conversion rate (for taxes)
        $conversion_rate = $new_cost / $original_cost;

        // Taxes rate cost (if enabled)
        $taxes = array();
        foreach ($rate->taxes as $key => $tax){
            if( $tax > 0 ){ // set the new tax cost
                // set the new line tax cost in the taxes array
                $taxes[$key] = number_format( $tax * $conversion_rate, 2 );
            }
        }
        // Set the new taxes costs
        $rates[$rate_key]->taxes = $taxes
    }
    return $rates;
}
  • 代码在您的活动子主题(或主题)的function.php文件或任何插件文件中。*

此代码经过测试并正常工作。

    • 您应该需要刷新发货缓存:**

1.首先,这段代码已经保存在function.php文件中。
1.在"发运设置"中,输入发运区域,禁用发运方法并"保存"。然后重新启用该发运方法并"保存"。操作完成。

f87krz0w

f87krz0w2#

下面的代码@LoicTheAztec没有错误:

add_filter( 'woocommerce_package_rates', 'conditional_shipping_discount', 10, 2 );
    function conditional_shipping_discount( $rates, $packages ) {

    $user_id = get_current_user_id();
    if ( ! wc_memberships_is_user_active_member( $user_id, 'silver' ) ) return $rates;

    $percent = 30; // 30%
    $discount = 1 - ($percent / 100);

    foreach($rates as $rate_key => $rate_values ) {
        // Get original cost
        $original_cost = $rates[$rate_key]->cost;
        // Calculate the discounted rate cost
        $new_cost = $original_cost * $discount;
        // Set the discounted rate cost
        $rates[$rate_key]->cost = number_format($new_cost, 2);
        // calculate the conversion rate (for taxes)
        $conversion_rate = $new_cost / $original_cost;

        // Taxes rate cost (if enabled)
        $taxes = array();
        foreach ($rates[$rate_key]->taxes as $key => $tax){
            if( $tax > 0 ){ // set the new tax cost
                // set the new line tax cost in the taxes array
                $taxes[$key] = number_format( $tax * $conversion_rate, 2 );
            }
        }
        // Set the new taxes costs
        $rates[$rate_key]->taxes = $taxes;
    }
    return $rates;
}
lmvvr0a8

lmvvr0a83#

以上答案的问题在于你是根据已经计算过的原始成本来计算税金的。例如,如果一个插件是根据运费来计算税金的呢?例如,如果100美元或以上,则为10%;如果200美元或以上,则为20%;如果低于100美元,则为0%。
如果原始成本为$150,您应用$60的折扣,则折扣后的成本将为$90,并且在上述情况下不会应用任何税。因此,我们需要一种方法来修改成本**,然后才能计算税**。这样,我们就不必自己重新计算税,并且可以减少第一段中示例的错误。
在我的一个插件中,我使用了woocommerce_shipping_method_add_rate_args过滤器,它由\WC_Shipping_Method::add_rate()调用,每次\WC_Shipping_Method示例添加费率时都会调用此方法。
这个过滤器将接受一个数组作为它的第一个参数,这是汇率数据。这个数组有一个'cost'条目,这是我们想要修改的。记住,这可以是一个标量(显然,一个数字字符串)或数组。在处理这个时,只要检查它是否是一个数组:

add_filter('woocommerce_shipping_method_add_rate_args', function(array $rateArguments) : array {
     // Total up the cost. Taken from the WooCommerce source code. woocommerce/includes/abstracts/abstract-wc-shipping-method.php
     $totalCost = is_array( $rateArguments['cost'] ) ? array_sum( $rateArguments['cost'] ) : $rateArguments['cost'];

     $rateArguments['cost'] = 'here the final cost';
            
     return $rateArguments; 
});

相关问题