Zum Inhalt

Beispielarbeiten · WordPress

WooCommerce-Erweiterung: Mengenrabatt je Kategorie

Ein kleines Plugin, das ab einer Stückzahl einen Rabatt auf eine Produktkategorie gibt. Geprüft über echte Warenkörbe auf einer lokalen WooCommerce-Installation, centgenau, mit Gegenprobe ohne Plugin.

Musterarbeit (Demo), kein Kundenauftrag. Gebaut als Probeaufgabe mit erfundenen Beispieldaten; die Prüfzahlen unten stammen aus dem automatischen Prüflauf und sind nicht geschönt.

Was gebaut wurde

  • Staffeln und Kategorie in einer Option, ohne Codeänderung anpassbar
  • Rabatt je Warenkorbzeile, sichtbar im Warenkorb
  • Ohne WooCommerce bleibt die Seite heil: das Plugin meldet sich nur ab

gl-mengenrabatt.zip herunterladen

Wie geprüft wurde

Automatischer Prüflauf vom 18.10.2026, aus dem Protokoll (Testdaten erfunden, Zahlen gemessen):

  • WooCommerce 11.2.1 lokal, eigenes Plugin GL Mengenrabatt (ab 3 Stueck 10 %, ab 5 Stueck 15 %, Kategorie Kaffee)
  • 13/13 Pruefungen gruen ueber die Store API (6 Warenkoerbe centgenau, Option wirkt, Gegenprobe ohne Plugin, ohne WooCommerce kein Fatal)
Alle Prüffälle (8 von 8 grün)
  • ✓ 2x kaffee
  • ✓ 3x kaffee
  • ✓ 5x kaffee 1x muehle
  • ✓ 3x espresso rundung
  • ✓ 6x muehle andere kategorie
  • ✓ 3 auf 5 geaendert
  • ✓ option ab2 50prozent
  • ✓ gegenprobe ohne plugin

Grenzen

Was diese Probe nicht abdeckt, steht hier, damit niemand mehr erwartet:

  • lokale Kopie mit SQLite statt MySQL und php -S; WooCommerce laeuft dort, ist aber offiziell fuer MySQL/MariaDB gebaut - beim Kunden auf dessen Staging-Kopie nachpruefen
  • Steuern aus und virtuelle Produkte: Rabatt vor/nach Steuer und Versandregeln sind nicht Teil der Probe
  • Regel als Gebuehr im Warenkorb (klassischer und Block-Checkout rechnen beide ueber den Warenkorb); Zahlungsanbieter, echte Bestellungen und E-Mails nicht geprueft - kein Konto, keine Zahlung
  • Shopify/andere Shopsysteme sind eine andere Faehigkeit (shop)

Der Plugin-Code

<?php
/**
 * Plugin Name: GL Mengenrabatt
 * Description: Mengenrabatt je Warenkorbzeile fuer eine Produktkategorie (Staffeln in der Option gl_mengenrabatt).
 * Version: 1.0.0
 * Requires Plugins: woocommerce
 * Author: GL Tools
 * License: GPL-2.0-or-later
 */
if (!defined('ABSPATH')) { exit; }

register_activation_hook(__FILE__, function () {
    add_option('gl_mengenrabatt', wp_json_encode(array('kategorie' => 'kaffee', 'staffeln' => array(array(3, 10), array(5, 15)))));
});

function gl_mengenrabatt_regel() {
    $r = json_decode((string) get_option('gl_mengenrabatt', ''), true);
    $kategorie = (is_array($r) && !empty($r['kategorie'])) ? sanitize_title($r['kategorie']) : 'kaffee';
    $staffeln = array();
    foreach ((is_array($r) && isset($r['staffeln']) && is_array($r['staffeln'])) ? $r['staffeln'] : array() as $s) {
        if (is_array($s) && count($s) >= 2 && (int) $s[0] > 0 && (float) $s[1] > 0 && (float) $s[1] < 100) {
            $staffeln[(int) $s[0]] = (float) $s[1];
        }
    }
    krsort($staffeln);  // groesste Menge zuerst: die erste passende Staffel gilt
    return array($kategorie, $staffeln);
}

function gl_mengenrabatt_satz($menge, $staffeln) {
    foreach ($staffeln as $ab => $prozent) {
        if ($menge >= $ab) { return $prozent; }
    }
    return 0.0;
}

add_action('woocommerce_cart_calculate_fees', function ($cart) {
    if (is_admin() && !wp_doing_ajax() && !(defined('REST_REQUEST') && REST_REQUEST)) { return; }
    list($kategorie, $staffeln) = gl_mengenrabatt_regel();
    if (!$staffeln) { return; }
    $rabatt = 0.0;
    foreach ($cart->get_cart() as $zeile) {
        $produkt_id = (int) $zeile['product_id'];  // bei Varianten das Elternprodukt - dort haengt die Kategorie
        if (!has_term($kategorie, 'product_cat', $produkt_id)) { continue; }
        $satz = gl_mengenrabatt_satz((int) $zeile['quantity'], $staffeln);
        if ($satz > 0) {
            $rabatt += round((float) $zeile['line_subtotal'] * $satz / 100, wc_get_price_decimals());
        }
    }
    if ($rabatt > 0) {
        $cart->add_fee(__('Mengenrabatt', 'gl-mengenrabatt'), -$rabatt, false);
    }
});

So etwas für deinen Betrieb?

Beschreib kurz, was du brauchst. Du bekommst einen Festpreis, bevor ich anfange; ohne dein Ja passiert nichts.

Zur Werkstatt