web-dev-qa-db-ja.com

Woocommerce:プログラムによる注文ステータスの更新

WP_Ajaxフック中にプログラムで注文を更新しようとしたとき。 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');

次のエラーが発生します。

警告:DOMXPath :: query():299行目の/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.phpの式が無効です

警告:DOMXPath :: query():299行目の/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.phpの式が無効です

警告:302行目の/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.phpのforeach()に無効な引数が指定されています

警告:DOMXPath :: query():299行目の/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.phpの式が無効です

警告:DOMXPath :: query():299行目の/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.phpの式が無効です

警告:302行目の/wp-content/plugins/woocommerce/includes/libraries/class-emogrifier.phpのforeach()に無効な引数が指定されています

そのupdate_status関数を削除しても、エラーは発生しません。

14

表示されているエラーは、通知システムから発生しています。コードはステータスを正常に更新できるようです。 Emogrifyクラスは、HTMLテンプレートでインラインCSSを生成するために使用されます。これらのエラーが発生する可能性が高いのは、A)「注文完了」メールテンプレートを上書きして解析エラーを作成したか、B)実行していることと何らかの形で競合するWooCommerceアドオンがあるためです。

この問題を修正するための最初のステップは、管理者のWooCommerce->設定->メール->完了した注文に移動し、[このメール通知を有効にする]チェックボックスをオフにして、通知システムであることを確認することです。次に、それを保存して再テストします。

エラーが解消された場合は、テーマディレクトリでそのテンプレートのオーバーライドを確認してください。 <themename>/woocommerce/emails/customer-completed-order.phpになります。お持ちの場合は、名前を変更して、上書きされないようにし、「注文完了」通知を再度アクティブにして、デフォルトのテンプレートを使用して問題が修正されるかどうかを確認します。

デフォルトの電子メール通知テンプレートで問題が解決しない場合は、インストールした可能性のあるすべてのWooCommerceアドオンを無効にして、再テストしてください。この時点で、機能している場合は、問題が再発するまで1つずつ再度有効にすることができます。問題のあるアドオンを見つけたら、アドオンが問題を引き起こさないようにコードを調整するか、アドオン開発者に連絡して問題に対処する必要があります。

5
BA_Webimax

よくわかりませんが、エラーを回避するために、new WC_Order( $order_id );を使用してこのトリックを試すことができます。

// 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');

私はこれが奇妙な問題であることに同意します。

4
LoicTheAztec

あなたはそれを Wordpress.Stackexchange.com で尋ねなければなりませんでした

2
T.Todua

まれな問題なので、手動で開くことをお勧めします。

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

299行目の前に、これらの行を挿入して、何が得られるかを確認します。

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

さまざまなフックを試してこれを理解しました。問題は、注文を作成するために使用していたフックが、woocommerceがこの問題の原因であると初期化する前に発生したことでした。

0