我正在尝试使用以下功能在购物车中更改产品价格:
add_action( 'woocommerce_before_shipping_calculator', 'add_custom_price'
);
function add_custom_price( $cart_object ) {
foreach ( $cart_object->cart_contents as $key => $value ) {
$value['data']->price = 400;
}
}
它在WooCommerce版本2.6.x中正常工作,但在版本3.0+
中不再有效如何在WooCommerce版本3.0中使其工作?
感谢。
答案 0 :(得分:32)
更新 (2018年9月)
使用 WooCommerce版本3.0 + ,您需要:
woocommerce_before_calculate_totals
。get_cart()
方法set_price()
方法以下是代码:
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 20, 1);
function add_custom_price( $cart_obj ) {
// This is necessary for WC 3.0+
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
// Avoiding hook repetition (when using price calculations for example)
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
return;
// Loop through cart items
foreach ( $cart_obj->get_cart() as $cart_item ) {
$cart_item['data']->set_price( 40 );
}
}
代码进入活动子主题(或主题)的function.php文件或任何插件文件中。
此代码经过测试并有效。
注意:您可以将优先级提高从
20
改为1000
(甚至2000
)使用一些特定的时候插件或其他自定义。
相关:
答案 1 :(得分:1)
使用WooCommerce版本3.2.6,@ LoicTheAztec的答案适用于我,如果我将优先级提高到1000.
add_action( 'woocommerce_before_calculate_totals', 'add_custom_price', 1000, 1);
我尝试了10
,99
和999
的优先级值,但我的购物车中的价格和总数没有变化(即使我能够通过get_price()
确认set_price()
实际设定了商品的价格。
我有一个自定义挂钩,可以为我的购物车增加费用,而且我使用的第三方插件添加了产品属性。我怀疑这些WooCommerce"附加组件"引入延迟,要求我延迟我的自定义操作。