Kostenloses Geschenk ab einer Warenkorbsumme (WooCommerce)
Ab 100 Euro ein Geschenk, ab 200 ein größeres – und wieder weg, wenn die Summe darunter fällt.
Was der Schnipsel macht
WooCommerce kann das von Haus aus nicht: ein Geschenk, das abhängig von der Warenkorbsumme automatisch dazukommt. Mit etwas Code geht es.
Das Ergebnis, mit den Werten aus dem Beispiel:
- ab 100 Euro kommt Produkt 5808 kostenlos dazu,
- ab 200 Euro stattdessen Produkt 5183,
- ab 300 Euro Produkt 4211,
- ab 500 Euro Produkt 4121.
Es ist immer nur ein Geschenk im Warenkorb. Ändert sich die Summe – weil etwas entfernt oder die Menge verringert wird –, wird das Geschenk ausgetauscht oder verschwindet wieder.
Der Schnipsel
add_action( 'woocommerce_before_calculate_totals', function ( $cart ) {
if ( is_admin() && ! defined( 'DOING_AJAX' ) ) {
return;
}
// WooCommerce ruft diesen Hook je Durchlauf mehrfach auf.
if ( did_action( 'woocommerce_before_calculate_totals' ) >= 2 ) {
return;
}
/* --------------------------------------------------------------
Die Staffelung. Schluessel = Mindestsumme, Wert = Produktnummer.
Absteigend sortiert - die erste passende Stufe gewinnt.
Weitere Stufen: einfach eine Zeile ergaenzen.
-------------------------------------------------------------- */
$stufen = [
500 => 4121,
300 => 4211,
200 => 5183,
100 => 5808,
];
$geschenke = array_values( $stufen );
// Summe berechnen - die Geschenke selbst zaehlen dabei nicht mit,
// sonst haelt sich ein Geschenk mit seinem eigenen Wert am Leben.
$summe = 0;
$im_korb = [];
foreach ( $cart->get_cart() as $schluessel => $posten ) {
if ( in_array( (int) $posten['product_id'], $geschenke, true ) ) {
$im_korb[ (int) $posten['product_id'] ] = $schluessel;
$posten['data']->set_price( 0 );
continue;
}
$summe += (float) ( $posten['line_total'] ?? 0 )
+ (float) ( $posten['line_tax'] ?? 0 );
}
// Welche Stufe ist erreicht?
$faellig = 0;
foreach ( $stufen as $mindestsumme => $produkt ) {
if ( $summe >= $mindestsumme ) {
$faellig = $produkt;
break;
}
}
// Alles entfernen, was nicht (mehr) faellig ist.
foreach ( $im_korb as $produkt => $schluessel ) {
if ( $produkt !== $faellig ) {
$cart->remove_cart_item( $schluessel );
}
}
// Das faellige Geschenk hinzufuegen, falls es noch fehlt.
if ( $faellig && ! isset( $im_korb[ $faellig ] ) ) {
$cart->add_to_cart( $faellig, 1 );
}
}, 10, 1 );
Was du anpassen musst
Nur das Array $stufen. Links steht die Mindestsumme,
rechts die Produktnummer. Die Nummer findest du in der
Produktübersicht, wenn du mit der Maus über den Produktnamen fährst –
sie steht in der Adresse als post=….
Wichtig ist die absteigende Sortierung: Die Schleife nimmt die erste Stufe, deren Mindestsumme erreicht ist. Stünde 100 oben, bekäme jeder Warenkorb das kleinste Geschenk.
Die Nebenwirkung
Ein Produkt, das in $stufen steht, wird bei
jedem Auftauchen im Warenkorb auf null gesetzt –
auch dann, wenn jemand es ganz normal über die Produktseite
hineinlegt.
Verwende dafür also eigene Artikel, die du sonst nicht verkaufst. Ein reguläres Produkt als Geschenk einzusetzen heißt, es gleichzeitig zu verschenken.
Zwei weitere Dinge, die in der Praxis auffallen:
-
Der Bestand. Wenn das Geschenkprodukt eine
Bestandsführung hat und leer ist, schlägt
add_to_cart()stillschweigend fehl. Setz die Bestandsführung für diese Artikel besser aus. - Der Versand. Ein Geschenk mit hinterlegtem Gewicht verändert die Versandkosten. Bei physischen Beigaben ist das gewollt, bei einem Gutschein-Download nicht – dort das Produkt als „virtuell" kennzeichnen.
Wohin der Code gehört
Nicht in die functions.php des Themes – beim nächsten
Theme-Update ist er weg. Richtig sind ein Child-Theme
oder ein Code-Plugin wie „Code Snippets" oder „WPCode". Und weil
dieser Schnipsel in den Bestellvorgang eingreift: vorher
sichern
und danach eine Testbestellung über alle vier Stufen durchspielen.
Passt das nicht auf deinen Fall?
Dieser Artikel beantwortet die Frage allgemein – deine ist vermutlich konkreter. Schreib mir kurz, worum es geht. Ich antworte selbst, meist am selben Tag, und es kostet nichts.
Hat dir das geholfen?
Dann sag es weiter. Eine kurze Bewertung dauert dreißig Sekunden und sorgt dafür, dass die Nächsten diese Antwort überhaupt finden.
Passt dazu
- Schnipsel Mengenfeld auf der WooCommerce-Warenkorbseite ausblenden Vier Zeilen – mit einer Nebenwirkung, die man kennen sollte, bevor man sie einsetzt.
- Schnipsel Eigene Währung zu WooCommerce hinzufügen Zwei Filter, und die Währung steht in den Einstellungen zur Auswahl. Kassieren kannst du damit allerdings noch nicht.
- Schnipsel WordPress-Suchfunktion deaktivieren Ein Schnipsel für die Fälle, in denen die eingebaute Suche mehr stört als hilft – ohne die Suche im Verwaltungsbereich mit abzuschalten.
- Schnipsel Produkt-Metadaten in WooCommerce ausblenden Artikelnummer, Kategorien und Schlagwörter von der Produktseite nehmen – für alle Produkte oder gezielt für einzelne.