Woocommerce: программное обновление статуса заказа

Когда я пытаюсь программно обновлять заказ во время WP_Ajax hook. 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(): недопустимое выражение в /wp -content/plugins/woocommerce/includes/libraries/class-emogrifier.php в строке 299

Предупреждение: DOMXPath:: query(): недопустимое выражение в /wp -content/plugins/woocommerce/includes/libraries/class-emogrifier.php в строке 299

Предупреждение: неверный аргумент, предоставленный foreach() в /wp -content/plugins/woocommerce/includes/libraries/class-emogrifier.php в строке 302

Предупреждение: DOMXPath:: query(): недопустимое выражение в /wp -content/plugins/woocommerce/includes/libraries/class-emogrifier.php в строке 299

Предупреждение: DOMXPath:: query(): недопустимое выражение в /wp -content/plugins/woocommerce/includes/libraries/class-emogrifier.php в строке 299

Предупреждение: неверный аргумент, предоставленный foreach() в /wp -content/plugins/woocommerce/includes/libraries/class-emogrifier.php в строке 302

Если я удалю эту функцию update_status, это не приведет к ошибкам.

Ответы

Ответ 1

Ошибки, которые вы видите, поступают из системы уведомлений. Ваш код может обновить статус просто отлично. Класс Emogrify используется для создания встроенного CSS в HTML-шаблоне. Вероятно, вы видите эти ошибки, потому что либо A) вы переопределили шаблон электронной почты "Завершенный заказ" и создали ошибку синтаксического анализа, либо B) есть надстройка WooCommerce, которая каким-то образом противоречит тому, что вы делаете.

Чтобы исправить проблему, первым шагом будет проверка того, что это система уведомлений, перейдя в администратор в разделе WooCommerce- > Settings- > Email- > Completed order и отменив флажок "Включить это уведомление по электронной почте"., Затем сохраните это и повторите проверку.

Если ваша ошибка исчезнет, ​​проверьте каталог тем для переопределения этого шаблона. Это было бы в <themename>/woocommerce/emails/customer-completed-order.php. Если он у вас есть, они переименуют его, чтобы он больше не переопределялся и повторно активировал уведомление "Завершенный заказ" и выяснял, исправляет ли этот шаблон по умолчанию.

Если проблема сохраняется с шаблоном уведомлений по умолчанию по умолчанию, отключите все надстройки WooCommerce, которые вы, возможно, установили и протестировали. На этом этапе, если он работает, вы можете повторно включить их один за другим, пока проблема не вернется. После того, как вы обнаружите оскорбительную надстройку, вам необходимо либо настроить свой код, чтобы позволить надстройку не вызывать проблемы, либо связаться с разработчиком надстройки, чтобы решить проблему.

Ответ 2

Я не уверен, но вы можете попробовать этот трюк, используя 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

Как редко, вы должны вручную открыть:

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

Ответ 5

Я понял это, попробовав несколько разных крючков, проблема заключалась в том, что крюк, который я использовал для создания порядка, произошедшего до того, как woocommerce инициализировала то, что вызвало эту проблему.