2014-10-15 5 views

Antwort

6

Ich habe das schon mal gelöst. My write-up is here.

Es unterscheidet sich leicht von Ihrer Anfrage darin, dass der Einkaufswagen nicht gelöscht wird, wenn er versucht, eine zweite Kategorie hinzuzufügen, er behält den ursprünglichen Artikel im Warenkorb und zeigt eine Warnung an.

für die Nachwelt:

<?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_term = $product_terms[0]; 
    $product_category_parent = $product_terms[0]->parent; 

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

    return $product_category_term; 

} 

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>'; 
     } 
} 
?> 
+1

Vielen Dank, das ist wirklich löst das Problem und funktioniert perfekt ... – Lordwhizy

+0

Nichts zu danken. Viel Glück mit Ihrem Projekt. – Dez

+0

Das funktioniert super! Ich habe eine Frage, ist es möglich, auch Gegenstände, die über Ajax in den Warenkorb gelegt werden, zu aktivieren oder zu blockieren? Ich habe dieses Problem jetzt für eine Weile beim Hinzufügen von Gegenständen über Ajax, es zeigt in der Ajax auf Seite Warenkorb, dass die Elemente beide da sind. Wenn Sie auf view cart klicken, funktioniert diese Methode, aber wenn Sie direkt zur Kasse gehen, können Sie zwei verschiedene Kategorien gleichzeitig auswählen. –

Verwandte Themen