Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to get order items ids to get some product meta data?

I'm trying to extract item meta value from Woocommerce's orders by using:

$data = wc_get_order_item_meta( $item, '_tmcartepo_data', true );

However, I can't find a way to get order_item_id as the first parameter (using get_items)

global $woocommerce, $post, $wpdb;
$order = new WC_Order($post->ID);
$items = $order->get_items(); 

foreach ( $items as $item ) {
    $item_id = $item['order_item_id']; //???
    $data = wc_get_order_item_meta( $item_id, '_tmcartepo_data', true );
    $a = $data[0]['value'];
    $b = $data[1]['value'];
    echo $a;
    echo $b;
}

And I mean this order item_id (1 and 2)

Order_item_id in database - Image

How can I don that?

Thanks.

like image 841
camelot Avatar asked Sep 08 '16 12:09

camelot


People also ask

How do I order meta data in WooCommerce?

Add product/order meta in WooCommerce invoiceGo to WooCommerce > Invoice/ Packing > Invoice from WordPress dashboard. Move on to the Advanced tab. You can add: Order meta.

How do I find WooCommerce Item ID?

A second option is to head over the Products page in your WordPress Admin. In this listing, you'll find the WooCommerce product ID when you hover over a product name. You can additionally search for your product using the product SKU name or product name and hover over the search results to get the Product ID.

How do I see order details in WooCommerce?

With the get_data() function you can use order data as a array properties for get WooCommerce order details. You can also loop the order items with get_items() function, if you have multiple items in one order.


1 Answers

2018 Update:

  • Clarifying the answer with 2 possible cases
  • Added compatibility for woocommerce 3+

So There can be 2 cases:

1) Get product meta data (not set in order item meta data):

You will need to get the product ID in the foreach loop for a WC_Order and to get some metadata for this product you wil use get_post_meta() function ( but NOT wc_get_order_item_meta() ).

So here is your code:

global $post;
$order = wc_get_order( $post->ID );
$items = $order->get_items(); 

foreach ( $order->get_items() => $item ) {

    // Compatibility for woocommerce 3+
    $product_id = version_compare( WC_VERSION, '3.0', '<' ) ? $item['product_id'] : $item->get_product_id();

    // Here you get your data
    $custom_field = get_post_meta( $product_id, '_tmcartepo_data', true); 

    // To test data output (uncomment the line below)
    // print_r($custom_field);

    // If it is an array of values
    if( is_array( $custom_field ) ){
        echo implode( '<br>', $custom_field ); // one value displayed by line 
    } 
    // just one value (a string)
    else {
        echo $custom_field;
    }
}

2) Get order item meta data (custom field value):

global $post;
$order = wc_get_order( $post->ID );
$items = $order->get_items(); 

foreach ( $order->get_items() as $item_id => $item ) {

    // Here you get your data
    $custom_field = wc_get_order_item_meta( $item_id, '_tmcartepo_data', true ); 

    // To test data output (uncomment the line below)
    // print_r($custom_field);

    // If it is an array of values
    if( is_array( $custom_field ) ){
        echo implode( '<br>', $custom_field ); // one value displayed by line 
    } 
    // just one value (a string)
    else {
        echo $custom_field;
    }
}

If the custom field data is an array, you can access the data in a foreach loop:

// Iterating in an array of keys/values
foreach( $custom_field as $key => $value ){
    echo '<p>key: '.$key.' | value: '.$value.'</p>';
} 

All code is tested and works.

Reference related to data in orders:

  • How to get WooCommerce order details (also for woocommerce 3)
  • Get Order items and WC_Order_Item_Product in Woocommerce 3
like image 129
LoicTheAztec Avatar answered Sep 18 '22 13:09

LoicTheAztec