2017-06-20 130 views
2

我使用WooCommerce版本3.0+以及由用户角色插件价格%折扣价格。WooCommerce四舍五入之前计算总计

我们在商店里有一个项目是£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; 
} 

}

从回声$ 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

首先,你需要使用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_obj) { 

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

    foreach ($cart_obj->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)); 
+0

感谢您的代码。看来set_price仍然不起作用,即使我添加了测试值。所以这不是一个四舍五入的问题 - 任何地方的购物车总额都不会显示额外的价值,例如0.2甚至100。但get_price正在工作,因为当我回应时,它确实显示了正确的舍入值。 – rav

+0

@rav我已经在2个不同的服务器上测试过这个代码,它工作的很好。如果您在挂钩函数中使用'$ cart_item ['data'] - > set-price(25);'您将看到所有购物车商品都以25的价格更新。因此,这种方法在'woocommerce_before_calculate_totals钩子。 – LoicTheAztec

+0

好吧,如上所述使用set_price进行测试 - 它按照您的说法工作。我身边的问题是由于使用用户角色插件的Woocommerce价格。当我停用它时,价格显示为25.切换它将覆盖我的代码。有没有办法可以覆盖这个?否则,我会做一些研究,寻找替代插件。 – rav