在 "woocommerce_package_rates" 挂钩中自定义税额
Customize Tax amount in "woocommerce_package_rates" hook
我最近尝试用 hook 修改我所有的运费以应用折扣。
这是我的代码:
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$
.
我需要什么才能得到正确的税收计算?
更新:与运输方式的税收成本计算有关
您的代码有一些小错误,您错过了税收计算折扣。我已经重新审视了你的代码,你应该试试这个:
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 文件或任何插件文件。
此代码已经过测试并且有效。
You should need to refresh the shipping caches:
- 首先,此代码已保存在您的 function.php 文件中。
- 在运输设置中,输入运输区域并禁用运输方式并“保存”。然后重新启用 送货方式 并“保存”。 大功告成。
下面的代码@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;
}
上述答案的问题在于,您是根据已对原始成本进行的计算来计算税金的。例如,如果一个插件根据运费计算税费怎么办?例如,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;
});
我最近尝试用 hook 修改我所有的运费以应用折扣。
这是我的代码:
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$
.
我需要什么才能得到正确的税收计算?
更新:与运输方式的税收成本计算有关
您的代码有一些小错误,您错过了税收计算折扣。我已经重新审视了你的代码,你应该试试这个:
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 文件或任何插件文件。
此代码已经过测试并且有效。
You should need to refresh the shipping caches:
- 首先,此代码已保存在您的 function.php 文件中。
- 在运输设置中,输入运输区域并禁用运输方式并“保存”。然后重新启用 送货方式 并“保存”。 大功告成。
下面的代码@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;
}
上述答案的问题在于,您是根据已对原始成本进行的计算来计算税金的。例如,如果一个插件根据运费计算税费怎么办?例如,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;
});