提高 WooCommerce 税收计算精度并将显示的价格保留两位小数

Increase WooCommerce tax calculations precision and keep displayed prices with two decimals

在 Woocommerce 设置中,我设置了 6 位小数,以便更准确地计算税收。但是,我需要在前端、电子邮件等中仅显示 2 位小数的所有价格和金额。我找到了两个函数

add_filter('wc_price_args', 'custom_decimals_price_args', 10, 1);
function custom_decimals_price_args($args) {
$args['decimals'] = 2;
return $args;
}

add_filter( 'wc_get_price_decimals', 'change_prices_decimals', 20, 1 );
function change_prices_decimals( $decimals ){
$decimals = 2;
return $decimals;
}

这些有什么区别,我应该使用哪一个?

wc_price_args 用于向价格添加额外的参数 - 它接受原始价格,并且可以向其中添加其他内容,例如货币符号。当调用 get_price 时,它将在前端包含此货币符号。 https://wp-kama.com/plugin/woocommerce/hook/wc_price_args

wc_get_price_decimals 它在 'point' 之后设置小数位数 - 例如。如果你将它设置为 5,价格将看起来像 0.00000 https://wp-kama.com/plugin/woocommerce/function/wc_get_price_decimals

我没有对此进行测试,但它应该可以完成工作。

add_filter('wc_price_args', 'custom_decimals_price_args', 10, 1);
function custom_decimals_price_args($price, $args) {
  
  return number_format((float)$price, 2, '.', '');

}

或者,您可以编辑产品所在的模板,并使用上面的 number_format 格式化 get_price

如果这对你有用,请告诉我。

注意 WC_ROUNDING_PRECISION 常量在 WC_Woocommerce define_constants() method.

中设置为 6

这意味着 WooCommerce Tax 计算精度已经设置为 6 位小数。

税收计算精度基于wc_get_rounding_precision() core function used in WC_Tax Class:

function wc_get_rounding_precision() {
    $precision = wc_get_price_decimals() + 2;
    if ( absint( WC_ROUNDING_PRECISION ) > $precision ) {
        $precision = absint( WC_ROUNDING_PRECISION );
    }
    return $precision;
}

如您所见,如果显示的价格小数+2小于WC_ROUNDING_PRECISION常量,则优先考虑WC_ROUNDING_PRECISION常量。但是,由于您希望显示 价格保留两位小数,因此需要其他内容。

So you should not increase displayed price decimals and not use wc_price_args or/and wc_get_price_decimals hooks, to increase precision in tax calculation.

如果6 位小数的精度不够 并且您想获得更高的精度:

如何更精确地计算税收?

获得更精确的税收计算并保持显示价格保留两位小数的最佳方法是编辑 WordPress wp_config.php 文件并添加以下行 (您可以在其中增加 WC_ROUNDING_PRECISION常数值随心所欲,这里的值设置为8例如):

// Change WooCommerce rounding precision
define('WC_ROUNDING_PRECISION', 8);

这将更改 WC_ROUNDING_PRECISION 常量而不影响显示的价格小数位。