2017-02-22 9 views
3

私はカート内に特別な商品カテゴリ 'cat_x'が追加された商品がある場合、以下のコードを使用して他のWooCommerce商品カテゴリアイテムをカートから削除しています通知。コードはthis threadから来て、ちょうどうまく機能:同じ商品カテゴリのカートアイテムを制限する

add_action('woocommerce_check_cart_items', 'checking_cart_items'); 
function checking_cart_items() { 
    $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 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'); 
     } 
    } 
} 

は、カテゴリの配列でも動作しますhas_termは()、私はそのコードにカテゴリの配列を設定するために、一つのカテゴリの代わりにしようとした条件付き機能を持っています。 しかし、それは動作していません

しかし、私のニーズは変わっています。顧客がさまざまなカテゴリのカートアイテムを選択できるようにすることはできません。したがって、カートには常に同じ商品カテゴリの商品が必要です。

お願いします。

ありがとうございました。

答えて

3

woocommerce_add_to_cart_validationフィルタフックでカスタム関数をフックすると、カテゴリの配列を設定する必要がなく、はるかに簡単な方法でジョブを実行できます。

あなたのコードははるかに高速かつコンパクトになります。また、顧客に警告するためのカスタム通知を表示することもできます。別のカテゴリのアイテムがカートにある場合、このコードは、カートに追加しないようにします

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

    // HERE Type your alert displayed message 
    $message = __('BLA BLA YOUR MESSAGE.', 'woocommerce'); 

    $product_cats_object = get_the_terms($product_id, 'product_cat'); 
    foreach($product_cats_object as $obj_prod_cat){ 
     $product_cats[] = $obj_prod_cat->slug; 
    } 

    foreach (WC()->cart->get_cart() as $cart_item){ 
     if(! has_term($product_cats, 'product_cat', $cart_item['product_id'])) { 
      $passed = false; 
      wc_add_notice($message, 'error'); 
      break; 
     } 
    } 
    return $passed; 
} 

コードは、あなたのアクティブな子テーマ(またはテーマ)のfunction.phpファイルになったりもで任意のプラグインファイル。

このコードをテストし、それが唯一の異なる製品カテゴリからのものであると、カートのアイテムを制限


を動作します:

は、機能の状態を置き換えます

if(! has_term($product_cats, 'product_cat', $cart_item['product_id'])) { 

if(has_term($product_cats, 'product_cat', $cart_item['product_id'])) { 
+0

ありがとう、このソリューションは完璧に動作します。 –

関連する問題