2017-07-15 4 views
1

Ich bin gerade dabei, eine Online-Essenslieferungs-Website mit WooCommerce zu erstellen und ein "Make it a Meal" -Typ-Upsell für Kunden zu erstellen.Bearbeiten von WooCommerce-Einkaufswagen-Artikeln bedingt durch Produktkategorien

Ich habe ein einzelnes Produkt namens "Make it a Meal" erstellt, wo Benutzer das Getränk und die Seite ihrer Wahl (mit Variationen) auswählen können. Was ich jedoch brauche, ist, dass nur eines dieser Produkte pro Hauptmahlzeit gekauft werden kann.

Beispiel:

  • Artikel in „Hauptmahlzeit“ -Kategorie in den Warenkorb gelegt wird
  • Der Benutzer kann dann hinzufügen Produkt „es eine Mahlzeit“ in den Warenkorb
  • Benutzer kann nicht zweiten hinzufügen „es ein Make Mahlzeit "Produkt, es sei denn, sie haben ein zweites Produkt aus der Kategorie" Mahlzeit Mahlzeit "dh nur eine pro Produkt
  • Wenn" Main Meal "-Produkt aus dem Warenkorb entfernt wird, wird auch" Make it a Meal "entfernt.

Hat jemand diese Art von Funktionalität schon einmal erreicht? Ich habe verschiedene Plugins ausprobiert, hatte aber zur Zeit kein Glück.

Antwort

0

Aktualisiert:

Es ist möglich, zuerst auf Add-to-cart Ereignisse Überprüfung (optional eine Fehlerbenachrichtigung angezeigt wird):

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

    $cat_add = 'Make it a Meal'; 
    $cat_src = 'Main Meal'; 

    if(has_term($cat_add, 'product_cat', $product_id)): 

     $main_meal_count = 0; 
     $make_it_a_meal_count = 0; 

     foreach (WC()->cart->get_cart() as $cart_item){ 

      // Counting 'Main Meal' products in cart (with quantity) 
      if(has_term($cat_src, 'product_cat', $cart_item['product_id'])) 
       $main_meal_count += $cart_item['quantity']; 

      // Counting 'Make it a Meal' products in cart (with quantity) 
      if(has_term($cat_add, 'product_cat', $cart_item['product_id'])) 
       $make_it_a_meal_count += $cart_item['quantity']; 
     } 

     if($main_meal_count < ($make_it_a_meal_count + $quantity)) { 
      $passed = false; 

      // Displaying a message (optionnal) 
      wc_add_notice('my custom error message…', 'error'); 
     } 
    endif; 

    return $passed; 
} 

Dann müssen Sie auch prüfen, wenn Warenkorb Mengen geändert werden oder Warenkorb Artikel entfernt:

add_action('woocommerce_calculate_totals', 'check_removed_cart_items', 10, 1); 
function check_removed_cart_items($cart_object) { 

    if (is_admin() && ! defined('DOING_AJAX')) 
     return; 

    $cat_add = 'Make it a Meal'; 
    $cat_src = 'Main Meal'; 

    $main_meal_count = 0; 
    $make_it_a_meal_count = 0; 

    // First loop: Counting cart items 'Main Meal' and 'Make it a Meal' 
    foreach ($cart_object->get_cart() as $item_values){ 

     // Counting 'Main Meal' products in cart (with quantity) 
     if(has_term($cat_src, 'product_cat', $item_values['product_id'])) 
      $main_meal_count += $item_values['quantity']; 

     // Counting 'Make it a Meal' products in cart (with quantity) 
     if(has_term($cat_add, 'product_cat', $item_values['product_id'])){ 
      $make_it_a_meal_count += $item_values['quantity']; 
     } 
    } 

    $difference = intval($make_it_a_meal_count - $main_meal_count); 

     echo '<p>$main_meal_count is '.$main_meal_count.'</p>'; 
     echo '<p>$make_it_a_meal_count is '.$make_it_a_meal_count.'</p>'; 
     echo '<p>$difference is '.$difference.'</p>'; 

    if($main_meal_count < $make_it_a_meal_count) { 

     echo '<p>case1</p>'; 


     // Second Loop: Make necessary actions 
     foreach ($cart_object->get_cart() as $cart_item_key => $cart_item){ 

      // Targeting 'Make it a Meal' 
      if(has_term($cat_add, 'product_cat', $cart_item['product_id'])){ 

       $item_qty = intval($cart_item['quantity']); 

       if($item_qty == 1 && $difference == 1){ 
        $cart_object->remove_cart_item($cart_item_key); 
        break; 
       } else { 
        if($item_qty > 1 && $difference <= $item_qty){ 
         $cart_object->set_quantity($cart_item_key, ($item_qty - $difference)); 
         break; 
        } else { 
         $cart_object->remove_cart_item($cart_item_key); 
        } 
       } 
      } 
     } 
    } 
} 

Mit diesen 2 süchtig Funktionen haben Sie eine komplette Lösung.

Code geht in function.php Datei von Ihrem aktiven Kind Thema (oder Thema) oder auch in einer beliebigen Plugin-Datei.

Dieser Code wurde getestet und funktioniert.

+0

erstaunlich, danke! Dies funktioniert hervorragend mit einem "einfachen Produkt". Weißt du, wie man es mit einem "variablen Produkt" zum Laufen bringt? – user2766888

+0

nur zur Bestätigung, die WooCommerce-Meldung wird korrekt für Variable Produkte angezeigt (d. H. XXX Produkt wurde in den Warenkorb oder meine benutzerdefinierte Fehlermeldung hinzugefügt). Aber wenn ich den Warenkorb anschaue, wurde das Produkt Variable nicht erfolgreich hinzugefügt. – user2766888

Verwandte Themen