我正在开发一个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().
2条答案
按热度按时间xhv8bpkk1#
您是否启用了WP_DEBUG模式?如果启用了,我希望看到一些致命错误,如
get_shipping_methods()
不存在或可能“调用非对象上的成员函数”,这两个错误都会使$order
未定义,因此当您var_dump
它时为空。插件在主题之前加载(参见Action Hooks Reference),因此WooCommerce在您的主题被调用时已完全加载。有可能您的插件在WooCommerce加载之前已运行。
我会尝试在以后的钩子上运行您的代码,例如
plugins_loaded
或特定于WooCommerce的woocommerce_loaded
。yzuktlbb2#
原来之前的开发人员错误地迭代了
$items
和取消设置行项目。在经历了许多挫折之后,我修复了line_item vs shipping项目的检测,现在代码可以工作了。然后,这被传递到
$order
对象的所有过滤器,有效地删除了所有运输信息的痕迹。始终检查代码行的行。我确实发现,2个过滤器更改行项目,使对象在调用中保持持久性,这就是为什么它删除了运输信息。