我想要做的是添加免费产品,如果用户在购物车中有3个产品。
我为此选择了woocommerce_add_cart_item
个钩子。
这是我的代码:
add_filter('woocommerce_add_cart_item', 'set_item_as_free', 99, 1);
function set_item_as_free($cart_item) {
global $woocommerce;
$products_with_price = 0;
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
if($values['data']->price == 0) {
continue;
} else {
$products_with_price++;
}
}
if( $products_with_price > 1 && $products_with_price % 3 == 1) {
$cart_item['data']->set_price(0);
return $cart_item;
}
return $cart_item;
}
我也试过$cart_item['data']->price = 0;
,但它也没有用:(
是否有一些我做错了或者还有其他方法来完成这项工作?
感谢。
答案 0 :(得分:0)
尝试修改此代码:(已更改条件。)
add_filter('woocommerce_add_cart_item', 'set_item_as_free', 99, 1);
function set_item_as_free($cart_item) {
global $woocommerce;
$products_with_price = 0;
foreach ( $woocommerce->cart->get_cart() as $cart_item_key => $values ) {
if($values['data']->price == 0) {
continue;
} else {
$products_with_price++;
}
}
if( $products_with_price >= 3 && $products_with_price % 3 == 1) {
$cart_item['data']->set_price(0);
return $cart_item;
}
return $cart_item;
}
如果您不希望在用户购买现有购物车上方的其他3种商品后再次添加免费商品,请从上一个条件中删除“&& $products_with_price % 3 == 1
”。
答案 1 :(得分:0)
不要使用woocommerce_add_cart_item
挂钩来设置产品价格,很多插件都希望在挂钩woocommerce_before_calculate_totals
中重新获得数据库中产品的价格(WPML就是这种情况) / WCML)
因此,请使用此钩子
add_action( 'woocommerce_before_calculate_totals', function ( $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 ) {
if ( isset( $cart_item['free_item'] ) ) {
$cart_item['data']->set_price( 0 );
}
}
} );