Zum Inhalt springen Zur Seitenleiste springen

Dieses Thema ist gelöst. Hier finden Sie eine Beschreibung des Problems und der Lösung.

Problem:
Der Kunde berichtete über Probleme mit automatisch abgeschlossenen Bestellungen in Fremdsprachen seit einem Update von WCML. Bestellungen in der Primärsprache (DE) wurden korrekt abgeschlossen, während Bestellungen in anderen Sprachen nicht korrekt verarbeitet wurden, einschließlich fehlender Bestellnotizen und Trackingnummern.
Solution:
Wir konnten das Problem auf einer neuen Test-Site nicht bestätigen und empfehlen in solchen Fällen, eine Staging-Umgebung zu erstellen und alle Plugins außer WooCommerce, Klarna for WooCommerce, WPML und unseren Add-Ons zu deaktivieren, um das Problem zu isolieren. Wenn das Problem behoben ist, aktivieren Sie die Plugins einzeln oder in kleinen Gruppen, um den Konflikt zu identifizieren. Sollte das Problem weiterhin bestehen, wechseln Sie zu einem Standardthema wie Twenty Twenty-One, um festzustellen, ob das Thema die Ursache ist. Wir bieten Unterstützung beim Einrichten einer Testumgebung, falls erforderlich.

Bitte beachten Sie, dass diese Lösung möglicherweise veraltet oder nicht auf Ihren Fall zutreffend ist. In diesem spezifischen Fall handelt es sich um ein Problem in WooCommerce, welches bereits an deren Entwicklerteam weitergeleitet wurde. Wir empfehlen zudem dringend, die bekannten Probleme zu überprüfen, die Version der dauerhaften Lösung zu bestätigen und sicherzustellen, dass Sie die neuesten Versionen von Themes und Plugins installiert haben. Wenn das Problem weiterhin besteht, eröffnen Sie bitte ein neues Support-Ticket.

Dies ist das technische Support-Forum für WPML – das mehrsprachige WordPress-Plugin.

Mitlesen können alle, doch nur WPML-Kunden können hier Fragen veröffentlichen. Das WPML-Team antwortet im Forum an 6 Tagen pro Woche, 22 Stunden am Tag.

Schlagwörter: 

Dieses Thema enthält 22 Antworten, hat 0 voices.

Zuletzt aktualisiert von Robert Rosanke Vor 1 Woche.

Assistiert von: Andreas W..

Autor Beiträge
September 26, 2025 um 12:10 p.m. #17435892

Robert Rosanke

Background of the issue:
Hallo.

Habe gerade im Rahmen einer anderen Thematik die letzten Bestellungen und die Datenbank untersucht.
Dabei ist mir folgendes aufgefallen:

- Bestellungen, die seit dem 18.07. und später auf abgeschlossen gehen und deren Kundensprache != DE (unsere Primärsprache) ist, weisen Fehler / Unvollständigkeiten beim automatischen Abschließen von Bestellungen auf.
- Alle Zahlungsmethoden betroffen: z.B. PayPal, Stripe, Vorkasse.
- in den Logfiles konnte ich keine Fehler sehen.
- interessant: Wir haben am 17.07. Plugin-Updates durchgeführt und bei dem Übersetzungstool WCML gibt es folgenden Eintrag im Changelog: < href="https://wpml.org/download/wpml-multilingual-multicurrency-for-woocommerce/?section=changelog#:~:text=WooCommerce%2010.0%3A%20Fixed%20an%20edge%20case%20where%20an%20order%20in%20a%20secondary%20language%20with%20%E2%80%9Con%2Dhold%E2%80%9D%20status%20did%20not%20trigger%20the%20email%20notification%20when%20changed%20to%20%E2%80%9Ccomplete%E2%80%9D.">WooCommerce 10.0: Fixed an edge case where an order in a secondary language with “on-hold” status did not trigger the email notification when changed to “complete”. Das sieht für mich sehr relevant aus. Darum öffne ich hier ein Ticket.
- Andere Plugins haben keine relevanten Einträge.
- Wenn man eine Bestellung manuell abschließt, klappt alles. Scheinbar besteht der Fehler nur bei automatisch abgeschlossenen Bestellungen, in denen ein Webhook von unserem System "Billbee" an den Shop gesendet wird. Billbee pingt den Shop via REST-API an, wenn eine Bestellung versendet wird, der Shop stellt dann auf Status="abgeschlossen".

Wir haben einige Automatisierungen, die an dem order completed event hängen.
Es wäre super, wenn wir das Thema asap prüfen und fixen können.

Hier der Vollständigkeit halber eine Liste aller Updates, die wir am 17.07. durchgeführt haben:
- Borlabs Cookie: 3.3.11 → 3.3.12
- Carousel Slider Block: 2.0.1 → 2.0.2
- German Market: 3.49 → 3.50
- Two Factor: 0.13.0 → 0.14.0
- WooCommerce: 9.9.5 → 10.0.2
- WooCommerce Gift Cards: 2.6.0 → 2.6.1
- WooCommerce Multilingual & Multicurrency: 5.4.5 → 5.5.1
- WooCommerce PayPal Payments: 3.0.6 → 3.0.7
- WooCommerce Stripe-Gateway: 9.5.3 → 9.6.0
- WPML SEO: 2.1.1 → 2.2.1
- WP Rocket: 3.19.0.1 → 3.19.1.2
- Yoast SEO: 25.3.1 → 25.5

Davon scheint mir nach lesen der Changelogs nur WCML interessant genug, um ein Ticket zu eröffnen.

Symptoms:
- Bestellungen mit wpml_language=de werden korrekt behandelt: Status = abgeschlossen, folgende Aktionen werden - wie erwartet - ausgeführt. z.B.: tracking nummer importiert, emails werden gesendet, Bestellnotizen sind vollständig
- Bestellungen mit wpml_language!=de werden nicht korrekt behandelt: Status= abgeschlossen, folgende Aktionen werden nicht ausgeführt. Keine Bestellnotiz über die Statusänderung "processing" => "completed", kein Trackingnummer-Import, nichts.

Fatale Fehler konnten wir in den Logs nicht finden.
Scheinbar / Vermutlich werden nicht alle hooks korrekt ausgeführt / getriggert, wenn eine Fremdsprachige Bestellung via Webhooks / WooCommerce REST-API abgeschlossen wird.

Questions:
Für mich wäre, bevor wir etwas anfassen, sehr wichtig zu verstehen:
Was habt ihr konkret zwischen WCML 5.4.5 und 5.5.1 geändert, das dieses Problem verursachen könnte?
Was war das konkrete Problem, das ihr laut Changelog fixen wolltet/gefixt habt und was hat sich konkret in WCML geändert, das Einfluss auf diese aktuellen Probleme haben kann? (Ihr könnt mir gerne Code senden.)

Grüße
Robert

September 26, 2025 um 4:36 p.m. #17436854

Andreas W.
WPML-Unterstützer seit 12/2018

Sprachen: Englisch (English ) Spanisch (Español ) Deutsch (Deutsch )

Zeitzone: America/Lima (GMT-05:00)

Hallo,

Ich kann leider nicht sagen, was konkret verändert wurde, da der First Tier Support nicht direkt an der Entwicklung beteiligt ist. Anscheinend wurde nur ein Bug behoben, durch den die entsprechende E-Mail bei einem bestimmten Status nicht gesendet wurde.

Die Ursache des Problems auf deiner Website könnte ebenfalls im Zusammenhang mit einem anderen Plugin oder gar verwendetem Custom Code im Child Theme stehen.

WICHTIG:
Bevor ein Fehler an unser System berichtet wird, sollte sichergestellt werden, ob das Problem mit den aktuellen Versionen von WordPress, Theme und Plugins bestehen bleibt.

