Zum Inhalt springen
Termin vereinbaren (öffnet in einem neuen Fenster)

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.

Zuletzt geprüft: 6 Minuten Lesezeit

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

Wichtig

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

Tipp

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.

Anrufen Website prüfen Anfragen

Darstellung

Diese Einstellungen gelten nur auf diesem Gerät und werden lokal in deinem Browser gespeichert. Es wird nichts übertragen.

Farbschema
Schriftgröße
Lesbarkeit
Erklärung zur Barrierefreiheit