2017-07-15 67 views
1

我正在使用WooCommerce创建在线食品交付网站,并且需要创建一个“使其成为餐”类型upsell供客户购买。根据产品类别有条件地操作WooCommerce购物车项目

我已经创建了一款名为“Make it a Meal”的产品,用户可以在其中选择饮料和他们选择的一面(使用变体)。然而,我需要的是这些产品中只有一种能够在每顿主餐中购买。

例子:

  • 产品中的“主餐”类别添加到购物车
  • 用户可以再加入“让它吃饭”的产品到购物车
  • 用户不能添加第二个“使它成为一个膳食“产品,除非他们有”膳食餐“类别​​中的第二种产品,即每种产品只有一种产品
  • 如果从购物车中取出”主餐“产品,则”去它做饭“也会被移除。

以前有人有过这种功能吗?我尝试了各种插件,但目前没有运气。

回答

0

更新时间:

有可能首先检查上添加到购物车事件(可选显示错误通知):

add_filter('woocommerce_add_to_cart_validation', 'checking_products_added_to_cart', 10, 3); 
function checking_products_added_to_cart($passed, $product_id, $quantity) { 

    $cat_add = 'Make it a Meal'; 
    $cat_src = 'Main Meal'; 

    if(has_term($cat_add, 'product_cat', $product_id)): 

     $main_meal_count = 0; 
     $make_it_a_meal_count = 0; 

     foreach (WC()->cart->get_cart() as $cart_item){ 

      // Counting 'Main Meal' products in cart (with quantity) 
      if(has_term($cat_src, 'product_cat', $cart_item['product_id'])) 
       $main_meal_count += $cart_item['quantity']; 

      // Counting 'Make it a Meal' products in cart (with quantity) 
      if(has_term($cat_add, 'product_cat', $cart_item['product_id'])) 
       $make_it_a_meal_count += $cart_item['quantity']; 
     } 

     if($main_meal_count < ($make_it_a_meal_count + $quantity)) { 
      $passed = false; 

      // Displaying a message (optionnal) 
      wc_add_notice('my custom error message…', 'error'); 
     } 
    endif; 

    return $passed; 
} 

然后,您还需要检查时,车量改变或购物车物品删除:

add_action('woocommerce_calculate_totals', 'check_removed_cart_items', 10, 1); 
function check_removed_cart_items($cart_object) { 

    if (is_admin() && ! defined('DOING_AJAX')) 
     return; 

    $cat_add = 'Make it a Meal'; 
    $cat_src = 'Main Meal'; 

    $main_meal_count = 0; 
    $make_it_a_meal_count = 0; 

    // First loop: Counting cart items 'Main Meal' and 'Make it a Meal' 
    foreach ($cart_object->get_cart() as $item_values){ 

     // Counting 'Main Meal' products in cart (with quantity) 
     if(has_term($cat_src, 'product_cat', $item_values['product_id'])) 
      $main_meal_count += $item_values['quantity']; 

     // Counting 'Make it a Meal' products in cart (with quantity) 
     if(has_term($cat_add, 'product_cat', $item_values['product_id'])){ 
      $make_it_a_meal_count += $item_values['quantity']; 
     } 
    } 

    $difference = intval($make_it_a_meal_count - $main_meal_count); 

     echo '<p>$main_meal_count is '.$main_meal_count.'</p>'; 
     echo '<p>$make_it_a_meal_count is '.$make_it_a_meal_count.'</p>'; 
     echo '<p>$difference is '.$difference.'</p>'; 

    if($main_meal_count < $make_it_a_meal_count) { 

     echo '<p>case1</p>'; 


     // Second Loop: Make necessary actions 
     foreach ($cart_object->get_cart() as $cart_item_key => $cart_item){ 

      // Targeting 'Make it a Meal' 
      if(has_term($cat_add, 'product_cat', $cart_item['product_id'])){ 

       $item_qty = intval($cart_item['quantity']); 

       if($item_qty == 1 && $difference == 1){ 
        $cart_object->remove_cart_item($cart_item_key); 
        break; 
       } else { 
        if($item_qty > 1 && $difference <= $item_qty){ 
         $cart_object->set_quantity($cart_item_key, ($item_qty - $difference)); 
         break; 
        } else { 
         $cart_object->remove_cart_item($cart_item_key); 
        } 
       } 
      } 
     } 
    } 
} 

有了这2个挂钩功能,你有一个完整的解决方案。

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

此代码已经过测试并可正常工作。

+0

非常感谢你!这对于“简单产品”很有用。你知道如何让它与“变量产品”一起工作吗? – user2766888

+0

只是为了确认,WooCommerce通知正确显示变量产品(即XXX产品已添加到购物车或我的自定义错误消息)。但是当我查看购物车时,变量产品未成功添加。 – user2766888

相关问题