Veröffentlicht am

Woocommerce – Variationen im Warenkorb ändern

Im Zuge der Erweiterung eines Shops wünschte der Kunde auch, dass man variable Produkte direkt vom Warenkorb aus ändern kann. Sprich, dass die Variantenauswahl nicht nur auf der Produktdetailseite funktioniert, sondern auch im Warenkorb.

Hier gibt es nun jede Menge Plugins, die aufgrund strenger Restriktionen auf Kundenseite aber von vornherein aus dem Rennen waren.

Lange Rede, kurzer Sinn, der Warenkorb musste über die Session manipuliert werden. Hierfür wählte ich den Hook:

woocommerce_cart_loaded_from_session

Innerhalb der Funktion weise ich das gesamte Cart-Array einem leeren Array zu und zwar Item für Item. Die anzupassenden Werte ändere ich innerhalb dieses Loops und speichere das Array dann zurück.

add_action('woocommerce_cart_loaded_from_session', 'update_variations');
function update_variations() {
//array to collect updated items
$new_cart_items = [];

//loop through current cart item and reassign them to the new array
    foreach (WC()->cart->get_cart() as $cart_item_key => $cart_item) {      
      $new_cart_items[$cart_item_key] = WC()->cart->cart_contents[$cart_item_key];

      // add the new variation to the product (i get all values from session, where i saved them step before)
      $new_cart_items[$cart_item_key]['variation_id'] = WC()->session->get( 'variation_id' ); 
      $new_cart_items[$cart_item_key]['variation'][WC()->session->get( 'variation')] = WC()->session->get( 'variation_value' );    
     
     // IMPORTANT: empty the data_hash to avoid product to be deleted 
     $new_cart_items[$cart_item_key]['data_hash'] = "";
    }
}
Und wer noch einen Denkansatz braucht, wie man das Formular für die Variationen erstellt, der sollte daran denken, dass alle Variationen custom post types sind und das Produkt bzw. die Produkt-ID als post_parent enthalten.