it-swarm.com.de

Woocommerce: Programmgesteuertes Aktualisieren des Bestellstatus

Wenn ich versuche, eine Bestellung während eines WP_Ajax-Hooks programmgesteuert zu aktualisieren. 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 Fehlermeldungen:

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

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

Wenn ich diese update_status Funktion entferne, tritt kein Fehler auf.

15

Die angezeigten Fehler stammen aus dem Benachrichtigungssystem. Ihr Code scheint in der Lage zu sein, den Status zu aktualisieren. Die Emogrify-Klasse wird zum Generieren von Inline-CSS in einer HTML-Vorlage verwendet. Wahrscheinlich werden diese Fehler angezeigt, weil entweder A) Sie die E-Mail-Vorlage "Abgeschlossene Bestellung" überschrieben und einen Parsing-Fehler erstellt haben oder B) ein WooCommerce-Add-On vorhanden ist, das in irgendeiner Weise mit Ihrer Arbeit in Konflikt steht.

Um das Problem zu beheben, müssen Sie zunächst überprüfen, ob es sich um das Benachrichtigungssystem handelt, indem Sie den Administrator unter WooCommerce-> Einstellungen-> E-Mail-> Abgeschlossene Bestellung aufrufen und das Kontrollkästchen "Diese E-Mail-Benachrichtigung aktivieren" deaktivieren. Speichern Sie das und wiederholen Sie den Test.

Wenn Ihr Fehler behoben ist, suchen Sie in Ihrem Designverzeichnis nach einer Überschreibung dieser Vorlage. Es wäre in <themename>/woocommerce/emails/customer-completed-order.php. Wenn Sie eine haben, benennen sie diese um, damit sie nicht mehr außer Kraft gesetzt werden und reaktivieren die Benachrichtigung "Abgeschlossene Bestellung" und prüfen, ob das Problem durch die Verwendung der Standardvorlage behoben wird.

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 wiederholen Sie den Test. Zu diesem Zeitpunkt können Sie sie nacheinander wieder aktivieren, bis das Problem erneut 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.

5
BA_Webimax

Ich bin nicht sicher, aber Sie könnten diesen Trick mit new WC_Order( $order_id ); versuchen, 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 bin damit einverstanden, dass dies ein seltsames Problem ist.

4
LoicTheAztec

Das musste man bei Wordpress.Stackexchange.com fragen

2
T.Todua

Da es selten vorkommt, sollten Sie Folgendes manuell öffnen:

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

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'])));
1
T.Todua

Ich habe das herausgefunden, indem ich verschiedene Hooks ausprobiert habe. Das Problem war, dass der Hook, mit dem ich die Bestellung erstellt habe, vor dem Initialisieren von woocommerce aufgetreten ist, was dieses Problem verursacht hat.

0