Woocommerce:以编程方式更新订单状态

时间:2016-06-15 23:55:48

标签: php wordpress plugins woocommerce orders

当我尝试在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函数,则不会出错。

5 个答案:

答案 0 :(得分:5)

您看到的错误来自通知系统。您的代码似乎能够更新状态。 Emogrify类用于在HTML模板中生成内联CSS。您可能会看到这些错误,因为A)您已覆盖"已完成订单"电子邮件模板并创建了一个解析错误或B)有一个WooCommerce附加组件,它与您正在做的事情有某种冲突。

要解决此问题,第一步是通过进入WooCommerce-> Settings-> Email->已完成订单下的管理员并取消选中"来验证它是否是通知系统。启用此电子邮件通知"框。然后保存并重新测试。

如果您的错误消失,请检查您的主题目录是否覆盖该模板。它将在<themename>/woocommerce/emails/customer-completed-order.php。如果你有一个,他们将其重命名,以便它不再覆盖并重新激活&#34;完成的订单&#34;通知并查看是否使用默认模板更正了问题。

如果问题仍然存在于默认电子邮件通知模板中,请禁用您可能已安装并重新测试的所有WooCommerce附加组件。此时,如果它正常工作,您可以逐个重新启用它们,直到问题返回。找到违规插件后,您需要调整代码以允许插件不会导致问题,或者与附加开发人员联系以解决您的问题。

答案 1 :(得分:4)

我不确定但您可以使用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');

我同意这是一个奇怪的问题。

答案 2 :(得分:2)

你必须在Wordpress.Stackexchange.com

上问这个问题

答案 3 :(得分:1)

由于这是罕见的问题,您最好手动打开:

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

答案 4 :(得分:0)

我通过尝试一系列不同的钩子来解决这个问题,问题是我在创建订单时使用的钩子是在woocommerce初始化之前发生的,这导致了这个问题。