一年前,我遇到了同样的问题,但是没有太多可用的帮助。
经过调查,这个问题出现在“class-wc-tax.php”中的运费税费计算上,正如您下面可以看到的那样,运费硬编码为不包含税费。
public static function calc_shipping_tax( $price, $rates ) {
$taxes = self::calc_exclusive_tax( $price, $rates );
return apply_filters( 'woocommerce_calc_shipping_tax', $taxes, $price, $rates );
}
原来,由于某些原因,Woo将运费默认为不含税费用,并在下游税费计算中进行了推算,因此您需要在functions.php文件中添加一些过滤器以解决问题。
1)第一个是计算含税费的过滤器。
function yourname_fix_shipping_tax( $taxes, $price, $rates) {
if(wc_prices_include_tax()){
return WC_Tax::calc_inclusive_tax( $price, $rates );
}
return $taxes;
}
add_filter( 'woocommerce_calc_shipping_tax', 'yourname_fix_shipping_tax',10,3);
请注意不要忘记在add_filter的末尾加上10,3。其中10是优先级,我已将其保留为默认值。3是参数数量,您真的需要这个 - 如果您省略它,过滤器会显示行为问题。
2)第二个过滤器用于修复下游计算中的总数。
function yourname_fix_totals( $cart) {
if(wc_prices_include_tax()){
$cart->shipping_total -= $cart->shipping_tax_total;
}
}
add_filter( 'woocommerce_calculate_totals', 'yourname_fix_totals');
对于那些担心我们讨论的是真实货币和真实税收的详细说明
第一个过滤器相当简单 - 它只是重新计算包含税的情况下的税费。
第二个过滤器是处理Woo将独占税的假设进一步推入其税费计算中的方式。
在'class-wc-cart.php'的第1396行左右,我们有以下内容。
// Grand Total - Discounted product prices, discounted tax, shipping cost + tax
$this->total = max( 0, apply_filters( 'woocommerce_calculated_total', round( $this->cart_contents_total + $this->tax_total + $this->shipping_tax_total + $this->shipping_total + $this->fee_total, $this->dp ), $this ) );
这里要做的是将运费税加到运费总额中,而我们不想这样做 - 而且他们已经硬编码了它......
我们将使用方便位置处的'woocommerce_calculate_totals' filter(),它在大约1392行左右附近,以便在使用上面的第二个过滤器将所有内容添加之前从总数中减去运费税。
// Allow plugins to hook and alter totals before final total is calculated
do_action( 'woocommerce_calculate_totals', $this );
在此之前的几周,我担心这会是一个麻烦的问题,现在我已经可以测试一些东西了,情况果然如此。
因此,请注意:务必彻底测试最终税金总额和小计——这不再是可能存在的风险。Woo做出了税前运费的假设,并将其推给了下游计算。不幸的是,即使您的代码有漏洞,您也必须向各自的政府缴纳税款。
还要记住,在测试时,当您从WooCommerce设置中更改为含税价格时,旧价格不会受到影响,因此您可能需要使用干净的测试数据。
到目前为止,对我来说看起来还不错,但在我的情况下,我绕过了大量的Woo-我没有使用任何他们的前端代码,这意味着我可能没有发现其他受到税前运费假设影响的地方。