Bitte installiere die aktuellsten Versionen unserer Plugins unter Plugins > Neu installieren auf dem Reiter "Kommerziell". Klicke auf "Nach Updates suchen" und installiere die aktuellsten Versionen.

Sollten für das Parent Theme und andere Plugins ebenfalls Updates verfügbar sein, dann führe diese bitte aus und teste danach erneut, ob das Problem bestehen bleibt.

Verifiziere bitte auch, ob sich das Problem mit einer komplett neuen Bestellung nach den Updates bestätigen lässt.

Mit freundlichen Grüßen
Andreas

September 29, 2025 um 1:54 p.m. #17441342

Robert Rosanke

Hallo Andreas,

habe einmal alle Updates installiert, die ich installieren kann.
Was breaking changes hat, habe ich ausgelassen.
Für Tiefenprüfungen und ggf. Anpassungen auf unserer Seite habe ich jetzt keine Zeit.

Gebe dir in ein bis zwei Tagen Rückmeldung, ob es eine Verbesserung gibt.

September 30, 2025 um 7:08 p.m. #17446342

Andreas W.
WPML-Unterstützer seit 12/2018

Sprachen: Englisch (English ) Spanisch (Español ) Deutsch (Deutsch )

Zeitzone: America/Lima (GMT-05:00)

Hallo,

Sollte das Problem nach den Updates weiterhin bestehen, kann ich gerne anbieten, mir das einmal genauer anzusehen.

Ich möchte dazu einen temporären Zugriff (wp-admin und FTP) auf die Website anfordern, um das Problem genauer zu untersuchen.

Die dafür erforderlichen Felder findest du unterhalb des Kommentarbereichs, wenn du dich anmeldest, um die nächste Antwort zu hinterlassen. Die Informationen, die Du angibst, sind privat, was bedeutet, dass nur Du und ich sie sehen und darauf zugreifen können.

WICHTIG
Lege bitte unbedingt eine Sicherungskopie der Website und der Datenbank an, bevor du uns den Zugriff gewährst.
Wenn Du die Felder "wp-admin / FTP" nicht sehen kannst, werden deine Anmeldedaten für Post und Website als "PUBLIC" (Öffentlich) festgelegt. Veröffentliche die Daten NICHT, es sei denn, du siehst die erforderlichen wp-admin / FTP-Felder.

Ich muss hier ggfls. ein Plugin namens "All In One WP Migration" installieren, um eine Kopie der Website anzulegen, auf die ich das Problem genauer untersuchen kann.

Ich wäre allerdings auch sehr dankbar, wenn Du zu diesem Zweck selbst eine Staging Site, bzw. Kopie der Website von deinem Server aus bereitstellen könntest.

Bei Fragen zum Erstellen einer solchen Staging Site kannst du deinen Hosting-Anbieter konsultieren. Achte bitte darauf, dass WPML auf diesem Staging ebenso unter https://wpml.org/de/account/websites/ registriert sein muss.

Solltest du dazu nicht in der Lage sein, eine solche Kopie der Website zum Testen bereitzustellen, dann lass es mich bitte auf diesem Ticket wissen.

Das private Antwortformular sieht folgendermaßen aus:
versteckter Link

Klicke beim nächsten Mal auf "I still need assistance".

Video:
versteckter Link

Beachte bitte, dass wir verpflichtet sind, diese Informationen auf jedem Ticket individuell anzufordern. Wir dürfen nicht auf Zugangsinformationen zugreifen, die nicht speziell auf diesem Ticket im privaten Antwortformular übermittelt wurden.

Mit freundlichen Grüßen
Andreas

Oktober 3, 2025 um 1:45 p.m. #17454590

Andreas W.
WPML-Unterstützer seit 12/2018

Sprachen: Englisch (English ) Spanisch (Español ) Deutsch (Deutsch )

Zeitzone: America/Lima (GMT-05:00)

Du sagst:

Bitte keine Plugins auf der Testseite, zu der ich die Zugang gebe, aktivieren oder deaktivieren.
Testbestellungen bitte immer nur per Vorkasse.

Auf diese Weise kann ich leider nicht testen.

Ich kann anbieten, ein Plugin zu installieren, um eine lokale Kopie zum Testen anzulegen. Wäre das in Ordnung?

Oktober 6, 2025 um 4:07 p.m. #17461431

Robert Rosanke

Hallo Andreas,

bitte antworte erstmal auf meine Fragen aus dem Eingangspost.
Notfalls Frage bitte die Entwickler.

Aktuell ist meine Vermutung, dass es mit dem WCML Update zusammenhängt. Wir wissen es jedoch nicht nicht sicher,
Ein bisschen Info für mehr Übersicht wäre hilfreich.

Für mich wäre, bevor wir etwas anfassen, sehr wichtig zu verstehen:
Was habt ihr konkret zwischen WCML 5.4.5 und 5.5.1 geändert, das dieses Problem verursachen könnte?
Was war das konkrete Problem, das ihr laut Changelog fixen wolltet/gefixt habt und was hat sich konkret in WCML geändert, das Einfluss auf diese aktuellen Probleme haben kann? (Ihr könnt mir gerne Code senden.)

Das Ausmaß der Problematik ist größer als angenommen.
Es werden nicht nur keine Emails bei betroffenen Bestellungen versendet, sondern auch Zahlungen werden nicht gecaptured, z.B. bei Klarna.
Das ist alles nicht gut.
Alle callbacks / Automatisierungen, die auf woocommerce_order_status_completed laufen, laufen seit dem Update scheinbar auch nicht, wenn order lang !== DE.

Ich monitore das bis morgen, um ggf. mehr Kontext zu erhalten, und gebe dir asap ein Update, damit wir möglichst viele Infos zum Ist-Zustand und möglichen Ursachen zusammenbekommen.

Bitte gib mir auch eine grobe Übersicht, wie du den Fehler testen und prüfen möchtest.
Wie ist deine geplante Vorgehensweise - grob zusammengefasst?

Wir haben seit WPML 4.7 ständig öfter als vor 4.7 Fehler / Bugs und verbringen einen großen haufen Zeit mit WPML, mehr als uns eigentlich lieb ist.

Eventuell kann ich ein paar Tricks mitnehmen, um künftig bessere Tickets für dich zu schreiben oder selber Lösungen zu finden, sodass wir bei WPML-Themen live schneller wieder ohne Fehler unterwegs sind.

Oktober 7, 2025 um 11:42 a.m. #17463566

Andreas W.
WPML-Unterstützer seit 12/2018

Sprachen: Englisch (English ) Spanisch (Español ) Deutsch (Deutsch )

Zeitzone: America/Lima (GMT-05:00)

Was in WCML verändert wurde, kann man im Changelog einsehen:
https://wpml.org/de/download/wpml-multilingual-multicurrency-for-woocommerce/?section=changelog

---

Solche Probleme sind nicht selten und treten oft dann auf, wenn ein Konflikt zwischen WooCommerce, WPML und einem weiteren WooCommerce-Addon vorkommt.

Zum Beispiel könnte ein Problem mit den E-Mails im Zusammenhang mit KadenceWoocommerce Email Designer stehen.

Ein Problem mit Klarna-Zahlungen könnte damit in Verbindung stehen, dass ein Addon verwendet wird, das bislang nicht mit WPML kompatibel ist. Zum Beispiel handlet es sich hier um das Addon: versteckter Link

Es könnte soagr sein, dass das Custom Plugin "webfluence Anpassungen" Probleme macht. Ich hatte mit diesem Plugin bereits zuvor Probleme auf der Website.

---

Könntest Du bitte eine Kopie, bzw. ein Staging der Website anlegen und versuchen, die Website mit minimalem Setup auszuführen, um festzustellen, ob das Problem weiterhin besteht?

1) Deaktiviere alle zusätzlichen Plugins, bis auf WooCommerce, Klarna for WooCommerce, WPML und unsere Add-Ons. Teste nun erneut. Bleibt das Problem bestehen?

