WooCommerce运费价格含税

6
在WooCommerce中,我只能输入不含税的运费价格。如何使给定的价格包括税费?
仅将“包括税费的价格”设置应用于产品。
例如,如果我在设置中输入 €1,00 的运费,则结账时显示 €1,21(0,21 = 税费)。
应该是 €1,00(包括 0,21 的税费) (这里不关心计算,这只是一个例子)
如果有人有解决方案或功能,请回复感谢。

遇到了同样的问题,我只输入了不含税的运费。 - r4ccoon
只需要取消Aibrean在此处给出的答案中显示的运输选项:https://stackoverflow.com/a/31345391/1788684 - Binod Kalathil
我认为这是WooCommerce中的一个错误。但是,如果他们修复它,修复程序需要放在一个复选框后面以启用修复程序,否则它会破坏现有的网站。 - Jake
3个回答

6

一年前,我遇到了同样的问题,但是没有太多可用的帮助。

经过调查,这个问题出现在“class-wc-tax.php”中的运费税费计算上,正如您下面可以看到的那样,运费硬编码为不包含税费。

     /**
     * Calculate the shipping tax using a passed array of rates.
     *
     * @param   float       Price
     * @param   array       Taxation Rate
     * @return  array
     */
    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-我没有使用任何他们的前端代码,这意味着我可能没有发现其他受到税前运费假设影响的地方。

1
你好!感谢您的帖子。 我有这个问题,并尝试了您的解决方案。 然而,我无法使它工作。 “woocommerce_calc_shipping_tax”过滤器通常不被应用,因为“calc_shipping_tax”经常未被调用-我不知道为什么和何时。当我刷新购物车或结账页面时,调试器中断点甚至没有被触发。 “woocommerce_calc_shipping_tax”的结果总是被某些进一步的过滤器修改,无论我分配多高的优先级。此外,看起来它的结果,减去运费税的运输费用,已经增加了税,根据这个减少的值计算。 - Liphtier
1
同样的问题。这段代码对我不起作用 :( 我遇到了设置最大运费的问题,由于运费税金舍入的原因,它会搞乱最大费率的计算,导致总运费超过最大金额。我也无法弄清楚如何使其正常工作。出于税务目的,必须计算运费税(因此取消“运费税”不是选项)。 - Rose Thorn
对我没有起作用。 - ASIF

1
一种可能的替代方案是手动调整运输价格,使其变为不含增值税。例如,如果包括20%税费的运费为6欧元,则将其调整为5欧元。请注意,这仅适用于所有运输目的地的税率相同的情况。

这不是一个正确的答案。由于 WooCommerce 的舍入,这不允许您获得特定价格。 - archvist
我认为在绝大多数情况下,这是最明智的答案,到目前为止我还没有遇到任何舍入问题。 - Adam Moss

0
正如其他人所提到的,WooCommerce开发人员已经将运费税的计算硬编码为不包含税款。要更改此设置,首先通过使用woocommerce_calc_shipping_tax来调整运费税额:
function calculateShippingInclusiveOfTax($taxes, $shippingPrice, $taxRates)
{
    // If site-wide configuration is inclusive of taxes calculate taxes as such
    if (wc_prices_include_tax()) {
        return  WC_Tax::calc_inclusive_tax($shippingPrice, $taxRates);
    }

    // Reaching this point means side-wide configuration is exclusive of tax, therefore return shipping taxes
    // as such
    return $taxes;
}

add_filter('woocommerce_calc_shipping_tax', 'calculateShippingInclusiveOfTax', 10, 3);

完成此操作后,运费税将在购物车中正确显示。然而,WooCommerce内部使用“不含税的运费成本+计算得出的税费(根据包括价格或独立价格)”来计算出运费税总额,并且到目前为止,我们还没有在任何地方更改“不含税的运费成本”的值。因此,我们的总额仍然是错误的。因此,我们必须要么更改“不含税的运费成本”值,要么在总和之后从购物车总额中删除总运费税。如你所见,后者更简单,因此我们可以使用“woocomerce_calculated_total”钩子来实现这一点:
function fixCartTotalAmountCalculationDueToMakingShippingInclusiveOfTax($total, $cart)
{
    if (wc_prices_include_tax()) {
        $total -= $cart->shipping_tax_total;
    }

    return $total;
}

add_filter('woocommerce_calculated_total', 'fixCartTotalAmountCalculationDueToMakingShippingInclusiveOfTax', 10, 2);

请参考wp-content/plugins/woocommerce/includes/class-wc-cart-totals.php中的第865行以获取更多信息。

奖励:为什么Brenton Thomas的答案不起作用的洞察:

首先,woocommerce_calculate_totals钩子是一个动作而不是一个过滤器。修改值不是动作的预期用法,应该使用过滤器。
抛开这个问题,错误在于购物车总计已经在执行该动作时根据总和不含税运费 + 计算的税金进行了计算,因此正确的操作应该是$cart->total - $cart->shipping_tax_total

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接