我正在 Wocommerce 购物车中插入一个控件,该控件根据用户的某些属性和插入的商品修改该特定商品的税率。
我在插件内使用的代码如下:
add_action('woocommerce_before_calculate_totals', 'switch_product_tax_class_in_cart', 10, 1);
/**
* @param $cart
*/
function switch_product_tax_class_in_cart($cart)
{
foreach ($cart->get_cart() as $cart_item) {
if (isUserAgevolabile() && get_field('product_agevolabile', $cart_item['product_id'])) {
$cart_item['data']->set_tax_class('iva-4');
}
}
}
不幸的是,这不起作用。
我还使用函数
set_price()
进行了测试,但这工作正常。
此外,我已经以这种方式更改了产品列表/产品页面中的税级,并且它有效:
add_filter('woocommerce_product_get_tax_class', 'switch_product_tax_class', 1, 2);
add_filter('woocommerce_product_variation_get_tax_class', 'switch_product_tax_class', 1, 2);
/**
* @param $tax_class
* @param $product
* @return mixed
*/
function switch_product_tax_class($tax_class, $product)
{
if (!is_cart() && isUserAgevolabile() && get_field('product_agevolabile')) {
return 'iva-4';
}
return $tax_class;
}
我通过这样编辑代码的第二部分解决了问题:
add_filter('woocommerce_product_get_tax_class', 'switch_product_tax_class', 1, 2);
add_filter('woocommerce_product_variation_get_tax_class', 'switch_product_tax_class', 1, 2);
/**
* @param $tax_class
* @param $product
* @return mixed
*/
function switch_product_tax_class($tax_class, $product)
{
if (!is_cart() && isUserAgevolabile() && get_field('product_agevolabile')) {
return 'iva-4';
}
if (is_cart() || is_checkout()) {
$product_id = $product->get_parent_id() ?: $product->get_id();
if (isUserAgevolabile() && get_field('product_agevolabile', $product_id)) {
return 'iva-4';
}
}
return $tax_class;
}
不再需要第一部分(附加到动作
woocommerce_before_calculate_totals
)。