这很奇怪,我打电话给$order = new WC_Order(52);
,我得到了正确的订单对象,但Items数组为空。
任何想法出了什么问题?
我正在使用WooCommerce 3.4.3。
答案 0 :(得分:1)
我还认为您的工作应该可以,但实际上是错误的。我阅读了WooCommerce源代码,这就是WooCommerce的工作方式。
if ( ! $order = wc_get_order( $order_id ) ) {
return;
}
$order_items = $order->get_items( apply_filters( 'woocommerce_purchase_order_item_types', 'line_item' ) );
$ order-> get_items()调用将检查是否已从数据存储中读取该行项目,如果尚未读取,则将其读取。因此,新的WC_Order(52)实际上仅部分初始化了order对象。通过订单访问订单项时,它们将在以后初始化。因为不使用的项目不会被初始化,所以这可能更有效。请注意,订单是使用wc_get_order()函数创建的。您应该这样做,而不要使用新的WC_Order(),因为这会使用工厂来创建订单。
答案 1 :(得分:0)
此处提供的解决方案是正确的。但是,如果您尝试在 woocommerce_new_order
上获取订单项,它不会解决您的问题,因为在触发 woocommerce_new_order
挂钩后将订单项分配给订单。
在我将钩子更改为 woocommerce_checkout_order_processed
后,我才设法对我的问题进行排序:
add_action( 'woocommerce_checkout_order_processed', 'get_order_items_on_checkout', 50, 3 );
function get_order_items_on_checkout($order_id, $posted_data, $order){
$items = $order->get_items();
}