2) Sollte das Problem verschwinden, beginne damit, die Plugins einzeln zu reaktivieren, oder aktivieren Sie sie in kleinen Gruppen. Überprüfe auf diese Weise, an welchen Stellen das Problem erneut auftritt, um das Plugin anzuzeigen, das das Problem verursacht.

3) Wenn dies die Ursache des Problems nicht geklärt hat, wechsel bitte zu einem Standardthema wie Twenty Twenty-One, um zu sehen, ob das Problem möglicherweise mit dem Thema zusammenhängt.

Sobald wir die Ursache identifizieren konnten, können wir dann versuchen das Problem zu replizieren und dann intern zu eskalieren. Ich stelle in diesem Fall eine Test-Site mit WPML zur Verfügung.

Solltest Du nicht in der Lage sein, eine Kopie Deiner Website aufzusetzen, dann gib mir bitte Bescheid und ich unterstütze Dich dabei gerne.

Oktober 9, 2025 um 5:40 p.m. #17472357

Robert Rosanke

Hallo Andreas,

ich konnte den Fehler durch Monitoring der betroffenen REST-Requests und zusätzlichem Logging finden und feststellen.

Es ist Zeit, das Ticket an eure Entwickler zu eskalieren!

Auch möchte ich festhalten, dass ich euren changelog-Eintrag "WooCommerce 10.0: Fixed an edge case where an order in a secondary language with “on-hold” status did not trigger the email notification when changed to “complete”." weiterhin für sehr relevant halte. Es schlägt in ein ähnliche Kerbe.
Und der von mir beobachtete Fehler ist ebenfalls ein Thema von WooCommerce 10.0.x - ab dieser Version von WooCommerce beginnt das Chaos.
Dazu gleich mehr.

Zusammenfassung des Fehlers
Siehe ersten Post zu dem Ticket, dort steht bei Symptoms das wichtigste drin.

- REST-Request von externer Maschine an PUT wc/v3/orders/:id, Status einer fremdsprachigen Bestellung soll geändert werden
- Bestellstatus wird geändert und auch gespeichert, jedoch werden die dazugehörigen order-status-Hooks, z.B. woocommerce_order_status_completed, von WooCommerce niemals ausgeführt. Das ist das Problem, weil damit Automatisierungen ausfallen und Zahlungen z.T. nicht gecaptured werden.
- REST-Response = Code 200

Von außen sieht alles okay aus, da es einen 200er zurückgibt.
Man merkt erst, das etwas nicht stimmt, weil z.B.:
- keine Klarna-Rückerstattungen mehr möglich sind
- wichtige order-meta fehlt, die bei gewissen status-hooks eigentlich hinzugefügt würde
- Bestellnotizen fehlen, die eigentlich bei order-complete hinzugefügt werden
- Kunden keine Emails mehr erhalten, wenn der Status einer betroffenen Bestellung via REST geändert wird

Automatisierungen fallen auch aus, wenn diese an einen order-status geheftet sind - was oft der Fall ist.

Es funktioniert kaum noch etwas bei betroffenen Bestellungen und niemand kriegt es zeitnah mit, weil es keine aktive Warnung vom System gibt, dass z.b. ein ungewöhnlich hoher Anteil an Bestellungen die status-hooks nicht getriggert haben.

Hintergrund des Fehlers
Meine Beobachtung: Seit WooCommerce 10.0.x ist WCML nicht mehr vollständig kompatibel, was das verarbeiten von fremdsprachigen Bestellungen (z.B. via REST-API) angeht.

Folgender Pull-Request für WooCommerce zeigt die Stelle, an der die Inkompatibilität entstanden ist:
versteckter Link

WooCommerce hat eine Änderung beim Speichervorgang von Bestellungen gemacht, die euch vermutlich durchgerutscht ist. Dadurch kommt es nun seit Wochen zu dem Fehlverhalten, wenn man WCML nutzt.

Ich habe den WCML-Code zurückverfolgt, um dies zu bestätigen, und die Ausgabe von get_changes() intern protokolliert.

Bei allen Bestellungen in Fremdsprachen führt der woocommerce_order_get_items-Filter von WCML zu einem für WooCommerce unerwarteten Ergebnis bei der get_changes()-Prüfung, und der gesamte Code-Block, der so wichtig ist, wird nicht über REST-Anfragen bei fremdsprachigen Bestellungen ausgeführt:
versteckter Link

Aktionen im WP-Admin und Bestellauslösungen via Checkout sind nicht betroffen.
REST-Requests sind das Problem.

Wie reproduzieren?
Es wird reproduzierbar, wenn man von einem externen Maschine einen Request an PUT wc/v3/orders/:id macht und dort z.B. einfach nur den Status einer fremdsprachigen Bestellung ändert und noch ein paar Metadaten mit an die order. anhängt Also payload z.B. ['status' => 'completed'|'processing', metadata: [....]].

In unserem Fall haben wir Webhooks in WooCommerce für order.create und order.update registriert, um Billbee anzupingen.
Billbee pingt uns an - authentifiziert über die webhook-secrets - wenn Zahlungen einiger Methoden erfasst oder Versendet wurde.
(Wir haben fast ausschließlich Gastbestellungen ohne Kundenkonto, falls das relevant ist.)

Ich empfehle zur Fehlernachstellung folgenden logpoint in woocommerce/includes/class-wc-order.php, direkt vor dem if-block in protected function status_transition() anzulegen und dann ein paar Testbestellungen via REST von einer externen Maschine aus zu ändern:

$wfa_logger = wc_get_logger();
$wfa_logger->info(json_encode([
    'action' => 'status_transition',
    'order_id' => $this->get_id(),
    'status_transition' => $status_transition,
    'order_items_persisted' => $order_items_persisted,
    'order_persisted' => $order_persisted,
    'items_to_delete' => is_array($this->items_to_delete) ? array() === $this->items_to_delete : null,
    'item_changes' => array() === array_filter(
        $this->get_items(),
        static function ($item) {
            return array() !== $item->get_changes();
        },
    ),
    'item_changes_debug' => array_map(
        fn($item) => [$item->get_id(), $item->get_name(), $item->get_changes()],
        $this->get_items()
    ),
    'should_update_status' => $status_transition && $order_persisted && $order_items_persisted,
]), ['source' => 'wfa-order-status-transition']);

Unter WooCommerce » Status » Protokolle findet man dann die Ergebnisse.

Das Problem im Detail
Die Überprüfung von get_changes() für die Variable $order_items_persisted in dem verlinkten pull-request ergibt beim Fremdsprachigen Bestellungen immer falsch, da WCML die Produkt-IDs bei einem REST-Request von außerhalb in die Basis-Shop-Sprache konvertiert und get_changes() daher niemals leer ist.

Das passiert in dem woocommerce_order_get_items-Filter-Callback von WCML.
Hier die Problematische Stelle von WCML nachverfolgt:
- wp-content/plugins/woocommerce-multilingual/classes/OrderItems/Hooks.php
- getOrderItems() -> translateOrderItems() -> translateLineItem()

Standardmäßig werden die order-items von WooCommerce in der original-Bestellsprache abgerufen. Wir können das durch Logging nachverfolgen.
WCML ändert dann die Produkt-Ids über den oben genannten Filter-Callback, was das unerwartete Verhalten erzeugt.

Hier mal ein Auszug aus den Logs von einem REST-Request von Billbee an WooCommerce zu einer Fremdsprachenbestellung, das macht es deutlich:

