WooCommerce在计算总计之前进行四舍五入

时间:2017-06-20 17:30:10

标签: php wordpress woocommerce cart product

我正在使用WooCommerce版本3.0+以及用户角色插件的价格,它可以对价格给出%折扣。

我们店里有一件物品是89.55英镑。如果享受30%的折扣,则价格为62.685英镑。如果您订购6,则价值为£376.11。

最后的数字是正确的。

然而,由于我将WC设置设为2dp,因此商品价格显示为62.69英镑。因此,发票不正确显示为£62.69 x 6 =£376.11。

我已经考虑过像这样使用woocommerce_before_calculate_totals:

Dynamic cart item pricing not working on orders in WooCommerce 3.0+

我的代码是:

add_action( 'woocommerce_before_calculate_totals', 'adding_custom_price', 10, 1);
function adding_custom_price( $cart_obj ) {

if ( is_admin() && ! defined( 'DOING_AJAX' ) )
    return;

 foreach ( WC()->cart->get_cart() as $cart_item_key => $cart_item ) {
     $new_price = round($cart_item['data']->price,2,PHP_ROUND_HALF_UP);
     $cart_item['data']->set_price($new_price);
     #echo $new_price;
 }

}

echo $ new_price的输出为62.69。但似乎set_price不起作用,因为购物车中的值仍然显示为62.685。

例如,如果我做62.69 x 2,则小计为125.37。

知道为什么set_price不起作用?我看到了这个:

Woocommerce: $cart_item['data']->set_price is not working inside custom plugin

但那里的答案也不起作用。

任何帮助都非常感激。

1 个答案:

答案 0 :(得分:2)

首先,您需要使用 WC_Product 方法get_price(),因为$cart_item['data'] WC_Simple_Product 的实例。

此外,您必须注意,购物车中显示的价格已经被WooCommerce特定的格式化功能所舍入。

所以你的WC 3.0+的功能代码将是:

add_action( 'woocommerce_before_calculate_totals', 'adding_custom_price', 10, 1);
function adding_custom_price( $cart ) {

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item ) {
        $product_price = $cart_item['data']->get_price(); // get the price
        $rounded_price = round( $product_price, 2, PHP_ROUND_HALF_UP );
        $cart_item['data']->set_price(floatval($rounded_price));
    }
}

代码放在活动子主题(或主题)的function.php文件中,或者放在任何插件文件中。

您可以通过向产品价格(购物车商品)添加一个非常小的浮点数来检查(测试)。您将看到购物车价格确实已更新,例如在功能中替换:

$cart_item['data']->set_price( floatval( $rounded_price ) );

通过

$cart_item['data']->set_price( floatval( $rounded_price + 0.2 ) );