Wordpress WC_订单项目为空

Wordpress WC_订单项目为空,wordpress,woocommerce,Wordpress,Woocommerce,这很奇怪,我正在调用$order=newwc\u order(52),我得到了一个正确的order对象,但Items数组为空 你知道怎么回事吗 我使用的是WooCommerce 3.4.3。我也认为您所做的应该是有效的,但事实上它是错误的。我阅读了WooCommerce的源代码,这就是WooCommerce的工作方式 if ( ! $order = wc_get_order( $order_id ) ) { return; } $order_items = $order->get_

这很奇怪,我正在调用
$order=newwc\u order(52),我得到了一个正确的order对象,但Items数组为空

你知道怎么回事吗


我使用的是WooCommerce 3.4.3。

我也认为您所做的应该是有效的,但事实上它是错误的。我阅读了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(),因为它使用工厂来创建订单。

我也认为您所做的应该是可行的,但事实上它是错误的。我阅读了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(),因为它使用工厂创建订单。

这里提供的解决方案是正确的。但是,如果您试图在
woocommerce\u new\u order
上获取订单项目,则无法解决您的问题,因为行项目是在触发
woocommerce\u new\u order
挂钩后分配给订单的

我只是在将钩子更改为
woocommerce\u checkout\u order\u处理后才对问题进行排序,如下所示:

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();
}

这里提供的解决方案是正确的。但是,如果您试图在
woocommerce\u new\u order
上获取订单项目,则无法解决您的问题,因为行项目是在触发
woocommerce\u new\u order
挂钩后分配给订单的

我只是在将钩子更改为
woocommerce\u checkout\u order\u处理后才对问题进行排序,如下所示:

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();
}

Try:从订单id=52的wp\U\U订单项目中选择*;我已经试过了,得到了两行、一行和一个装运项目的结果,这对于这个顺序是正确的。您知道如何使用PHP调试器吗?如果是这样,请尝试在includes/Data stores/class-WC-Order-Item-Product-Data-Store.php文件中的WC\u Order\u Item\u Product\u Data\u Store::read()处放置一个断点。这是读取产品订单项目数据的位置。请尝试:从订单id=52的wp\U\U订单项目中选择*;我已经试过了,得到了两行、一行和一个装运项目的结果,这对于这个顺序是正确的。您知道如何使用PHP调试器吗?如果是这样,请尝试在includes/Data stores/class-WC-Order-Item-Product-Data-Store.php文件中的WC\u Order\u Item\u Product\u Data\u Store::read()处放置一个断点。这是读取产品订单项数据的位置。