{
  "action": "status_transition",
  "order_id": 60287,
  "status_transition": {
    "from": "processing",
    "to": "completed",
    "note": "",
    "manual": false
  },
  "order_items_persisted": false,
  "order_persisted": true,
  "items_to_delete": true,
  "item_changes": false,
  "item_changes_debug": {
    "57784": [
      57784, // produkt-id Fremdsprache, wie WooCommerce sie abruft
      "geht die Öffentlichkeit nichts an",
      {
        "product_id": 1370, // produkt-id Deutsch, während dem get_items()-Call übersetzt von WCML
        "variation_id": 1373, // produkt-id Deutsch, während dem get_items()-Call übersetzt von WCML
        "name": "geht die Öffentlichkeit nichts an"      }
    ]
  },
  "should_update_status": false
}

Wenn ihr euch zusätzlich noch einen callback / logpunkt auf woocommerce_order_status_completed mit prio = 1 legt, dann seht ihr, dass dieser bei fremdsprachigen Bestellungen via REST API niemals ausgeführt wird.
Bei Bestellungen in original-Shopsprache klappt es zuverlässig und immer.

Liegt an dem if-block der nie ausgeführt wird, wegen der get_items/get_changes-Prüfung.

Es fallen also nicht nur die order-completed, sondern (höchstwahrscheinlich) auch alle anderen hooks aus, wenn der Order-Status einer fremdsprachigen Bestellung via REST-API geändert wird. Statusänderung {"from":"pending","to":"processing"} konnten wir ebenfalls als betroffen loggen.

Das ist schlecht. Daran hängen Automatisierungen und Zahlungsdienstleister.

Ausmaß des Problems
Wir müssen viele Bestellungen nacharbeiten, z.B. Klarna, weil Zahlungen nicht gecaptured wurden. Bitte dieses Ticket als Prio-Ticket behandeln.

Es könnten, ohne es zu wissen, auch viele andere Shops betroffen sein.
Wir haben nur durch Zufall bemerkt, das etwas nicht stimmt, weil wir keine Rückerstattungen mehr durchführen konnten.
Im normalen betrieb eines weitgehend automatisierten shops merkt man nicht, dass order-status-hooks ausfallen, wenn es keine Warnung gibt.

Es ist an der Zeit, das Ticket zu eskalieren.
Eure Entwickler sollten das prüfen und asap lösen.

Eventuell solltet ihr direkt mit WooCommerce eine Lösung finden.
Deren Pull-Request scheint unerwünschte Nebenwirkungen mit euren Systemanpassungen zu haben.

Der scope ist potentiell größer, da jeder WPML-Nutzer mit einem single-domain-setup, der Bestellungen über ein externes System bearbeiten lässt, betroffen sein kann.
Wer auf Automatisierung setzt, hat seit WC 10.0.x ein Problem, wenn er WCML nutzt.

Für die WPML/WCML-Entwickler
Meiner Meinung nach ergeben sich folgende Themen für eure Entwickler oder/und den Austausch mit WooCommerce:

1. Der oben verlinkte Pull-Request für WC 10.0.x führt unerwartetes Verhalten für alle Programmierer, nicht nur WPML, ein: Ein Bestellstatus wird geändert und gespeichert. Jedoch werden die dazugehörigen status-changed-hooks nicht ausgeführt, wenn die get_changes-Prüfung nicht leer ist. Das ist unerwartet. Erwartet ist: Wenn ein status wechselt, werden grundsätzlich auch alle dazugehörigen hooks ausgeführt. Bei einer Statusänderung sollte gelten: Ganz oder gar nicht. Nur so können Fehler auch sinnvoll auffallen.

Würden alle unsere Fremdsprachenbestellungen der letzten Wochen nicht abgeschlossen sein, weil die hooks nicht feuern, hätten wir das Problem viel eher mitbekommen. Dadurch, dass es aktuell nicht transaktional verarbeitet wird, fällt es nicht auf.

2. get_items-Filter / get_changes-Prüfung: Angenommen andere Plugins prüfen mal etwas mit get_changes in einem Rest-Request - Es wird false-positive geben, weil WCML Produkt-Ids austauscht. Eventuell gibt es eine Möglichkeit, die Funktion ein korrektes Ergebnis zurückgeben zu lassen oder nicht in die Bestellungen einzugreifen, wenn nicht unbedingt notwendig. Eventuell wird auch die Performance mit WCML besser, wenn WooCommerce nicht unnötig oft Bestellungen neu speichert, nur weil WCML beim Abruf der order-items eine Produkt-Id austauscht und WooCommerce bei einem späteren save einen false positive erhält und viel mehr Dinge abspeichert, als eigentlich geändert wurden.

3. Warum gibt es eigentlich kein reporting, das klar aufzeigt, das bei einer Bestellung die order-status hooks nicht gelaufen sind oder ein Error auftritt? WooCommerce speichert dann einer order-Notiz. Das ist zu wenig, da schaut man bei automatisierten Shops selten rein, das kriegt keiner mit. Wäre auch etwas für den Austausch mit WooCommerce. Wenn wir das nicht zufällig mitbekommen hätten, hätten wir langfristig noch mehr manuelle Nacharbeit gehabt. Das betrifft eher WooCommerce als euch. Dennoch großes Fragezeigen, was das für ein error handling sein soll.

4. Warum übersetzt WCML eigentlich irgendwelche order-items in REST-Requests? Wäre es nicht eventuell effizienter, einfach vor dem WooCommerce REST-Callback selbst die $sitepress->switch_lang() auf die Sprache der Bestellung zu ändern, dann den Callback auszuführen und vor dem Senden der fertigen REST-Response einfach wieder zurückszustellen? Ich bin mir ehrlich gesagt nicht sicher, ob das unerwartete Nebeneffekte haben könnte. Aber an sich klingt das für mich unkompliziert und eventuell auch zielführend.

5. WCML sollte test cases einführen: Wenn über Admin, Rest und AJAX der Status geändert wird, sollte die dazugehörige woocommerde_order_status_{status_transition[to]} immer gefeuert haben. Die Inkonsistenz, die in Punkt 1 beschrieben ist, sollte so einfach nicht passieren. Weder bei Shopsprache noch bei einer Fremdspache.

Die einfachste Lösung für das sehr akute Problem wäre wohl, mit WooCommerce zu vereinbaren, den pull request rückgängig zu machen und asap einen patch zu launchen. Das löst Punkt 1 & Punkt 4.
Thema 2, 3 & 5 blieben dann noch für künftige Verbesserungen in WooCommerce und WCML offen.

Eine Bitte an euch
Wenn ihr weitere Fragen habt, lasst es mich wissen.
Ich würde mich freuen, wenn ihr die Reproduktion des Fehlers inkl. der logischen Prüfung des Codes, den ich oben verlinkt habe, eigenständig durchführt und mich entlastet.

Habe mich bereits intensiv und mit viel Zeiteinsatz mit dem Konflikt befasst.
Meiner Meinung nach wäre das eure Aufgabe gewesen, da ich von Anfang an klar auf euren Changelog-Eintrag und den Zusammenhang mit dem Update von WC & WCML am gleichen Tag hingewiesen habe, seitdem der Fehler besteht.
Zudem habe ich den Scope des Fehler klar beschrieben, sodass es effizient zu testen gewesen wäre - nur REST-API, nur fremdsprachige Bestellungen.
Das erlaubt durchaus einen begründeten Verdacht, dass es etwas mit WCML zu tun hat.

Ich stehe unter Druck, weil ich eigentlich ganz andere Dinge derzeit zu tun habe.
Bitte übernehmt das Thema, so weit ihr könnt.

Ihr könnt mir gerne eine Email oder eine Antwort schreiben, wenn eure Entwickler weitere Fragen haben. Ich helfe mit Infos - so gut ich kann und freue mich, wenn ihr das Thema verantwortungsvoll übernehmt.

Grüße
Robert

Oktober 9, 2025 um 9:37 p.m. #17473069

Andreas W.
WPML-Unterstützer seit 12/2018

Sprachen: Englisch (English ) Spanisch (Español ) Deutsch (Deutsch )

