我要达到的目标是,如果用户在购物车中添加了特殊产品,其价格应更改为零
这是我用来更新购物车价格的简单代码段,但
add_action('woocommerce_before_calculate_totals','set_bonus_product_pice');
function set_bonus_product_pice($cart_object){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
$free_product_ID = 10;
foreach ( $cart_object->cart_contents as $key=>$cart_item) {
if($cart_item['product_id'] == $free_product_ID){
$cart_item['data']->set_price(0);
break;
}
}
}
Woocommerce版本为4.3
在上面的代码中,如果条件和价格被正确调用,并且调用价格在产品对象的更改键下设置新价格,则进入内部,进一步调试它可以正常工作,直到在class-wc-cart.php中调用wc_get_price_exception_tax方法为止文件,以及wc_get_price_clusion_tax方法如何从产品对象中删除更改。
我也尝试了各种变化,例如,而不是使用 直接使用$ cart_object我使用$ woocommerce-> get_cart()。 相同的解决方案以前对我有用,但不确定是否是由于最新版本的woocommerce的更改
答案 0 :(得分:0)
更改$ cart_item ['data']-> set_price(0);改为$ value ['data']-> price = $ custom_price;
检查以下代码。
add_action( 'woocommerce_before_calculate_totals', 'set_bonus_product_pice', 20, 1 );
function set_bonus_product_pice( $cart_object ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
$custom_price = 10; // This will be your custome price
$free_product_ID = 10;
foreach ( $cart_object->get_cart() as $item ) {
if ( $item['product_id'] == $free_product_ID ) {
$item['data']->set_price( $custom_price );
}
}
}