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

Php Woocommerce:以编程方式更新订单状态,php,wordpress,plugins,woocommerce,orders,Php,Wordpress,Plugins,Woocommerce,Orders,当我尝试在WP\uajaxhook期间以编程方式更新订单时。即 $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 =

当我尝试在
WP\uajax
hook期间以编程方式更新订单时。即

$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\u status
功能,它不会出错。

我不确定,但您可以使用
new WC\u Order($Order\u 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');

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

您看到的错误来自通知系统。您的代码似乎可以很好地更新状态。Emogrify类用于在HTML模板中生成内联CSS。您可能会看到这些错误,因为A)您已覆盖“已完成订单”电子邮件模板并创建了解析错误,或者B)WooCommerce加载项在某种程度上与您正在执行的操作相冲突

要更正此问题,第一步是通过进入WooCommerce->Settings->Email->Completed order下的admin并取消选中“Enable this Email notification”(启用此电子邮件通知)框来验证它是否是通知系统。然后保存并重新测试

如果您的错误消失了,那么检查您的主题目录以覆盖该模板。它将出现在
/woocommerce/emails/customer completed order.php
中。如果您有一个,他们将其重命名,使其不再覆盖,并重新激活“已完成订单”通知,然后查看是否使用默认模板更正问题


如果默认电子邮件通知模板的问题仍然存在,请禁用您可能已安装的所有WooCommerce加载项并重新测试。此时,如果它正在工作,您可以逐个重新启用它们,直到问题返回。一旦发现有问题的加载项,您需要调整代码,以使加载项不会引起问题,或者与加载项开发人员联系以解决问题。

您必须询问,因为这是一个罕见的问题,您最好手动打开:

/wp content/plugins/woocommerce/includes/libraries/class emogrifer.php

在第299行之前,插入这些行,看看您将得到什么:

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

我通过尝试一系列不同的钩子发现了这一点,问题是我用来创建订单的钩子发生在woocommerce初始化之前,这就是导致此问题的原因。

很遗憾,这并没有为我修复错误,但感谢您尝试这一奇怪的问题!向上投票@NicholasKoskowski我在测试您的代码时也没有遇到任何错误…为了真正得到帮助,请用完整的代码和更多的细节更新您的问题。谢谢我用我的一些附加代码尝试了上面的代码,它在我的机器上运行良好,没有任何错误。你能更新上面的完整代码吗?这样我就可以准确地复制它了。如果您能提供WP、WC、浏览器、操作系统的版本详细信息以及这些错误的来源或屏幕截图,这将非常有用。当您创建订单并更改完成状态时,您收到的任何电子邮件,您的订单已创建,但未收到任何关于订单已完成的电子邮件确认否。任何时候有人问一个与插件相关的问题,他们都会被烧死在火刑柱上(顺便说一句,这就是ridiculus)。所以,既然这是一个与WooCommerce相关的问题,那么(出于某些古怪的原因)应该在StackOverflow上或在StackOverflow上询问它。