WooCommerce variables Produkt, Probleme bei vielen Varianten

WooCommerce ist ein Shop-System Plugin für WordPress. Variable Produkte in WooCommerce sind Produkte, die in verschiedenen Ausführungen verfügbar sind.

Etwa ein bestimmtes T-Shirt Motiv, das in 9 Grössen und Zweifarben-Design erhältlich ist. Jede der beiden Farben kann frei aus 40 verschiedenen Farbtönen gewählt werden. Dadurch ergibt sich für dieses eine T-Shirt Produkt die Menge von 14.400 möglichen Produktvarianten (9 Größen * 40 Farbe1 * 40 Farbe2).

In WooCommerce würde dieses T-Shirt Produkt als “variables Produkt” definiert, und unter “Eigenschaften” die 9 Größen und die je 40 Farbe1 und Farbe2 eingetragen. Anschliessend kann unter “Varianten” ausgewählt werden “Generiere Varianten aus allen Attributen”, dies erzeugt automatisch alle kombinatorisch möglichen Varianten.

Dies ist sehr praktisch und funktioniert einwandfrei, solange die Menge der möglichen Varianten klein ist (etwa 3 Größen * 3 Farbe1 * 3 Farbe2 = 27). Mit 14.400 Varianten funktioniert das alles andere als gut. Das ist mathematisch die kombinatorische Explosion, die irgendwo im WooCommerce Programm-Code zuschlägt.

Die “normale” Vorgehensweise

Die sehr nützliche Option “Generiere Varianten aus allen Attributen” ist per Default auf 50 Varianten pro Durchlauf beschränkt. Dies geschieht sicher aus gutem Grund, je mehr Varianten in einem Rutsch erzeugt werden, desto mehr Speicher und Ausführungszeit werden benötigt, und das kann auf schwach ausgestatteten Servern zu Ausführungsfehlern und evtl. Dateninkonsistenz führen.

Wenn unser Besipiel T-Shirt 4 Größen * 4 Farbe1 * 4 Farbe2 = 64 Varianten hat, werden mit dem Aufruf von “Generiere Varianten aus allen Attributen” die ersten 50 Varianten erzeugt. Ein erneuter Aufruf erzeugt dann die restlichen 14. Soweit gut.

14.400 Varianten in 50er Häppchen zu erzeugen erfordert die Geduld für 288 einzelne Klicks. Must be a better way..

Hacking WooCommerce

Ein wenig Google-Suche und WooCommerce Code lesen führt zu der Variable WC_MAX_LINKED_VARIATIONS, welche bestimmt wie viele Varianten pro “Generiere Varianten” Aufruf erzeugt werden (Default 50). Vorausgesetzt dass die PHP Variablen memory_limit und max_execution_time großzügig gesetzt sind, kann die Variable WC_MAX_LINKED_VARIATIONS deutlich erhöht werden. Ich habe sie auf 3000 gesetzt, indem ich die folgende Zeile systemweit zu wp-config.php hinzugefügt habe.

define( 'WC_MAX_LINKED_VARIATIONS', 3000 );

Das hat schon mal 3.000 von 14.400 Varianten erzeugt und etwa 30min gedauert. Die nächten Portionen von 3.000 Varianten dauerten zunehmend länger, aber mit 5 Klicks und alle 1-2h nachschauen waren alle Varianten erzeugt. Übrigens meldet das Popup-Fenster weiterhin “Sie erzeugen 50 Varianten, weiter?”, obwohl tatsächlich 3.000 pro Durchlauf erzeugt werden.

Funktioniert leider nicht

Alle Varianten waren im Produkt-Menu sichtbar und konnten bearbeitet werden (z.B. Preis für alle setzen). Sie tauchten auch korrekt auf der für Kunden sichtbaren Produkt-Seite auf und konnten mit HTML Auswahlfeldern gewählt werden.

Allerdings erschien nach jeder ausgewählten Farbkombination nicht wie erwartet der Produkt-Preis, sondern ein Hinweis “dieses Produkt ist nicht lieferbar”. Auch nach expliziter Prüfung, ob für einzelne Varianten der Preis gesetzt und die Variante aktiv ist sowie ob Bestandsmengen Einstellungen im Weg sind, liess sich dieses Problem nicht lösen. Eine Google-Suche lieferte einige, teils obskure Ideen, aber ebenfalls keine funktionierende Lösung.

Die grosse Menge von Varianten scheint irgendwelche Programm-Limits zu sprengen.

Update 13.2.2016: Update auf WooCommerce 2.5.2 behob das Problem

Das scheint ein WooCommerce Bug gewesen zu sein, nach Update auf das aktuelle WooComerce 2.5.2 funktionierte alles genau wie es sollte.