【问题标题】:Woocommerce: Programmatically Updating Order StatusWoocommerce:以编程方式更新订单状态
【发布时间】:2016-10-17 06:59:41
【问题描述】:

当我尝试在 WP_Ajax 挂钩期间以编程方式更新订单时。即。

$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 函数,它不会出错。

【问题讨论】:

  • 我用我的一些附加代码尝试了上面的代码,它在我的机器上运行良好,没有任何错误。您能否更新上面的完整代码,以便我可以准确地复制它。如果您能提供 WP、WC、浏览器、操作系统的版本详细信息以及出现这些错误的位置或截图,将会很有帮助。
  • 您在创建订单并更改状态完成时收到任何电子邮件,您的订单已创建但未收到任何有关订单已完成的电子邮件确认

标签: php wordpress plugins woocommerce orders


【解决方案1】:

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

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

如果您的错误消失,请检查您的主题目录以覆盖该模板。它将位于<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');
    

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

    【讨论】:

    • 不幸的是,这并没有为我解决错误,但感谢您尝试解决如此奇怪的问题!点赞!
    • @NicholasKoskowski 我在测试您的代码时也没有遇到任何错误……请,要真正获得帮助,请使用完整代码和更多详细信息更新您的问题。谢谢
    【解决方案3】:

    你必须在Wordpress.Stackexchange.com上问这个问题

    【讨论】:

    • 不。每当有人在那里提出与插件相关的问题时,他们都会被烧死(顺便说一句,这是可笑的)。因此,由于这是与 WooCommerce 相关的问题,因此应该(出于某种奇怪的原因)在 StackOverflow 上询问。
    • 这不是答案,应该是评论。
    【解决方案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 初始化导致此问题的原因之前。

      【讨论】:

        猜你喜欢
        • 2013-03-19
        • 2017-01-27
        • 2017-07-16
        • 2017-05-24
        • 1970-01-01
        • 2016-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多