2016-07-15 10 views
3

私たちは排他的なカテゴリXと他の正規カテゴリYを持っています。私は希望の何か:WooCommerce Cart - 条件付きアイテムのカテゴリ

  • を誰かがカテゴリXから何かを注文すると、他のカテゴリのアイテムをカートに追加することができないと
  • カテゴリY製品はXと混合してはならない警告が表示されます。

どうすれば達成できますか?

私は他のポストからこのコードを得たが、その時代遅れと満足のいくものではなかっ:

<?php 

// Enforce single parent category items in cart at a time based on first item in cart 
function get_product_top_level_category ($product_id) { 

    $product_terms   = get_the_terms ($product_id, 'product_cat'); 
    $product_category   = $product_terms[0]->parent; 
    $product_category_term = get_term ($product_category, 'product_cat'); 
    $product_category_parent = $product_category_term->parent; 
    $product_top_category  = $product_category_term->term_id; 

    while ($product_category_parent != 0) { 
      $product_category_term = get_term ($product_category_parent, 'product_cat'); 
      $product_category_parent = $product_category_term->parent; 
      $product_top_category  = $product_category_term->term_id; 
    } 

    return $product_top_category; 
} 

add_filter ('woocommerce_before_cart', 'restrict_cart_to_single_category'); 
function restrict_cart_to_single_category() { 
    global $woocommerce; 
    $cart_contents = $woocommerce->cart->get_cart(); 
    $cart_item_keys = array_keys ($cart_contents); 
    $cart_item_count = count ($cart_item_keys); 

    // Do nothing if the cart is empty 
    // Do nothing if the cart only has one item 
    if (! $cart_contents || $cart_item_count == 1) { 
      return null; 
    } 

    // Multiple Items in cart 
    $first_item     = $cart_item_keys[0]; 
    $first_item_id     = $cart_contents[$first_item]['product_id']; 
    $first_item_top_category  = get_product_top_level_category ($first_item_id); 
    $first_item_top_category_term = get_term ($first_item_top_category, 'product_cat'); 
    $first_item_top_category_name = $first_item_top_category_term->name; 

    // Now we check each subsequent items top-level parent category 
    foreach ($cart_item_keys as $key) { 
      if ($key == $first_item) { 
        continue; 
      } 
      else { 
        $product_id   = $cart_contents[$key]['product_id']; 
        $product_top_category = get_product_top_level_category($product_id); 

        if ($product_top_category != $first_item_top_category) { 
          $woocommerce->cart->set_quantity ($key, 0, true); 
          $mismatched_categories = 1; 
        } 
      } 
    } 

    // we really only want to display this message once for anyone, including those that have carts already prefilled 
    if (isset ($mismatched_categories)) { 
      echo '<p class="woocommerce-error">Only one category allowed in cart at a time.<br />You are currently allowed only <strong>'.$first_item_top_category_name.'</strong> items in your cart.<br />To order a different category empty your cart first.</p>'; 
    } 
} 
?> 

おかげ

すべてのよう

答えて

3

があなたの排他的なカテゴリcategory X回っている、あなたはのための条件を使用する必要がありますこのカテゴリ。

また、ウーコム商品カテゴリと組み合わせて使用​​できる特別な機能があるため、チャンスがあります。あなたがそれを知っているので、**cat_x**があなたの独占的なカテゴリーのスラッグであると言うことができますproduct_catは、製品カテゴリを取得する引数です。

だからhas_term()条件関数で、これを使用しようとしている。そこかどうかを検出するために

  • if (has_term ('cat_x', 'product_cat', $item_id)) { // or $product_id 
        // doing something when product item has 'cat_x' 
    } else { 
        // doing something when product item has NOT 'cat_x' 
    } 
    

    私たちは、カートのアイテムにforeachループで2回実行する必要がありますその車にはcat_xの商品です。

  • カート内の1つのアイテムについてcat_xが検出された場合は、他のアイテムを削除し、正しいメッセージを送信します。

以下のコードでは、より便利なフックに変更しました。このフックはあなたのカートにあるものをチェックします。その考えは、カートに「cat_x」アイテムが追加されている場合に、カート内の他のカテゴリアイテムを削除することです。

コードはよくコメントされています。最後に、あなたは解雇される別の通知を見つけるでしょう。実際のテキストをそれぞれ入力する必要があります。私は本当にこのコードをテストするため

add_action('woocommerce_check_cart_items', 'checking_cart_items'); 
function checking_cart_items() { 

    global $woocommerce; // if needed, not sure (?) 
    $special = false; 
    $catx = 'cat_x'; 
    $number_of_items = sizeof(WC()->cart->get_cart()); 

    if ($number_of_items > 0) { 

     // Loop through all cart products 
     foreach (WC()->cart->get_cart() as $cart_item_key => $values) { 
      $item = $values['data']; 
      $item_id = $item->id; 

      // detecting if 'cat_x' item is in cart 
      if (has_term($catx, 'product_cat', $item_id)) { 
       if (!$special) { 
        $special = true; 
       } 
      } 
     } 

     // Re-loop through all cart products 
     foreach (WC()->cart->get_cart() as $cart_item_key => $values) { 
      $item = $values['data']; 
      $item_id = $item->id; 

      if ($special) // there is a 'cat_x' item in cart 
      { 
       if ($number_of_items == 1) { // only one 'cat_x' item in cart 
        if (empty($notice)){ 
         $notice = '1'; 
        } 
       } 
       if ($number_of_items >= 2) { // 'cat_x' item + other categories items in cart 

        // removing other categories items from cart 
        if (!has_term($catx, 'product_cat', $item_id)) { 
         WC()->cart->remove_cart_item($cart_item_key); // removing item from cart 
         if (empty($notice) || $notice == '1'){ 
          $notice = '2'; 
         } 
        } 
       } 
      } else { // Only other categories items 

       if (empty($notice)){ 
        $notice = '3'; 
       } 
      } 
     } 

     // Firing woocommerce notices 
     if ($notice == '1') { // message for an 'cat_x' item only (alone) 
      wc_add_notice(sprintf('<p class="woocommerce-error">bla bla bla one category X item in the cart</p>'), 'success'); 
     } elseif ($notice == '2') { // message for an 'cat_x' item and other ones => removed other ones 
      wc_add_notice(sprintf('<p class="woocommerce-error">bla bla bla ther is already category X in the cart => Other category items has been removed</p>'), 'error'); 
     } elseif ($notice == '3') { // message for other categories items (if needed) 
      wc_add_notice(sprintf('<p class="woocommerce-error">bla bla bla NOT category X in the cart</p>'), 'success'); 
     } 
    } 
}  


@edit

我々が通知以外のものを使用することができます...(それはエラーをスローしない)ことはできません...すべてが可能です。しかし、それは微調整するための良い出発点です。

あなたは私は非常に高く評価ソリューションを、得たよう

+0

が見えます...(初めに)あなたの本当のカテゴリスラッグによって'cat_x'を交換する必要があります。 –

+0

@BluecupsSolutionちょうど歓迎:)私はこの答えについて完全にはわかっていませんでした。詳しい情報が必要な場合は、ここでコメントしてください。ありがとう – LoicTheAztec

関連する問題