Zeitzone: America/Lima (GMT-05:00)

Hallo Robert,

Vielen Dank für deine ausführliche Nachricht.

Ich kann das gerne an die Entwickler weiterleiter, aber muss dazu einige Test durchführen, um zu bestätigen, dass ein Bug in WPML oder WCML vorliegt:

1) Das Problem muss auf einer neuen Test Site in einem minimalen Setup replizierbar sein.

Ich habe dies auf folgender Test Site versucht zu replizieren:
versteckter Link

Ich habe hier kein Problem den Bestellstatus per REST API auf einer Bestellung, die in einer Zweitsprache angelegt wurde, zu ändern.

Beachte dazu bitte, dass "Orders" in WPML unter WPML > Einstellungen > Beitragstypen übersetzten immer als "Nicht übersetzbar" eingestellt sein sollten. Alle Bestellungen teilen die gleiche ID.

Die Permalink-Strukture sollte in WordPress immer auf "Post Name" stehen.

Beachte zudem, dass wir keinen Einfluss darauf haben, was von der REST API ausgegeben wird, da diese von WooCommerce verwaltet wird.

Mein PUT Request:

PUT /wp-json/wc/v3/orders/{order_id}
{
  "status": "completed"
}

2) Da ich das Problem hier nicht bestätigen kann, muss ich davon ausgehen, dass es sich um ein Einstellungsproblem oder ein Problem, das durch ein Dritt-Plugin oder Code im Theme entsteht, handelt.

Sollte ich das Problem nicht korrekt repliziert haben, bitte ich dich das Problem selbst auf meiner Test Site zu replizieren und ich werde es dann gerne intern weiterleiten.

Mit freundlichen Grüßen
Andreas

Oktober 15, 2025 um 7:46 a.m. #17485857

Robert Rosanke

Hallo Andreas,

es ist in der Tat schwierig, den Fehler nachzustellen.

Das oben von mir beschriebene Verhalten - dass WCML order_items übersetzt und dadurch get_changes() unerwarteterweise nicht immer leer ist - kann ich nachstellen.

Auf der Testseite passiert das jedoch nur nach order->save(), sobald WooCommerce das gespeicherte Objekt neu abruft, um die HTTP Response zu erstellen
Auf der Testseite treten somit keine Probleme bei Statusänderungen via REST-API durch den oben verlinkten WooCommerce Pull Request auf, der es in Version 10.0.x geschafft hat.

Hier einmal das von eurerer Testseite geloggte Material zu einer Bestellung.

