Ich hoffe mir kann jemand helfen
Danke für das Problem :-) Das hatte ich noch nicht und wenn mich jemand gefragt hätte, hätte ich gedacht, das auch Variationen von der "sold_individually" Einstellung erfasst werden.
Was sie tatsächlich auch tun, allerdings nur für jede einzelne Variation. Man kann also bei gesetzter Option nur eine "blaue" Variante eines T-Shirts in den Warenkorb legen und auch nur eine "rote". Sehr wohl geht aber eine "rote" und eine "blaue". Tatsächlich behandelt WooCommerce jede Variation wie einen eigenen Artikel, was programmiertechnisch richtig ist. Da man auch bei aktivierter Einzelverkaufsoption unterschiedliche Artikel in den Warenkorb legen kann, funktioniert das auch bei Variationen.
Um das "Problem" zu lösen habe ich mir den Quellcode angesehen. Tatsächlich gibt es keine "sanfte" Methode das abzufangen, denn dort wo die Prüfung stattfindet gibt es keinen Filter und auch davor gibt es innerhalb der Funktion keine Möglichkeit alle notwendigen Variablen zu beeinflussen. In Folge bleibt nur die Nutzung eines späteren Filters mit erzwungenem Abbruch, wenn bereits eine Variation eines variablen Produkts im Warenkorb liegt.
Folgender Code kann in der functions.php eines Childthemes verwendet werden um das Hinzufügen zum Warenkorb verschiedener Varianten des gleichen Produkts zu verhindern:
add_filter( 'woocommerce_add_cart_item', 'mmx_variation_is_sold_individually' );
function mmx_variation_is_sold_individually( $cart_item_data ) {
global $woocommerce;
$items = $woocommerce->cart->get_cart();
foreach( $items as $cart_item_key => $cart_item_values ){
if ( $cart_item_data['product_id'] == $cart_item_values['product_id'] ) {
throw new Exception( sprintf( '<a href="%s" class="button wc-forward">%s</a> %s', $woocommerce->cart->get_cart_url(), __( 'View Cart', 'woocommerce' ), sprintf( __( 'You cannot add another "%s" to your cart.', 'woocommerce' ), $cart_item_data['data']->post->post_title ) ) );
die;
}
}
return $cart_item_data;
}
Alles anzeigen
Achtung! Der Code ist nagelneu und nur im Rahmen der Entwicklung getestet (produziert also keine PHP Fehler). Er wurde nie zuvor verwendet und ich kann keine Aussage über mögliche Nebenwirkungen treffen (wenn gleich mir derzeit auch wirklich keine einfallen). Die Verwendung erfolgt auf eigene Gefahr.