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
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.