wordpress 无法从woocommerce扩展订单中获取发货方式,但可以在主题中

lkaoscv7  于 2023-01-16  发布在  WordPress
关注(0)|答案(2)|浏览(195)

我正在开发一个woocommerce扩展,在我的一个类中有下面的代码。

$order = new WC_Order(159); 
$shipping_methods = $order->get_shipping_methods(); 
print_r($shipping_methods);

这将返回一个空数组,如下所示。

[24-Sep-2014 04:05:02 UTC] Array
(
)

如果我在主题中放置完全相同的代码段,则数组将按预期填充并返回以下内容

Array
(
[10] => Array
    (
        [name] => International Delivery
        [type] => shipping
        [item_meta] => Array
            (
                [method_id] => Array
                    (
                        [0] => international_delivery
                    )

                [cost] => Array
                    (
                        [0] => 175
                    )

            )

        [method_id] => international_delivery
        [cost] => 175
    )
)

我试过调试这个,但是我一辈子都找不到我错过了什么。同样的三行代码在主题中工作,但是在插件中不工作。是否有一个全局变量或其他变量我错过了?
编辑:
我正在创建的订单对象已经是一个完成的订单,我只是从中查询信息。我不确定这是否是一个加载问题,如下所示。
另外,当我var_dump $order时,它向我显示了order对象。是否有任何原因导致从WC_Abstract_Order继承的方法在此时不起作用?
WP_DEBUG处于打开状态,未产生错误或警告。
还要注意,这是在一个扩展WC_Email的类中。
编辑2:
我已经找到了在WC_Email的触发器方法中$order对象被弄乱的地方。
调用此筛选器woocommerce_order_get_items会中断$order对象。

add_filter( 'woocommerce_order_get_items', array( $this, 'check_items' ), 10, 2 );

这是我编写的代码行,如果禁用此选项,则可以访问get_shipping_methods().

xhv8bpkk

xhv8bpkk1#

您是否启用了WP_DEBUG模式?如果启用了,我希望看到一些致命错误,如get_shipping_methods()不存在或可能“调用非对象上的成员函数”,这两个错误都会使$order未定义,因此当您var_dump它时为空。
插件在主题之前加载(参见Action Hooks Reference),因此WooCommerce在您的主题被调用时已完全加载。有可能您的插件在WooCommerce加载之前已运行。
我会尝试在以后的钩子上运行您的代码,例如plugins_loaded或特定于WooCommerce的woocommerce_loaded

yzuktlbb

yzuktlbb2#

原来之前的开发人员错误地迭代了$items和取消设置行项目。在经历了许多挫折之后,我修复了line_item vs shipping项目的检测,现在代码可以工作了。
然后,这被传递到$order对象的所有过滤器,有效地删除了所有运输信息的痕迹。始终检查代码行的行。我确实发现,2个过滤器更改行项目,使对象在调用中保持持久性,这就是为什么它删除了运输信息。

相关问题