在woocommerce中买一送一,无需使用优惠券代码

时间:2018-07-30 07:43:42

标签: php wordpress woocommerce

当用户购买x产品时,我想在我的网站上实现功能,然后用户将免费获得y产品。

在我的网站上,我有多种产品。如果客户购买1公斤装的X产品,那么客户想免费获得30毫升的Y产品。

我在我的function.php中添加了以下代码,但其工作问题是刷新页面时礼品产品的数量正在增加。 我更新的代码。

    add_action( 'woocommerce_before_cart', 'bbloomer_apply_matched_coupons' );

function bbloomer_apply_matched_coupons() {

    global $woocommerce;
 $cat_in_cart = false;
    foreach ( $woocommerce->cart->cart_contents as $key => $values ) {

    // this is your product ID
    $autocoupon = array( 123411 );

    if( in_array( $values['variation_id'], $autocoupon ) ) {  
       $cat_in_cart = true;
        break;

    }


    }
 if ( $cat_in_cart ) {   
$product_id   = 2044;
$quantity     = 1;
$variation_id = 2046;
$variation    = array(
    'pa_size'  => '30ml'
);

$woocommerce->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation );
 }

}

2 个答案:

答案 0 :(得分:2)

将其添加到“ functions.php”的开头。

<system.web>   
   <identity impersonate="true" userName="SomeDomainUserWithRigtsToread" password="itsPwd"/>

然后添加此代码。

ob_start();
session_start();

add_action( 'woocommerce_before_cart', 'bbloomer_apply_matched_coupons' ); function bbloomer_apply_matched_coupons() { if(!$_SESSION['GiftAdded']) { global $woocommerce; $cat_in_cart = false; $coupon_in_cart = false; $autocoupon = array( 123411 ); // variation ids of products that offers gifts $freecoupon = array( 2046 ); // variation ids of products that are gift coupons foreach ( $woocommerce->cart->cart_contents as $key => $values ) { if( in_array( $values['variation_id'], $autocoupon ) ) { $cat_in_cart = true; } if( in_array( $values['variation_id'], $freecoupon) ) { $coupon_in_cart = true; } } if ( $cat_in_cart && !$coupon_in_cart ) { $product_id = 2044; $quantity = 1; $variation_id = 2046; $variation = array( 'pa_size' => '30ml' ); $woocommerce->cart->add_to_cart( $product_id, $quantity, $variation_id, $variation ); $_SESSION['GiftAdded']=true; } } } 将阻止在手动删除礼物产品后再次添加。

答案 1 :(得分:1)

还有另一种基于数量的替代方案,它使用另一个挂钩…处理数量变化或从购物车中取出产品并将免费产品的价格设置为零时处理:

add_action( 'woocommerce_before_calculate_totals', 'add_free_product_to_cart', 20, 1 );
function add_free_product_to_cart( $cart ) {
    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 )
        return;

    $products_ids = array( 123411 ); // Products IDs to check
    $free_var_id  = 2046; // free product (variation ID)
    $free_prod_id = 2044; // free product (product ID)
    $free_attr    = array( 'pa_size'  => 'medium' ); // Free product attribute
    $free_price   = 0;

    $targeted = $free = array('qty' => 0 ); // Initializing

    // Loop through cart items
    foreach ( $cart->get_cart() as $cart_item_key => $cart_item ) {
        if ( in_array( $cart_item['data']->get_id(), $products_ids ) ) {
            $targeted['qty'] += $cart_item['quantity'];
        } elseif ( $cart_item['data']->get_id() == $free_var_id ) {
            $cart_item['data']->set_price($free_price);
            $free['qty'] += $cart_item['quantity'];
            $free['key'] = $cart_item_key;
        }
    }
    // We exit (No changes are needed)
    if( $targeted['qty'] == $free['qty'] )
        return;

    if( $targeted['qty'] > 0 && $free['qty'] == 0 )
    {
        // Add the free product
        $cart->add_to_cart( $free_prod_id, $targeted['qty'], $free_var_id, $free_attr );
    }
    elseif(  $targeted['qty'] > 0 && $free['qty'] > 0 && $targeted['qty'] != $free['qty'] )
    {
        // Adjust free product quantity
        $cart->set_quantity( $free['key'], $targeted['qty'] );
    }
    elseif(  $targeted['qty'] == 0 && $free['qty'] > 0)
    {
        // Remove free product
        $cart->remove_cart_item( $free['key'] );
    }
}

代码会出现在您活动的子主题(或主题)的function.php文件中,或者出现在任何插件文件中。