Woocommerce:如果购物车有3件商品,请添加免费商品

时间:2014-06-10 06:46:11

标签: php wordpress woocommerce

我想要做的是添加免费产品,如果用户在购物车中有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;,但它也没有用:( 是否有一些我做错了或者还有其他方法来完成这项工作? 感谢。

2 个答案:

答案 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 );
        }
    }
} );