2017-06-20 161 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