2016-09-08 21 views
5

Tôi đang cố gắng để giải nén mục giá trị meta từ đơn đặt hàng Woocommerce bằng cách sử dụng:Làm cách nào để nhận các id mục đơn hàng để nhận một số dữ liệu meta sản phẩm?

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

Tuy nhiên, tôi không thể tìm thấy một cách để có được order_item_id như tham số đầu tiên (sử dụng 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; 
} 

và tôi có nghĩa là thứ tự này item_id (1 và 2)

Order_item_id in database - Image

Làm thế nào tôi có thể don đó?

Cảm ơn.

Trả lời

8

2018 Cập nhật:

  • Làm rõ câu trả lời với 2 trường hợp xảy ra
  • gia tăng khả năng tương thích cho woocommerce 3+

Vì vậy, Có thể có 2 trường hợp:

1) Lấy dữ liệu meta sản phẩm (chưa xác định trong mục thứ tự dữ liệu meta):

Bạn sẽ cần phải nhận được ID sản phẩm trong vòng lặp foreach cho một WC_Order và để có được một số siêu dữ liệu cho sản phẩm này, bạn wil sử dụng get_post_meta() chức năng (nhưng không wc_get_order_item_meta()).

Vì vậy, đây là mã của bạn:

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) Nhận hàng trật tự dữ liệu meta giá trị (lĩnh vực tùy chỉnh):

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; 
    } 
} 

Nếu dữ liệu lĩnh vực tùy chỉnh là một mảng, bạn có thể truy cập dữ liệu trong vòng lặp foreach:

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

Tất cả mã đều được kiểm tra và hoạt động.

tham khảo liên quan đến dữ liệu trong đơn đặt hàng:

+0

Xin chào, cảm ơn phản hồi của bạn. Tuy nhiên, $ item ['product_id'] chỉ có thể nhận order_id và nó không hữu ích cho tôi. Bạn có thể xem hình ảnh của tôi ở trên (http://i.stack.imgur.com/8OJ7U.jpg). Tất cả những gì tôi có thể nhận được là ID sản phẩm trong cột meta_value (số 90), nhưng những gì tôi cần là số trong order_item_id (1 hoặc 2) để tôi có thể nhận được giá trị của _tmcartepo_data meta_key. Bất kỳ ý tưởng? – camelot

+0

Tôi hiện đang nhận được "Gọi đến một thành viên chức năng get_items() trên boolean" lỗi để gọi get_items() (WP 4.6.1 và WC 2.6.4). Đang cố gắng tìm ra lý do tại sao, nhưng có vẻ như bạn chỉ cho tôi đúng hướng. – camelot

0

Sử dụng <pre><?php print_r($items); ?></pre> này để kiểm tra tất cả nội dung của mảng/đối tượng $ items.

+0

Xin chào, tôi có một mảng với tất cả dữ liệu trong bảng woocommerce_order_itemmeta nhưng không chắc chắn cách lấy giá trị tôi cần. Tôi không biết nếu có anyway để truy cập vào một giá trị meta_key trong mảng này? – camelot

1

muộn để đảng, nhưng được làm việc với cùng một điểm với Plugin bổ sung tùy chọn sản phẩm TM, tôi nghĩ đây là câu trả lời cho câu hỏi của bạn:

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


foreach($items as $item){ 
    $data = unserialize($item['item_meta']['_tmcartepo_data'][0]); 
    $a = $data[0]['value']; 
    $b = $data[1]['value']; 
    echo $a; 
    echo $b; 
} 

Đã kiểm tra và hoạt động trong trường hợp của tôi.

5

Khi thực hiện tìm kiếm trên $order->get_items(), khóa của họ thực sự là ID dòng đơn hàng. Vì vậy:

foreach ($order->get_items() as $key => $item) { 
    $data = wc_get_order_item_meta($key, '_tmcartepo_data'); 
    ... 
} 
0
foreach ($order->get_items() as $key => $item) { 
$data = wc_get_order_item_meta($key, '_tmcartepo_data'); 
... 

Giải pháp này là giá trị với tôi, sự thay đổi "_tmcartepo_data" cho meta_key của bạn.

0

Cách đơn giản để nhận các mục đặt hàng từ cơ sở dữ liệu;

/** 
* @param $order_id 
* 
* @return array|null|object 
*/ 
function get_order_items($order_id) { 
    global $wpdb, $table_prefix; 

    $items  = $wpdb->get_results("SELECT * FROM `{$table_prefix}woocommerce_order_items` WHERE `order_id` = {$order_id}"); 
    $item_name = array(); 

    foreach ($items as $item) { 
     $item_name[] = $item->order_item_name; 
    } 

    return $item_name; 
} 
Các vấn đề liên quan