2016-07-15 6 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, вам нужно использовать условный для этой категории.

И у вас есть шанс, потому что есть специальная функция, которую вы можете использовать в сочетании с категориями товаров woocommerce. Допустим, что **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' 
} 

Мы должны запустить телеге пункты 2 раза в цикле Еогеасп:

  • Чтобы обнаружить, если cat_x вещь в этом автомобиле.
  • Для удаления других предметов, если 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

Мы можем использовать что-то другое, чем замечает ... все возможно. Но это хорошее стартовое решение для тонкой настройки.

Вам нужно будет заменить 'cat_x' вашей реальной категории слизняк (в начале) ...

+0

выглядит как я получил решение, очень высоко ценится. –

+0

@BluecupsSolution Просто приветствую :) ... Я не был полностью уверен в этом вопросе. Если вам нужна дополнительная информация, просто прокомментируйте меня здесь. благодаря – LoicTheAztec

Смежные вопросы