Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php WC_订单->;get_items()返回空项_Php_Wordpress_Woocommerce_Orders_Woocommerce Subscriptions - Fatal编程技术网

Php WC_订单->;get_items()返回空项

Php WC_订单->;get_items()返回空项,php,wordpress,woocommerce,orders,woocommerce-subscriptions,Php,Wordpress,Woocommerce,Orders,Woocommerce Subscriptions,使用钩子'woocommerce\u order\u status\u completed'我可以获取$order\u id然后使用$order=WC\u get\u order($order\u id)获取WC\u order对象。但是下面的$logger->add(“发送订单调试”),json\u encode($order->get\u items())返回空的项目对象 {"257":{},"258":{},"259":{}} 我不知道为什么会发生这种情况,因为我可以从woocommer

使用钩子
'woocommerce\u order\u status\u completed'
我可以获取
$order\u id
然后使用
$order=WC\u get\u order($order\u id)
获取WC\u order对象。但是下面的
$logger->add(“发送订单调试”),json\u encode($order->get\u items())
返回空的项目对象

{"257":{},"258":{},"259":{}}
我不知道为什么会发生这种情况,因为我可以从woocommerce订单页面看到,这张订单中有实际的商品。有人知道发生了什么吗

我的最终目标是筛选出属于“订阅”类别的产品,但如果我不能执行
$item->get_product\u id

function send_order($order_id) {
    $order = wc_get_order($order_id);
    $logger = wc_get_logger();
    $logger->add("send-order-debug", json_encode($order->get_items()));
}

订单对象的内容:

更新1:

您不能在
$order->get_items()
上使用
json_encode()
,因为您总是会为每个订单项目获得类似
“257”:{}
(其中
257
是项目ID)。因此
json_encode()
无法编码项目数组中的每个订单项目数据,因为订单项目受到保护

现在,对订单项目进行JSON编码的唯一方法是使用
WC_Data
方法
get_Data()
取消对每个订单项目的保护,并将其设置回订单项目数组中

这可以通过使用
array\u map()
和自定义函数(如:

add_action( 'woocommerce_order_status_completed', 'send_order', 10, 2 );
function send_order( $order_id, $order ) {
    // Unprotect each order item in the array of order items
    $order_items_data = array_map( function($item){ return $item->get_data(); }, $order->get_items() );

    $logger = wc_get_logger();
    $logger->add("send-order-debug", json_encode($order_items_data));
}
现在它起作用了


原始答案

WC_Order对象已经是
woocommerce_Order_status_completed
hook中包含的参数,因此在代码中它应该是:

add_action( 'woocommerce_order_status_completed', 'send_order', 10, 2 );
function send_order( $order_id, $order ) {
    $order_items = $order->get_items();
}
行得通……看

因此,问题可能与您尝试使用以下方式发送订单项目有关:

$logger->add($TAG, json_encode($order->get_items()));
但由于您的代码不可测试,因此无法提供帮助:
$logger
$TAG
变量未在代码中定义

现在,要针对订阅产品,您将使用以下内容:

// Loop through order items
foreach( $order->get_items() as $item ) {
    $product = $item->get_product(); // get the WC_Product Object
    
    // Targeting subscription products only
    if ( in_array( $product->get_type(), ['subscription', 'subscription_variation'] ) ) {
        // Do something
    }
}

我非常感谢您的详细回复,但它似乎仍然不起作用。我尝试使用附带的WC_顺序,但问题仍然存在。
$logger
仅用于调试目的。我将更新我的问题以包括以下内容:
$logger=WC_get_logger()
$TAG=“send Order debug”
。在创建WC\u订单时,似乎问题就发生了。当我打印WC\u订单内容时,
行项目
看起来乱七八糟:
“行项目”:{“257”:{},“258”:{},“259”:{}
@DallinDavis我已经测试了这一点,找到了问题和解决方案。请参阅我更新的答案。