WooCommerce — Checkout nicht möglich — Keine Errors
“Bestellung konnte nicht erstellt werden”
Die Lösung findet sich am Ende des Artikel. Die Vorgeschichte dazu beginnt jetzt! Der Auftrag lautete: Datenmigration aus einer WordPress Instanz von Server A auf Server B, wobei dort ein frisches und aktuelles WordPress auf den Datenempfang wartete. Ziel war es, nur die die Beitrags- und Seiteninhalte sowie die Metadaten zu transferieren, den Rest jedoch ruhen zu lassen. Die Datenbank der alten Seite war generisch gewachsen und beinhaltete viele Datenleichen. Auf der neuen Instanz sollten nur die tatsächlich relevanten Daten ihren Platz finden.
Also, ran ans Werk. Mit Bordmitteln von WordPress war ein Datenbankexport undenkbar, denn etwa 1000 Beiträge hatten sich dort verewigt und der Hoster sorgte dafür, dass komplexe Anfrage in Timeouts resultierten. Also doch mit anderen Tools und partiell — Das glückte.
Ein neues WordPress, welches aktuellen Standards — z.B. Salting der Keys — entspricht, hatte ich auf dem Zielsystem bereits eingerichtet und importierte den Haufen an Daten in die neue Datenbank. Auch dies gelang und das Ergebnis sah in dem neuen Theme ansprechend aus. Top!
Nach wenigen Handgriffen war der Blog an sich einsatzbereit. Der Kunde wollte zusätzlich einen WooCommerce Shop integriert haben, da der alte Strato Shop weder modern, schnell noch responsive war. Und außerdem ist es sowieso ratsam, Blog und Shop miteinander zu verzahnen, um die Synergien zur Bestellmaximierung zu nutzen. Also wurde WooCommerce plus Germanized implementiert. Der Kunde wollte sich um die Artikelpflege selber kümmern.
Zwei Wochen geschah im Shop nichts. Doch irgendwann wurde auch dieser angegangen und mit den ersten Produkten gefüllt. Ich unterstützte bei der Erstellung von Produktvorlagen und bei der Grundkonfiguration von WooCommerce. Als dann die Implementierung von Paypal Plus im Checkout getestet werden sollte, tauchte die mir bis dato unbekannte Meldung “Die Bestellung konnte nicht erstellt werden” nach dem Klick auch “Kaufen” auf.
Routinemäßig überprüfte ich jegliche Parameter, die den Bestellvorgang behindern können. Aber es war alles in Ordnung. PHP Version aktuell, SQL System ebenfalls, auch die Permalinks, die bei Fehlkonfiguration manchmal zu Problemen führen, waren korrekt gesetzt. Im nächsten Schritt ging es ans Debuggen. Jedoch… gab es nichts zum Debuggen. Weder die Konsole warf Exeptions, noch wurden Logs generiert, die einen Hinweis auf den Fehler hätten liefern können. Das war tatsächlich schon recht seltsam.
Wie findet man einen Fehler, der anscheinend gar kein Fehler ist? Der Verdacht, dass das eingesetzte Theme den Bestellvorgang blockierte, wurde schnell aufgelöst, nachdem ich zwei Standardthemes zu Testzwecken nutzte — Gleicher “Fehler”. Ich fühlte mich ein wenig, wie der bekannte Ochs vorm Berge.
Googlerecherche brachte mich nicht weiter, ebenso wenig wie das sequentielle Abschalten von Plugins, also ging ich tiefer in die Analyse und schaute mir den Quelltext des Checkout Prozesses von WooCommerce an.Nachdem ich verstanden habe, das WooCommerce Daten in die wp_posts Tabelle speichert und unter anderem durch die Funktion wc_generate_order_key() Werte in das Feld “post_password” übergibt, musste der Taschenrechner ran. Denn post_password kann maximal 20 Zeichen aufnehmen, während die Funktion wc_generate_order_key() minimal 22 Zeichen übergibt.
Und exakt an dieser Stelle kommt es zu dem initial genannten Problem: Die Bestellung kann nicht erstellt werden, da die Funktion mindestens 22 Zeichen versucht zu übergeben und zwar an ein Feld, das maximal 20 Zeichen speichern kann. Das läuft schief und wird leider nicht durch eine Exception aufgefangen, so dass man ratlos in der Gegend steht. Das Problem kommt nur dann zustande, wenn man Tabellen aus einem älteren WordPress Systen (< Version 4.8) in ein aktuellen migriert.
Die Lösung für das “Unable to create order. Please try again”-Problem
… ist eine einfache, wenn man weiß, woran man drehen muss. In diesem Fall muss man in der Tabelle wp_posts die Feldlänge von post_password auf 255 anpassen.
Etwas genauer: Die Datenbank via phpmyadmin o.ä. aufrufen, die Tabelle wp_posts selektieren und dann die Tabellenstruktur bearbeiten. Anschließend nach dem Feld post_password Auschau halten, es editieren und die 20 Zeichen durch 255 ersetzten.
Fertig. Die Bestellungen sollten nun wie gewohnt kreiert werden.