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.
erstaunlich, danke! Dies funktioniert hervorragend mit einem "einfachen Produkt". Weißt du, wie man es mit einem "variablen Produkt" zum Laufen bringt? – user2766888
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