[
  {
    "uuid": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition",
      "order_id": 109,
      "status_transition": false,
      "order_items_persisted": true,
      "order_persisted": true,
      "items_to_delete": true,
      "item_changes": true,
      "item_changes_debug": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      },
      "should_update_status": false
    }
  },
  {
    "uuid": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::end",
      "order_id": 109,
      "success": false
    }
  },
  {
    "uuid": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::start",
      "order_id": 109,
      "status_transition": {
        "from": "pending",
        "to": "processing",
        "note": "Die Zahlung soll bei Lieferung (per Nachnahme) erfolgen.",
        "manual": false
      }
    }
  },
  {
    "uuid": "d4e5f6a7-b8c9-4d0e-1f2a-3b4c5d6e7f8a",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition",
      "order_id": 109,
      "status_transition": {
        "from": "pending",
        "to": "processing",
        "note": "Die Zahlung soll bei Lieferung (per Nachnahme) erfolgen.",
        "manual": false
      },
      "order_items_persisted": true,
      "order_persisted": true,
      "items_to_delete": true,
      "item_changes": true,
      "item_changes_debug": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      },
      "should_update_status": true
    }
  },
  {
    "uuid": "e5f6a7b8-c9d0-4e1f-2a3b-4c5d6e7f8a9b",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::end",
      "order_id": 109,
      "success": true
    }
  },
  {
    "uuid": "f6a7b8c9-d0e1-4f2a-3b4c-5d6e7f8a9b0c",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::start",
      "order_id": 109,
      "status_transition": false
    }
  },
  {
    "uuid": "a7b8c9d0-e1f2-4a3b-4c5d-6e7f8a9b0c1d",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition",
      "order_id": 109,
      "status_transition": false,
      "order_items_persisted": true,
      "order_persisted": true,
      "items_to_delete": true,
      "item_changes": true,
      "item_changes_debug": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      },
      "should_update_status": false
    }
  },
  {
    "uuid": "b8c9d0e1-f2a3-4b4c-5d6e-7f8a9b0c1d2e",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::end",
      "order_id": 109,
      "success": false
    }
  },
  {
    "uuid": "c9d0e1f2-a3b4-4c5d-6e7f-8a9b0c1d2e3f",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::start",
      "order_id": 109,
      "status_transition": false
    }
  },
  {
    "uuid": "d0e1f2a3-b4c5-4d6e-7f8a-9b0c1d2e3f4a",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition",
      "order_id": 109,
      "status_transition": false,
      "order_items_persisted": true,
      "order_persisted": true,
      "items_to_delete": true,
      "item_changes": true,
      "item_changes_debug": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      },
      "should_update_status": false
    }
  },
  {
    "uuid": "e1f2a3b4-c5d6-4e7f-8a9b-0c1d2e3f4a5b",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::end",
      "order_id": 109,
      "success": false
    }
  },
  {
    "uuid": "f2a3b4c5-d6e7-4f8a-9b0c-1d2e3f4a5b6c",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::start",
      "order_id": 109,
      "status_transition": false
    }
  },
  {
    "uuid": "a3b4c5d6-e7f8-4a9b-0c1d-2e3f4a5b6c7d",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition",
      "order_id": 109,
      "status_transition": false,
      "order_items_persisted": true,
      "order_persisted": true,
      "items_to_delete": true,
      "item_changes": true,
      "item_changes_debug": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      },
      "should_update_status": false
    }
  },
  {
    "uuid": "b4c5d6e7-f8a9-4b0c-1d2e-3f4a5b6c7d8e",
    "date": "2025-10-15T06:32:44+00:00",
    "data": {
      "action": "status_transition::end",
      "order_id": 109,
      "success": false
    }
  },
  {
    "uuid": "c5d6e7f8-a9b0-4c1d-2e3f-4a5b6c7d8e9f",
    "date": "2025-10-15T06:32:45+00:00",
    "data": {
      "action": "status_transition::start",
      "order_id": 109,
      "status_transition": false
    }
  },
  {
    "uuid": "d6e7f8a9-b0c1-4d2e-3f4a-5b6c7d8e9f0a",
    "date": "2025-10-15T06:32:45+00:00",
    "data": {
      "action": "status_transition",
      "order_id": 109,
      "status_transition": false,
      "order_items_persisted": true,
      "order_persisted": true,
      "items_to_delete": true,
      "item_changes": true,
      "item_changes_debug": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      },
      "should_update_status": false
    }
  },
  {
    "uuid": "e7f8a9b0-c1d2-4e3f-4a5b-6c7d8e9f0a1b",
    "date": "2025-10-15T06:32:45+00:00",
    "data": {
      "action": "status_transition::end",
      "order_id": 109,
      "success": false
    }
  },
  {
    "uuid": "f8a9b0c1-d2e3-4f4a-5b6c-7d8e9f0a1b2c",
    "date": "2025-10-15T06:32:45+00:00",
    "data": {
      "action": "status_transition::start",
      "order_id": 109,
      "status_transition": false
    }
  },
  {
    "uuid": "a9b0c1d2-e3f4-4a5b-6c7d-8e9f0a1b2c3d",
    "date": "2025-10-15T06:32:45+00:00",
    "data": {
      "action": "status_transition",
      "order_id": 109,
      "status_transition": false,
      "order_items_persisted": true,
      "order_persisted": true,
      "items_to_delete": true,
      "item_changes": true,
      "item_changes_debug": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      },
      "should_update_status": false
    }
  },
  {
    "uuid": "b0c1d2e3-f4a5-4b6c-7d8e-9f0a1b2c3d4e",
    "date": "2025-10-15T06:32:45+00:00",
    "data": {
      "action": "status_transition::end",
      "order_id": 109,
      "success": false
    }
  },
  {
    "uuid": "c1d2e3f4-a5b6-4c7d-8e9f-0a1b2c3d4e5f",
    "date": "2025-10-15T06:32:47+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "d2e3f4a5-b6c7-4d8e-9f0a-1b2c3d4e5f6a",
    "date": "2025-10-15T06:32:47+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "e3f4a5b6-c7d8-4e9f-0a1b-2c3d4e5f6a7b",
    "date": "2025-10-15T06:32:47+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "f4a5b6c7-d8e9-4f0a-1b2c-3d4e5f6a7b8c",
    "date": "2025-10-15T06:32:47+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "a5b6c7d8-e9f0-4a1b-2c3d-4e5f6a7b8c9d",
    "date": "2025-10-15T06:32:47+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "b6c7d8e9-f0a1-4b2c-3d4e-5f6a7b8c9d0e",
    "date": "2025-10-15T06:32:47+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "c7d8e9f0-a1b2-4c3d-4e5f-6a7b8c9d0e1f",
    "date": "2025-10-15T06:32:47+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "d8e9f0a1-b2c3-4d4e-5f6a-7b8c9d0e1f2a",
    "date": "2025-10-15T06:32:47+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "e9f0a1b2-c3d4-4e5f-6a7b-8c9d0e1f2a3b",
    "date": "2025-10-15T06:33:04+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "en",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "f0a1b2c3-d4e5-4f6a-7b8c-9d0e1f2a3b4c",
    "date": "2025-10-15T06:33:04+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "en",
      "items": {
        "14": {
          "id": 14,
          "product_id": 83,
          "variation_id": 97,
          "name": "Test - S",
          "changes": {
            "product_id": 83,
            "variation_id": 97,
            "name": "Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 83,
          "variation_id": 95,
          "name": "Test - L",
          "changes": {
            "product_id": 83,
            "variation_id": 95,
            "name": "Test - L"
          }
        }
      }
    }
  },
  {
    "uuid": "0a1b2c3d-4e5f-4a7b-8c9d-0e1f2a3b4c5d",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "status_transition::start",
      "order_id": 109,
      "status_transition": {
        "from": "processing",
        "to": "completed",
        "note": "",
        "manual": false
      }
    }
  },
  {
    "uuid": "1b2c3d4e-5f6a-4b8c-9d0e-1f2a3b4c5d6e",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "en",
      "items": {
        "14": {
          "id": 14,
          "product_id": 83,
          "variation_id": 97,
          "name": "Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 83,
          "variation_id": 95,
          "name": "Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "2c3d4e5f-6a7b-4c9d-0e1f-2a3b4c5d6e7f",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "en",
      "items": {
        "14": {
          "id": 14,
          "product_id": 83,
          "variation_id": 97,
          "name": "Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 83,
          "variation_id": 95,
          "name": "Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "3d4e5f6a-7b8c-4d0e-1f2a-3b4c5d6e7f8a",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "status_transition",
      "order_id": 109,
      "status_transition": {
        "from": "processing",
        "to": "completed",
        "note": "",
        "manual": false
      },
      "order_items_persisted": true,
      "order_persisted": true,
      "items_to_delete": true,
      "item_changes": true,
      "item_changes_debug": {
        "14": {
          "id": 14,
          "product_id": 83,
          "variation_id": 97,
          "name": "Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 83,
          "variation_id": 95,
          "name": "Test - L",
          "changes": []
        }
      },
      "should_update_status": true
    }
  },
  {
    "uuid": "4e5f6a7b-8c9d-4e1f-2a3b-4c5d6e7f8a9b",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "status_transition::end",
      "order_id": 109,
      "success": true
    }
  },
  {
    "uuid": "5f6a7b8c-9d0e-4f2a-3b4c-5d6e7f8a9b0c",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 83,
          "variation_id": 97,
          "name": "Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 83,
          "variation_id": 95,
          "name": "Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "6a7b8c9d-0e1f-4a3b-4c5d-6e7f8a9b0c1d",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  },
  {
    "uuid": "7b8c9d0e-1f2a-4b4c-5d6e-7f8a9b0c1d2e",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  },
  {
    "uuid": "8c9d0e1f-2a3b-4c5d-6e7f-8a9b0c1d2e3f",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  },
  {
    "uuid": "9d0e1f2a-3b4c-4d6e-7f8a-9b0c1d2e3f4a",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  },
  {
    "uuid": "0e1f2a3b-4c5d-4e7f-8a9b-0c1d2e3f4a5b",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  },
  {
    "uuid": "1f2a3b4c-5d6e-4f8a-9b0c-1d2e3f4a5b6c",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  },
  {
    "uuid": "2a3b4c5d-6e7f-4a9b-0c1d-2e3f4a5b6c7d",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  },
  {
    "uuid": "3b4c5d6e-7f8a-4b0c-1d2e-3f4a5b6c7d8e",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 83,
          "variation_id": 97,
          "name": "Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 83,
          "variation_id": 95,
          "name": "Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "4c5d6e7f-8a9b-4c1d-2e3f-4a5b6c7d8e9f",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  }
]

An einigen Stellen im Request-Zyklus wechselt WCML die target_lang, was dann in WCML\OrderItems\LineItem\Variation->translateItem() Änderungen triggert.
Auf dieser Tetseite ohne folgen.

  • Auf der Testseite ruft WCML eine Sprache ab und erst nach order->save(), wenn das Bestellobjekt das nächste mal abgerufen wird, dann kommt es ggf. zu einem Wechsel von target_lang.
  • Bei uns auf der Live-Seite jedoch schon vor order->save(), sodass die status transition hooks niemals feuern, wenn Bestellsprache !== DE (Basis-Sprache der Website).

Auf der Live-Seite ist jedoch viel mehr Dynamik drin, externe Plugins, mehrere externe Anbindungen.

Schau dir mal alles ab id "d8e9f0a1-b2c3-4d4e-5f6a-7b8c9d0e1f2a" an.
Dieser Eintrag ist der letzte eines anderen Requests. Ab dem nächsten Log-Eintrag startet der REST-Request zum abschließen der Bestellung.

Auf einmal ist target_lang anders.
Auch Innerhalb eines einzigen requests kommt es zu Änderungen. Beim ersten get_items-call ist target_lang = en und nach order->save() ist target_lang auf einmal = de.

e9f0a1b2-c3d4-4e5f-6a7b-8c9d0e1f2a3b vs. 4c5d6e7f-8a9b-4c1d-2e3f-4a5b6c7d8e9f

  {
    "uuid": "3b4c5d6e-7f8a-4b0c-1d2e-3f4a5b6c7d8e",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 83,
          "variation_id": 97,
          "name": "Test - S",
          "changes": []
        },
        "15": {
          "id": 15,
          "product_id": 83,
          "variation_id": 95,
          "name": "Test - L",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "4c5d6e7f-8a9b-4c1d-2e3f-4a5b6c7d8e9f",
    "date": "2025-10-15T06:33:05+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 109,
      "target_lang": "de",
      "items": {
        "14": {
          "id": 14,
          "product_id": 84,
          "variation_id": 100,
          "name": "DE Test - S",
          "changes": {
            "product_id": 84,
            "variation_id": 100,
            "name": "DE Test - S"
          }
        },
        "15": {
          "id": 15,
          "product_id": 84,
          "variation_id": 98,
          "name": "DE Test - L",
          "changes": {
            "product_id": 84,
            "variation_id": 98,
            "name": "DE Test - L"
          }
        }
      }
    }
  }

Hier ist deutlich zu erkennen, was WCML ändert - siehe "changes": {...}.
Es handelt sich um eine deutsche Bestellung.
WPML hat die items zwischendurch mal automatisch auf EN manipuliert (obwohl es eine DE-Bestellung ist) und gespeichert, als das WCML-System als target_lang = en festgelegt hat.
Beim erneuten Abruf merkt WPML dann, dass target_lang eigentlich "de" ist und übersetzt die order items - name, id, variation_id - mit dem Filter woocommerce_order_get_items.

Auch wenn ich den Fehler nicht exakt nachstellen konnte, so ist dennoch erkennbar, was das Problem ist und live bei uns zu Fehlern führt.

Ich habe die komplette code-basis nach dem Einsatz von woocommerce_order_get_items durchsucht.
Nur WCML und German Market haben jeweils einen aktiven Filter drauf.

Hier, was German Market macht:

add_filter( 'woocommerce_order_get_items', array( 'WGM_Template', 'filter_order_item_name' ), 10, 2 );

	/**
	 * Add the "[Digital]" to product name
	 *
	 * @wp-hook woocommerce_order_get_items
	 *
	 * @param   array $items
	 * @return  array $items
	 */
	public static function filter_order_item_name( $items ){

		$keyword= apply_filters( 'wgm_product_name_virtual_notice_keyword', '[Digital]' );
		$html   = sprintf( '<span class="wgm-virtual-notice">%s</span>', $keyword );

		foreach( $items as $key => $item ){

			if ( 'line_item' !== $item->get_type() ) {
				continue;
			}

			$search = apply_filters(
				'wgm_product_name_virtual_notice',
				$html,
				$item[ 'name' ],
				$keyword
			);

			if( strpos( $item[ 'name' ], $search ) !== FALSE ){
				$item[ 'name' ] = str_replace( $search, $keyword, $item[ 'name' ] );
			}

			/**
			 * re-assign the value
			 * @issue #421
			 */
			$items[ $key ] = $item;

		}

		return $items;
	}

German Market ändert weder die Produkt, noch die Variation Id. Die Einträge in get_changes(), die seit WooCommerce 10.0.x in WooCommerce die Status-Hooks blockieren, kommen mit hoher Wahrscheinlichkeit nicht von dort.

Für mich bleibt nur WCML als Ursache. Übersehe ich etwas?

Oktober 15, 2025 um 10:33 a.m. #17486603

Robert Rosanke

Edit: Hier mal ein paar Logs von der Live-Seite:

[
  {
    "uuid": "5d6e7f8a-9b0c-4d2e-8f9a-0b1c2d3e4f5a",
    "date": "2025-10-15T07:35:35+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 60448,
      "target_lang": "de",
      "items": {
        "58247": {
          "id": 58247,
          "product_id": 32679,
          "variation_id": 32717,
          "name": "Our Product - Size XL",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "6e7f8a9b-0c1d-4e3f-9a0b-1c2d3e4f5a6b",
    "date": "2025-10-15T07:35:35+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 60448,
      "target_lang": "de",
      "items": {
        "58247": {
          "id": 58247,
          "product_id": 32439,
          "variation_id": 32709,
          "name": "Unser Produkt - Größe XL",
          "changes": {
            "product_id": 32439,
            "variation_id": 32709,
            "name": "Unser Produkt - Größe XL"
          }
        }
      }
    }
  },
  {
    "uuid": "7f8a9b0c-1d2e-4f4a-a0b1-c2d3e4f5a6b7",
    "date": "2025-10-15T07:35:43+00:00",
    "data": {
      "action": "WCML::getOrderItems::before",
      "order_id": 60427,
      "target_lang": "de",
      "items": {
        "58215": {
          "id": 58215,
          "product_id": 32438,
          "variation_id": 32699,
          "name": "Unser Produkt - Größe S",
          "changes": []
        }
      }
    }
  },
  {
    "uuid": "8a9b0c1d-2e3f-4a5b-b1c2-d3e4f5a6b7c8",
    "date": "2025-10-15T07:35:43+00:00",
    "data": {
      "action": "WCML::getOrderItems::after",
      "order_id": 60427,
      "target_lang": "de",
      "items": {
        "58215": {
          "id": 58215,
          "product_id": 32438,
          "variation_id": 32699,
          "name": "Unser Produkt - Größe S",
          "changes": []
        }
      }
    }
  },

]

Die order 60448 war eine EN-Bestellung mit dem gleichen "Fehler". Der Rest war DE, dort passt alles.
Bei diesen Logeinträgen handelt es sich um einfache Bestellabrufe, kein PUT Request.
Wenn man nun bei der EN-Bestellung set_status() intern aufgerufen hätte, würden die core WooCommerce hooks nicht feuern, weil Produkt, name und variation_id zwischen 5d6e7f8a-9b0c-4d2e-8f9a-0b1c2d3e4f5a und 6e7f8a9b-0c1d-4e3f-9a0b-1c2d3e4f5a6b übersetzt wurden und die WooCommerce-interne get_changes() Prüfung die hooks unterbindet.
Das, was WCML mit WCML\OrderItems\LineItem\Variation->translateItem() macht, passt für WooCommerce 10.0.x nicht mehr zuverlässig, wenn bestehende Bestellungen weiterverarbeitet werden.

Bitte schaut euch "Für die WPML/WCML-Entwickler" meiner Antwort von letzter Woche an.

Möglicherweise handelt es sich hier um einen schwer zu reproduzierenden Fehler.
Die Ansätze der Problematik konnten auf der Testseite abgebildet werden.

Rein logisch kann ich den Fehler, wenn ich den WooCommerce- sowie den WCML-Filter-Code lese, nachvollziehen. Mir scheint es nicht zu weit hergeholt, euch zu bitten, dass eure Entwickler sich mit dem Thema annehmen oder ihr mit WooCommerce kooperiert, um upstream eine Änderung zu erwirken, z.B. eine Rückabwicklung der eingeführten Änderungen - siehe oben verlinkter Pull Request.

Oktober 15, 2025 um 10:37 a.m. #17486636

Robert Rosanke

Edit #2: German Market hat bei uns live nichts damit zu tun, der get_changes Eintrag entsteht exakt nur durch WCML, wenn Billbee eine betroffene Bestellung via REST-API ändert:

[
  {
    "action": "status_transition::start",
    "order_id": 60462,
    "status_transition": {
      "from": "processing",
      "to": "completed",
      "note": "",
      "manual": false
    }
  },
  {
    "action": "WCML::getOrderItems::before",
    "order_id": 60462,
    "target_lang": "de",
    "items": {
      "58298": {
        "id": 58298,
        "product_id": 6771,
        "variation_id": 6777,
        "name": "Produkt EN XL+",
        "changes": []
      }
    }
  },
  {
    "action": "WCML::getOrderItems::after",
    "order_id": 60462,
    "target_lang": "de",
    "items": {
      "58298": {
        "id": 58298,
        "product_id": 1370,
        "variation_id": 1374,
        "name": "Produkt DE - XL+",
        "changes": {
          "product_id": 1370,
          "variation_id": 1374,
          "name": "Produkt DE XL+"
        }
      }
    }
  },
  {
    "action": "status_transition",
    "order_id": 60462,
    "status_transition": {
      "from": "processing",
      "to": "completed",
      "note": "",
      "manual": false
    },
    "order_items_persisted": false,
    "order_persisted": true,
    "items_to_delete": true,
    "item_changes": false,
    "item_changes_debug": {
      "58298": {
        "id": 58298,
        "product_id": 1370,
        "variation_id": 1374,
        "name": "Produkt DE XL+",
        "changes": {
          "product_id": 1370,
          "variation_id": 1374,
          "name": "Produkt DE XL+"
        }
      }
    },
    "should_update_status": false
  },
  {
    "action": "status_transition::end",
    "order_id": 60462,
    "success": false
  }
]

Mehr als diese ganzen Belege kann ich euch nicht bieten.
WCML ändert Produkt Id, Varianten Id, Name.
WooCommerce kommt damit seit Version 10 nicht mehr klar.
Der Ball liegt bei euch.

Oktober 15, 2025 um 3:29 p.m. #17487636

Andreas W.
WPML-Unterstützer seit 12/2018

Sprachen: Englisch (English ) Spanisch (Español ) Deutsch (Deutsch )

Zeitzone: America/Lima (GMT-05:00)

Da ich das Verhalten auf meiner Testseite nicht nachstellen konnte, liegt der Verdacht nahe, dass ein Drittanbieter-Plugin die Verarbeitung beeinflusst. Besonders Plugins, die Bestelldaten, Produktnamen oder Varianten-ID verändern, könnten die interne Prüfung von WooCommerce (get_changes()) stören und dadurch verhindern, dass Hooks wie woocommerce_order_status_changed ausgelöst werden.

Ich empfehle, die Website in einem Staging-Setup mit minimaler Plugin-Konfiguration zu testen, um den Auslöser zu identifizieren.

1) Deaktiviere alle Plugins, die nicht mit WooCommerce, WPML oder unseren Add-ons zusammenhängen. Teste anschließend erneut: Tritt das Problem weiterhin auf?

2) Falls das Problem verschwindet, reaktiviere die Plugins einzeln oder in kleinen Gruppen. So kannst du feststellen, bei welchem Plugin das Problem erneut auftritt.

3) Sollte sich die Ursache dadurch nicht klären lassen, wechsle bitte testweise zu einem Standard-Theme wie Twenty Twenty-One. So lässt sich prüfen, ob das Problem möglicherweise mit dem Theme zusammenhängt.

