Category Archives: WooCommerce

WooCommerce: Produkt im Warenkorb bearbeiten

Ich habe mich gerade damit rumgeschlagen, ein Produkt im Warenkorb zu bearbeiten.

Bei normalen Produkten ist das eigentlich nur die Anzahl, die geändert werden soll, und das kann man im Warenkorb selbst machen.

Bei Produkten mit Custom Attributes ist das schon schwieriger. Wenn z.B.  eine Bestellung auf mehrere Lieferadressen aufgeteilt werden soll, und von 5 Stück für Bruchmühlbach-Miesau jetzt 2 davon nach Thaleischweiler-Fröschen gehen sollen und nur 3 nach Bruchmühlbach-Miesau. Ich habe dafür mehrere Input-Felder erstellt und rechne die Gesamtanzahl mit JavaScript aus. Das klappt auch alles. Nur…wie editiert man das?

Eine Anfrage bei WooCommerce ergab, daß es diese Funktion nicht gibt. Und irgendwie scheint sie auch niemand außer mir zu vermissen. Was tun?

Selber machen 🙂

Meine Idee war, Löschen und Hinzufügen zu einer Bearbeiten-funktion zu kombinieren.

1.) Meine Warenkorb-Seite liegt (als WooCommerce-Template) in /wp-content/themes/mytheme/woocommerce/cart/cart.php. Es ist eine Kopie des Original-Woo-Templates. Ich gucke rein und sehe, daß die Löschfunktion mit esc_url(wc_g
et_cart_remove_url( $cart_item_key )…
gelöst wird. Ich baue daneben eine Edit-Funktion mit esc_url( $product_permalink ).“?edit_item=“.esc_attr( $cart_item[‚key‘] )… und übergebe den key. Unterhalb der Löschfunktion erstelle ich etwas in der Art:


echo apply_filters( 'woocommerce_cart_item_remove_link', sprintf('Bearbeiten',
esc_url( $product_permalink )."?edit_item=".esc_attr( $cart_item['key'] ),
__( 'Edit this item', 'woocommerce' ),
esc_attr( $product_id ),
esc_attr( $_product->get_sku() )
), $cart_item_key );

Der Link sieht so aus:


produkt/permalink/?edit_item=cc4dfe235de18d17fd11c3953d4a47d0

2.) Die Variable $edit_item steht für das Warenkorb-Item, das entfernt werden soll. Leider ist es mir nicht gelungen, den Key mit $_GET oder $_POST zu übergeben, deshalb verwende ich eine Session-Variable, die ich nach getanre Arbeit wieder lösche.

In der functions.php erstelle ich eine Funktion, die ddie Session-Variable erstellt:


function gw_edit_cart_item() {
$keytoremove = $_GET['edit_item'];
$_SESSION['keytoremove'] = $keytoremove;
}
add_action('woocommerce_after_single_product_summary', 'gw_edit_cart_item');

3.) So, erstellt. Jetzt brauche ich noch eine Funktion, die beim In-den-Warenkorb-legen des neuen Produktes das alte löscht. Und danach die Session-Variable. Ich mach das mit einer weiteren Funktion in der functions.php:


function gw_validate_add_cart_item( $passed, $product_id, $quantity, $variation_id = '', $variations= '' ) {
GLOBAL $woocommerce;
if ( isset ($_SESSION['keytoremove']) ) {
$keytoremove=$_SESSION['keytoremove'];
$passed = true;
$woocommerce->cart->remove_cart_item($keytoremove);
wc_add_notice( __( 'Produkt wurde aus dem Warenkorb entfernt', 'textdomain' ), 'notice' );
unset ($_SESSION["keytoremove"]);
}
return $passed;
}
add_filter( 'woocommerce_add_to_cart_validation', 'gw_validate_add_cart_item', 10, 5 );

 

4.) Jetzt sehe ich beim Produkt-Bearbeiten 2 Notices oben stehen:

„Produkt X wurde in den Warenkorb gelegt“
und
„Produkt wurde aus dem Warenkorb entfernt“

Das kann man sicher noch schöner machen…aber es funktioniert und macht genau das was es soll.

Freue mich über Anregungen und Ideen 🙂