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我已经测试了这一点,找到了问题和解决方案。请参阅我更新的答案。