Woocommerce: Programmatisches Aktualisieren des Bestellstatus

Lesezeit: 4 Minuten

Benutzer-Avatar
Nikolaus Koskowski

Wenn ich versuche, eine Bestellung während a WP_Ajax Haken. IE.

$order = wc_create_order($order_data);
$order->add_product( get_product( $membership_product_ids[0] ), 1 );
$order->set_address( $address, 'billing' );
$order->set_address( $address, 'shipping' );
$order_id = $order->id;
$order->update_status('completed');

Ich erhalte folgende Fehler:

Warnung: DOMXPath::query(): Ungültiger Ausdruck in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php in Zeile 299

Warnung: DOMXPath::query(): Ungültiger Ausdruck in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php in Zeile 299

Warnung: Ungültiges Argument für foreach() in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php in Zeile 302 angegeben

Warnung: DOMXPath::query(): Ungültiger Ausdruck in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php in Zeile 299

Warnung: DOMXPath::query(): Ungültiger Ausdruck in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php in Zeile 299

Warnung: Ungültiges Argument für foreach() in /wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php in Zeile 302 angegeben

Wenn ich das entferne update_status Funktion es macht keine Fehler.

  • Ich habe den obigen Code mit etwas zusätzlichem Code von mir ausprobiert, er funktioniert auf meinem Computer ohne Fehler. Können Sie Ihren vollständigen Code oben aktualisieren, damit ich ihn genau reproduzieren kann. Es ist hilfreich, wenn Sie Versionsdetails von WP, WC, Browser, Betriebssystem und wo Sie diese Fehler erhalten, oder einen Screenshot davon angeben können.

    – Ratnakar – StoreApps

    10. September 2016 um 15:30 Uhr

  • Wenn Sie eine E-Mail erhalten haben, wenn Sie eine Bestellung erstellen und den Status geändert haben, wird Ihre Bestellung erstellt, aber Sie erhalten keine E-Mail-Bestätigung über die Bestellung

    – Benutzer5200704

    10. September 2016 um 21:18 Uhr

Die angezeigten Fehler stammen vom Benachrichtigungssystem. Ihr Code scheint den Status problemlos aktualisieren zu können. Die Emogrify-Klasse wird verwendet, um Inline-CSS in einer HTML-Vorlage zu generieren. Sie sehen diese Fehler wahrscheinlich, weil entweder A) Sie die E-Mail-Vorlage „Bestellung abgeschlossen“ überschrieben und einen Parsing-Fehler verursacht haben oder B) es ein WooCommerce-Add-on gibt, das in irgendeiner Weise mit dem, was Sie tun, in Konflikt steht.

Um das Problem zu beheben, besteht der erste Schritt darin, zu überprüfen, ob es sich um das Benachrichtigungssystem handelt, indem Sie in den Adminbereich unter WooCommerce->Einstellungen->E-Mail->Abgeschlossene Bestellung gehen und das Kontrollkästchen „Diese E-Mail-Benachrichtigung aktivieren“ deaktivieren. Dann speichern und erneut testen.

Wenn Ihr Fehler verschwindet, überprüfen Sie Ihr Themenverzeichnis auf eine Überschreibung dieser Vorlage. Es wäre drin <themename>/woocommerce/emails/customer-completed-order.php. Wenn Sie eine haben, benennen Sie sie um, damit sie nicht mehr überschrieben wird, und aktivieren Sie die Benachrichtigung „Bestellung abgeschlossen“ erneut und prüfen Sie, ob die Verwendung der Standardvorlage das Problem behebt.

Wenn das Problem mit der Standardvorlage für E-Mail-Benachrichtigungen weiterhin besteht, deaktivieren Sie alle WooCommerce-Add-Ons, die Sie möglicherweise installiert haben, und testen Sie sie erneut. Wenn es funktioniert, können Sie sie zu diesem Zeitpunkt einzeln wieder aktivieren, bis das Problem wieder auftritt. Sobald Sie das problematische Add-On gefunden haben, müssen Sie entweder Ihren Code anpassen, damit das Add-On kein Problem verursacht, oder sich an den Add-On-Entwickler wenden, um Ihr Problem zu beheben.

Ich bin mir nicht sicher, aber Sie könnten diesen Trick ausprobieren new WC_Order( $order_id );um den Fehler zu vermeiden:

// global $woocommerce; // in case of need…
$order = wc_create_order($order_data);
$order_id = $order->id; // moving this here
$_order = new WC_Order( $order_id ); // here
$_order->add_product( get_product( $membership_product_ids[0] ), 1 );
$_order->set_address( $address, 'billing' );
$_order->set_address( $address, 'shipping' );
$_order->update_status('completed');

Ich stimme zu, dass dies ein seltsames Problem ist.

  • Dies hat den Fehler für mich leider nicht behoben, aber danke, dass Sie es mit einem so seltsamen Problem versucht haben! Stimme zu!

    – Nikolaus Koskowski

    20. Juni 2016 um 18:59 Uhr

  • @NicholasKoskowski Ich habe keine Fehler beim Testen Ihres Codes … Bitte aktualisieren Sie Ihre Frage mit dem vollständigen Code und vielen weiteren Details, um wirklich Hilfe zu erhalten. Vielen Dank

    – LoicTheAztec

    11. September 2016 um 9:16 Uhr


Da es sich um ein seltenes Problem handelt, sollten Sie Folgendes besser manuell öffnen:

/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.php

und fügen Sie vor Zeile 299 diese Zeilen ein und sehen Sie, was Sie erhalten:

var_dump($value);
var_dump($this->translateCssToXpath($value['selector']));
var_dump($xpath->query($this->translateCssToXpath($value['selector'])));

Ich habe das herausgefunden, indem ich eine Reihe verschiedener Hooks ausprobiert habe. Das Problem war, dass der Hook, den ich zum Erstellen der Bestellung verwendet habe, passiert ist, bevor Woocommerce das initialisiert hat, was dieses Problem verursacht hat.

1019620cookie-checkWoocommerce: Programmatisches Aktualisieren des Bestellstatus

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy