Starting with WooCommerce 3.0+, a new Object class appears for Order elements . Now Order Order properties cannot be accessed directly, as before WC_Order_Item_Product
So, if you look at your source data, you will see that each position is now an object, and you can access this protected data using exclusively:
WC_Order_Item_Product getters:
$order = wc_get_order(147);
foreach ($order->get_items() as $item_id => $item_obj) {
echo $item_obj->get_type().'<br>';
echo $item_obj->get_product_id().'<br>';
echo $item_obj->get_variation_id().'<br>';
echo $item_obj->get_quantity().'<br>';
echo $item_obj->get_subtotal().'<br>';
echo $item_obj->get_total().'<br>';
echo '<pre>'; print_r( $item_obj->get_product() ); echo '</pre>';
}
wc_get_order_item_meta(). wp_woocommerce_order_itemmeta meta_key ( line_item ):
$order = wc_get_order(147);
foreach ($order->get_items() as $item_id => $item_obj) {
echo wc_get_order_item_meta( $item_id, '_product_id', true). '<br>';
echo wc_get_order_item_meta( $item_id, '_variation_id', true). '<br>';
echo wc_get_order_item_meta( $item_id, '_qty', true). '<br>';
echo wc_get_order_item_meta( $item_id, '_line_subtotal', true). '<br>';
}
WC_Data ( get_data()):
$order = wc_get_order(147);
foreach ($order->get_items() as $item_id => $item_obj) {
$item_data = $item_obj->get_data();
echo $item_data['id'].'<br>';
echo $item_data['order_id'].'<br>';
echo $item_data['product_id'].'<br>';
echo $item_data['variation_id'].'<br>';
echo $item_data['name'].'<br>';
echo $item_data['quantity'].'<br>';
echo $item_data['subtotal'].'<br>';
echo $item_data['total'].'<br>';
: WooCommerce