it-roy-ru.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 (): неверное выражение в /wp-content/plugins/woocommerce/include/libraries/class-emogrifier.php в строке 299.

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

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

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

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

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

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

15
Nicholas Koskowski

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

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

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

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

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
Nicholas Koskowski