Sobald die Ursache identifiziert ist, kann ich versuchen, das Verhalten auf einer eigenen Testseite mit WPML nachzustellen und gegebenenfalls intern eskalieren. Ich stelle dir dafür gerne eine entsprechende Umgebung zur Verfügung.

Oktober 15, 2025 um 4:25 p.m. #17487814

Robert Rosanke


Da ich das Verhalten auf meiner Testseite nicht nachstellen konnte, liegt der Verdacht nahe, dass ein Drittanbieter-Plugin die Verarbeitung beeinflusst. Besonders Plugins, die Bestelldaten, Produktnamen oder Varianten-ID verändern, könnten die interne Prüfung von WooCommerce (get_changes()) stören und dadurch verhindern, dass Hooks wie woocommerce_order_status_changed ausgelöst werden.

Korrekt.

WCML ist das einzige Plugin in unserer code basis, dass den woocommerce_order_get_items Filter benutzt und productId, variationId und name manchmal anpasst.


1) Deaktiviere alle Plugins, die nicht mit WooCommerce, WPML oder unseren Add-ons zusammenhängen. Teste anschließend erneut: Tritt das Problem weiterhin auf?

Haben wir auf eurere Testseite gemacht.

Wir sehen in meiner Antwort von heute morgen, dass auch auf der Testseite get_changes() nicht immer leer ist und productId, variationId und name manchmal durch WCML angepasst werden.
Die Logs habe ich mitgesendet.

