在Woocommerce 3中访问订单项受保护的数据

时间:2017-04-24 20:50:25

标签: php wordpress class woocommerce orders

我正在尝试获取订单的订单项。

我这样做:

$order = new WC_Order(147);
foreach ($order->get_items() as $key => $lineItem) {
    print_r('<pre>----');
    print_r($lineItem);
    print_r('----</pre>');
}

我可以看到我需要的所有数据,但数组显示了这个:

[meta_data:protected] => Array

如何访问此数组以获取值?

感谢。

2 个答案:

答案 0 :(得分:20)

  

自订购商品的WooCommerce 3.0+以来,有新的对象类WC_Order_Item_Product   现在无需像以前那样直接访问订单商品属性

因此,如果您查看输出原始数据,您将看到每个行项目现在都是一个对象,您将能够使用以下方式访问该受保护数据:

  1. WC_Order_Item_Product getters方法(或使用setter方法更改它)...
  2. WC_Order_Item get_formatted_meta_data( '', true ) 方法可访问所有元数据。它提供了一组可访问的对象。请参阅WC_Data方法 get_meta() 以访问每个元数据。
  3. WC_Data getters方法取消保护此数据并使用方法通过数组访问它:
    • get_data() (此方法非常有用)
    • get_meta() (此方法最有用)
    • get_data_keys()
    • get_meta_data() 不取消保护数据,使用get_formatted_meta_data()
  4. wc_get_order_item_meta()专用功能。
  5. WC_Order_Item_Product getters方法

    // Get an instance of the WC_Order object
    $order = wc_get_order(147);
    
    // Iterating through each order item
    foreach ($order->get_items() as $item_id => $item ) {
        echo $item->get_type().'<br>'; // The order item type
        echo $item->get_product_id().'<br>'; // The Product ID
        echo $item->get_variation_id().'<br>'; // The variation ID
        echo $item->get_quantity().'<br>'; // Line item quantity
        echo $item->get_subtotal().'<br>'; // Line item subtotal
        echo $item->get_total().'<br>'; // Line item total
    
        // The associated product object (which properties can't be accessed directly too)
        echo '<pre>'; print_r( $item->get_product() ); echo '</pre>'; 
    
        // ... and so on ...
    
        ## Testing raw output (protected)
        // echo '<pre>'; print_r($item); echo '</pre>';
    }
    

    wc_get_order_item_meta()功能。在这里,您可以进入 wp_woocommerce_order_itemmeta 表,并使用相应的 meta_key (针对line_item数据类型输出商品ID的所有数据商品ID):

    // Get an instance of the WC_Order object
    $order = wc_get_order(147);
    
    // Iterating through each order item
    foreach ($order->get_items() as $item_id => $item ) {
    
        echo wc_get_order_item_meta( $item_id, '_product_id', true). '<br>'; // Product ID
        echo wc_get_order_item_meta( $item_id, '_variation_id', true). '<br>'; // Variation ID
        echo wc_get_order_item_meta( $item_id, '_qty', true). '<br>'; // quantity
        echo wc_get_order_item_meta( $item_id, '_line_subtotal', true). '<br>'; // Line subtotal
    
        // ... and so on ...
    
        ## Testing raw output (protected data)
        // echo '<pre>'; print_r($item); echo '</pre>';
    }
    

    WC_Data方法get_data()方法(取消保护数组中的数据):

    // Get an instance of the WC_Order object
    $order = wc_get_order(147);
    
    // Iterating through each order item
    foreach ($order->get_items() as $item_id => $item ) {
    
        // Get the most useful Item product data in an accessible array
        $item_data = $item->get_data();
    
        echo $item_data['id'].'<br>'; // The order item ID
        echo $item_data['order_id'].'<br>'; // The order ID
        echo $item_data['product_id'].'<br>'; // The Product ID
        echo $item_data['variation_id'].'<br>'; // The Variation ID
        echo $item_data['name'].'<br>'; // The Product title (name)
        echo $item_data['quantity'].'<br>'; // Line item quantity
        echo $item_data['subtotal'].'<br>'; // Line item subtotal
        echo $item_data['total'].'<br>'; // Line item total
    
        // ... and so on ...
    

    WC_Data方法get_meta()方法(通过元键访问每个属性):

    // Get an instance of the WC_Order object
    $order = wc_get_order(147);
    
    // Iterating through each order item
    foreach ($order->get_items() as $item_id => $item ) {
    
        echo $item->get_meta('_product_id').'<br>'; // The Product ID
        echo $item->get_meta('_variation_id').'<br>'; // The Variation ID
        echo $item->get_meta('_qty').'<br>'; // Line item quantity
        echo $item->get_meta('_line_subtotal').'<br>'; // Line item subtotal
        echo $item->get_meta('_line_subtotal_tax').'<br>'; // Line item subtotal tax
        echo $item->get_meta('_line_total').'<br>'; // Line item total
        echo $item->get_meta('_line_tax').'<br>'; // Line item total tax
    
        // Product attributes for variation
        echo $item->get_meta('pa_color').'<br>'; // Color
        echo $item->get_meta('pa_size').'<br>'; // Color
    
        // Custom item meta gata
        echo $item->get_meta('custom_meta_key').'<br>'; // custom meta key visible
        echo $item->get_meta('_custom_meta_key').'<br>'; // custom meta key not visible
    
    
        // ... and so on ...
    

    相关:How to get WooCommerce order details

答案 1 :(得分:1)

获取[meta_data:protected] => Array的数据您需要使用其他方法。

只需使用此$item_obj->get_meta_data();

即可

获取它们的更详细方法,按如下方式迭代它们两次:

  $order = wc_get_order( $order_id );
  foreach ($order->get_items() as $item_id => $item_obj) {

         $kua = $item_obj->get_meta_data();

         foreach ($kua as $key => $value) {
            foreach ($value as $key2 => $value2) {
               echo $key2.'->'.$value2.'<br>';
            }
        }
  }

方法的集合位于here