我正在使用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
但那里的答案也不起作用。
任何帮助都非常感激。
答案 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 ) );