Siehe e9f0a1b2-c3d4-4e5f-6a7b-8c9d0e1f2a3b &. 4c5d6e7f-8a9b-4c1d-2e3f-4a5b6c7d8e9f


2) Falls das Problem verschwindet, reaktiviere die Plugins einzeln oder in kleinen Gruppen. So kannst du feststellen, bei welchem Plugin das Problem erneut auftritt.

Auf der Testseite hat das unerwartete Verhalten nicht Fehlern geführt, weil die Änderung auf der Testseite nach dem order-save aufgetreten ist.
Das ist jedoch nur etwas timing. Das Grundlegende Problem - dass WCML etwas modifiziert, was seit WC 10.0.x status hooks blockieren kann - bleibt bestehen.

Weitere Plugins sind auf eurer Testseite nicht aktiv. Können wir als Quelle für das manchmal nicht-leere get_changes() ausschließen.


3) Sollte sich die Ursache dadurch nicht klären lassen, wechsle bitte testweise zu einem Standard-Theme wie Twenty Twenty-One. So lässt sich prüfen, ob das Problem möglicherweise mit dem Theme zusammenhängt.

Auf der Testseite ist bereits ein Standard-Theme installiert, wen ich mich nicht irre.

Es reicht doch völlig aus, dass auch auf der Testseite manchmal Änderungen an den order-items via get_changes() erkennbar sind.

Live ist das Timing anders, okay. Ändert jedoch nichts am Sachverhalt: WCML modifiziert die order items manchmal und wenn es vom timing her blöd läuft, dann werden die status hooks durch den woo core blockiert und niemand kriegt es mit.

Es muss ja nicht einmal ein rest request sein. Es kann ja auch ein action scheduler callback sein, in dem WCML bei einem Bestellabruf auf einmal die order-items ändert und eine andere Funktion ein order->save durchführt. Schon haben wir unerwünschterweise ausbleibende order hooks.

Typisches Szenario für solch eine action scheduler Aktion: Automatisches Stornieren von Banküberweisungs-Bestellungen x Tage ohne Zahlungseingang. Die Bestellung wird definitiv überschrieben und wenn WCML dabei die items ändert, dann fallen auch beim Stornieren alle status-hooks aus.

Das ist alleine durch code lesen nachvollziehbar, siehe oben. Dafür braucht nicht mal jemand etwas testen.
Es ist durch code lesen nachvollziehbar, dass der Filter callback von WCML die order-items unter gewissen Bedingungen ändert. Wenn dann jemand order->save() durchführt, werden hooks ab WooCommerce 10.0.x nicht feuern.

Was im Moment läuft sieht mir eher nach Glücksspiel aus, gerade, wenn Automatisierungen via REST, Action Scheduler oder WP Cron laufen.
Es fallen ggf. blind alle angehängten Automatisierungen und Shop-Funktionen rund um betroffene Bestellungen aus.

Wir können noch weitere Stunden rumprobieren und versuchen irgendwie im timing zu rekonstruieren.
Oder das Verhalten von WCML wird einfach angepasst / Kontakt mit WooCommerce aufgenommen, um dieses unerwartete Verhalten seit dem WC 10.0.x Update [siehe pull request oben], zu beheben.

Wie gesagt: Für mich als Programmierer ist es logisch nachvollziehbar, wie der Fehler entstehen kann. Das reicht völlig aus, um es als Anlass zu nehmen, das Verhalten anzupassen.

Da auf live-Websites die verschiedensten Plugins eingesetzt werden, ist ein robustes setup wichtig. Jetzt auf unseren beispielhaften REST-Request zu optimieren, muss nicht reichen. Es gibt auf den verschiedensten Websites so viele verschiedene Abläufe, da sollte dieses Kompatibilitätsproblem einfach grundsätzlich eliminiert werden.

Der WCML Filter sollte keine nicht-leeren get_changes() herbeiführen oder WooCommerce hört auf, auf ein leeres get_changes() zu bestehen, um status hooks zu feuern. Eins von beiden muss es werden.

Was fehlt dir noch, um das Ticket endlich lösen zu lassen?

Oktober 15, 2025 um 4:28 p.m. #17487832

Andreas W.
WPML-Unterstützer seit 12/2018

Sprachen: Englisch (English ) Spanisch (Español ) Deutsch (Deutsch )

Zeitzone: America/Lima (GMT-05:00)

Ich kann das Problem nur intern eskalieren, wenn man es auf der Test Site replizieren kann. Wenn ich richtig verstehe, ist das aktuell nicht der Fall.

Die Tests müssen auf einer Kopie der betroffenen Live-Site durchgeführt werden.