2016-11-04 1 views
2

Я должен проверить, входит ли одна из моих двух категорий обязательных продуктов в корзину.Проверка наличия одной из нескольких категорий обязательных продуктов в корзине

Я настроил код из этого ответа:
Allow checkout only when a product of a mandatory category is in cart

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

Как я могу заставить его работать для 2 категорий товаров вместо одного?

Вот код:

// Function that define the mandatory product category 
     function your_mandatory_category_slug(){ 
     // DEFINE HERE the SLUG of the needed product category 
      $category = 'cxsuite-download-option'; 
      return $category; 
     } 

     function your_mandatory_category_slug_h(){ 

      // DEFINE HERE the SLUG of the needed product category 
      $category_h = 'cxsuite-hosted-option'; 
      return $category_h; 
     } 
    // Conditional function that returns true if the mandatory product category is in cart 
    function has_mandatory_category(){ 
     $category_needed = your_mandatory_category_slug(); 
     $category_needed_h = your_mandatory_category_slug_h(); 
     $has_cat = false; 

     // Iterrating each item in cart and detecting… 
     foreach (WC()->cart->get_cart() as $item) { 

      // Detects if the needed product category is in cart items 
      if (has_term($category_needed, 'product_cat', $item['product_id'])) { 
       $has_cat = true; 
       break; 
      } 
      elseif (has_term($category_needed_h, 'product_cat', $item['product_id'])) { 
       $has_cat = true; 
       break; 
      } 
     } 
     return $has_cat; 
    } 
// Function that display a message if there is not in cart a mandatory product category 
function mandatory_category_display_message() { 
     $category_needed = your_mandatory_category_slug(); 
     $category_needed_h = your_mandatory_category_slug_h(); 


    // check that cart is not empty (for cart and product category archives) 
    if(!WC()->cart->is_empty() && (is_cart() || is_product_category($category_needed) || is_product_category($category_needed_h))){ 
     $category_needed_single=null; 
     if($category_needed=='cxsuite-download-option'){ 
      $category_needed_single='cxsuite-download-option'; 
     }{ 
      $category_needed_single=$category_needed_h; 
     } 
     $category_obj = get_term_by('slug', $category_needed_single, 'product_cat'); 

     if (is_wp_error($category_obj)) return; 


     // Display message when product category is not in cart items 
     if (!has_mandatory_category()) { 
      $category_name = $category_obj->name; 
      $category_url = get_term_link($category_needed_single, 'product_cat'); 

      // render a notice to explain why checkout is blocked 
      wc_add_notice(sprintf(__('<strong>Reminder:</strong> You have chosen Addon that can only be purchased together with a %1$s. Please add a %1$s (full or trial) before checking out. Please return <a href="%2$s"> here to "%1$s" product page</a>', 'your_theme_domain'), $category_name, $category_url), 'error'); 

     } 

    } 
} 
add_action('woocommerce_before_main_content', 'mandatory_category_display_message', 30); // for product mandatory category archives pages 
add_action('woocommerce_check_cart_items', 'mandatory_category_display_message'); // for cat page 


// Function that redirect from checkout to mandatory product category archives pages 
function mandatory_category_checkout_redirect() { 

    // If cart is not empty on checkout page 
    if(!WC()->cart->is_empty() && is_checkout()){ 
     $category_needed = your_mandatory_category_slug(); 
     $category_needed_h = your_mandatory_category_slug_h(); 
     $category_needed_single=null; 
     if(is_product_category($category_needed)){ 
      $category_needed_single=$category_needed; 
     }else{ 
      $category_needed_single=$category_needed_h; 
     } 

     // If missing product category => redirect to the products category page 
     if (!has_mandatory_category()) 
      wp_redirect(get_term_link($category_needed_single, 'product_cat')); 
    } 

} 
add_action('template_redirect', 'mandatory_category_checkout_redirect'); 

ответ

1

Вы можете использовать только частично код, который вы подобрали из моего ответа, для 2-х или более категорий, с использованием массива категорий продукции таким образом:

// Function that define the mandatory product category 
function your_mandatory_category_slug(){ 
// DEFINE HERE the 2 SLUGs of the needed product categories 
    $categories = array('cxsuite-download-option','cxsuite-hosted-option'); 
    return $categories 
} 

// Conditional function that returns true if the mandatory products categories are in cart 
function has_mandatory_category(){ 
    $categories_needed = your_mandatory_category_slug(); 
    $has_cat = false; 

    // Iterrating each item in cart and detecting… 
    foreach (WC()->cart->get_cart() as $item) { 

     // iterating both categories 
     foreach ($categories_needed as $category_needed) { 

      // Detects if one of the needed product categories is in cart items 
      if (has_term($category_needed, 'product_cat', $item['product_id'])) 
       $has_cat = true; 
     } 
     if($has_cat) 
      break; 
    } 
    return $has_cat; 
} 

// Function that display a message if there is not in cart a mandatory product category 
function mandatory_category_display_message() { 
    $categories_needed = your_mandatory_category_slug(); 

    // check that cart is not empty (for cart and product category archives) 
    if(!WC()->cart->is_empty() && (is_cart() || is_product_category($categories_needed[0] || is_product_category($categories_needed[1]))){ 
     $category_name = array(); 
     $category_url = array(); 

     // iterating both categories 
     foreach($categories_needed as $key => $category_needed){ 
      $category_obj = get_term_by('slug', $category_needed, 'product_cat'); 
      if (is_wp_error($category_obj)) 
       return; 

      $category_name[$key] = $category_obj->name; 
      $category_url[$key] = get_term_link($category_needed, 'product_cat'); 
     } 
     // Display message when one of the product categories is not in cart items 
     if (!has_mandatory_category()) { 
      // render a notice to explain why checkout is blocked 
      wc_add_notice(sprintf(__('<strong>Reminder:</strong> You have to add in your cart, a product from "%1$s" or from "%3$s" category, to be allowed to check out. Please return <a href="%2$s"> here to "%1$s"</a> or <a href="%4$s"> here to "%3$s"</a> product pages', 'your_theme_domain'), $category_name[0], $category_url[0], $category_name[1], $category_url[1]), 'error'); 
     } 
    } 
} 
add_action('woocommerce_before_main_content', 'mandatory_category_display_message', 30); // for product mandatory category archives pages 
add_action('woocommerce_check_cart_items', 'mandatory_category_display_message'); // for cart page 

Но вам придется выбрать для последней функции, между одной из категорий 2 продукта для перенаправления ...

// Function that redirect from checkout to mandatory product category archives pages 
function mandatory_category_checkout_redirect() { 

    // If cart is not empty on checkout page 
    if(!WC()->cart->is_empty() && is_checkout()){ 
     $categories_needed = your_mandatory_category_slug(); 

     // If missing product category => redirect to the products category page 
     if (!has_mandatory_category()) 
      wp_redirect(get_term_link($categories_needed[0], 'product_cat')); // or $categories_needed[1] 
    } 
} 
add_action('template_redirect', 'mandatory_category_checkout_redirect'); 

Это файл functions.php вашей активной дочерней темы (или темы), а также в любом файле плагина.

Этот код основан на этом функциональный ответ:
Allow checkout only when a product of a mandatory category is in cart

Это проверялось, но он должен работать ...

+0

Привет спасибо, что сделал хорошую работу, но в последней функции я изменил перенаправлять обратно странице магазина из-за клиента, если он не может иметь один, другой выбрать. Я думаю, что лучшим решением было перейти на страницу магазина. Еще раз спасибо. –

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