2016-11-21 27 views
8

Sử dụng Woocommerce 2.6.8, tôi không thể nhận được thông tin Dữ liệu của Đơn đặt hàng như được mô tả trong docshere on SO.Woocommerce - Nhận đơn đặt hàng giá và số lượng.

Tất cả tôi muốn là để có được giá mục dòng và Số lượng, mà phải là đơn giản như:

$order = new WC_Order($order_id); 
$order_items = $order->get_items(); 
foreach ($order_items as $items_key => $items_value) { 
      echo $items_value['name']; //this works 
      echo $items_value['qty']; //this doesn't work 
      echo $items_value[item_meta][_qty][0]; //also doesn't work 
      echo $items_value['line_total']; //this doesn't work 
    } 

Nhìn kỹ hơn những gì được trả về có trở

Array 
(
[1] => Array 
    (
     [name] => Sample Product 1 
     [type] => line_item 
     [item_meta] => 
     [item_meta_array] => Array 
      (
       [1] => stdClass Object 
        (
         [key] => _qty 
         [value] => 1 
        ) 

       [2] => stdClass Object 
        (
         [key] => _tax_class 
         [value] => 
        ) 

       [3] => stdClass Object 
        (
         [key] => _product_id 
         [value] => 8 
        ) 

       [4] => stdClass Object 
        (
         [key] => _variation_id 
         [value] => 0 
        ) 

       [5] => stdClass Object 
        (
         [key] => _line_subtotal 
         [value] => 50 
        ) 

       [6] => stdClass Object 
        (
         [key] => _line_total 
         [value] => 50 
        ) 

       [7] => stdClass Object 
        (
         [key] => _line_subtotal_tax 
         [value] => 0 
        ) 

       [8] => stdClass Object 
        (
         [key] => _line_tax 
         [value] => 0 
        ) 

       [9] => stdClass Object 
        (
         [key] => _line_tax_data 
         [value] => a:2:{s:5:"total";a:0:{}s:8:"subtotal";a:0:{}} 
        ) 

      ) 

    ) 

) 

Đây là tất cả bằng cách sử dụng tài liệu Phương pháp Woocommerce, tại sao thông tin tôi cần được lưu trữ trong số item_meta_array này?

Có ai biết cách tôi có thể nhận thông tin đó không?

Tốt hơn là sử dụng các phương pháp đã được làm tài liệu trái ngược với việc hack thô vòng lặp qua item_meta_array cho đến khi tôi tìm thấy khóa mà tôi đang tìm kiếm.

Tôi cảm thấy mình phải thiếu điều gì đó hiển nhiên ở đây.

Trả lời

16

Cập nhật (Đối với WooCommerce 3+)

Bây giờ cho các mã bạn có thể sử dụng WC_Order_Item_Product (và WC_Product) phương pháp thay vào đó, như:

## For WooCommerce 3+ ## 

// Getting an instance of the WC_Order object from a defined ORDER ID 
$order = wc_get_order($order_id); 

// Iterating through each "line" items in the order 
foreach ($order->get_items() as $item_id => $item_data) { 

    // Get an instance of corresponding the WC_Product object 
    $product = $item_data->get_product(); 
    $product_name = $product->get_name(); // Get the product name 

    $item_quantity = $item_data->get_quantity(); // Get the item quantity 

    $item_total = $item_data->get_total(); // Get the item line total 

    // Displaying this data (to check) 
    echo 'Product name: '.$product_name.' | Quantity: '.$item_quantity.' | Item total: '. number_format($item_total, 2); 
} 

Mã này được kiểm tra và hoạt động.

Phương pháp get_item_meta() bị phản đối và đã được thay thế bởi wc_get_order_item_meta và nó không nữa một phương pháp nhưng một hàm với một số thông số:

/** Parameters summary 
* @param mixed $item_id 
* @param mixed $key 
* @param bool $single (default: true) 
* @return mixed 
*/ 

wc_get_order_item_meta($item_id, $key, $single = true); 

các phiên bản trước của woocommerce (từ 2,4 đến 2,6.x)

Bạn có thể sử dụng phương pháp get_item_meta() WC_Abstract_order để nhận siêu dữ liệu đơn hàng (tổng số mặt hàng và tổng giá mặt hàng).

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

// Getting the order object "$order" 
$order = wc_get_order($order_id); 
// Getting the items in the order 
$order_items = $order->get_items(); 
// Iterating through each item in the order 
foreach ($order_items as $item_id => $item_data) { 
    // Get the product name 
    $product_name = $item_data['name']; 
    // Get the item quantity 
    $item_quantity = $order->get_item_meta($item_id, '_qty', true); 
    // Get the item line total 
    $item_total = $order->get_item_meta($item_id, '_line_total', true); 

    // Displaying this data (to check) 
    echo 'Product name: '.$product_name.' | Quantity: '.$item_quantity.' | Item total: '. $item_total; 
} 

Mã này đã được thử nghiệm và đầy đủ chức năng.

tham khảo: Class WC_Abstract_Order Methods

+0

này hoạt động hoàn hảo, cũng hóa ra hầu hết các mã ban đầu của tôi làm việc một cách chính xác quá. Vấn đề là tôi đã gọi những phương pháp này trước khi woocommerce được nạp đầy đủ để thông tin đúng không được trả lại! Mã của bạn đã giúp tôi nhận ra rằng cái gì đó khác không hoàn toàn đúng, cuối cùng nó đã được giải quyết ngay bây giờ, cảm ơn bạn! – robobobobo

+0

get_item_meta không được dùng như WC 3.0, wc_get_order_item_meta nên được sử dụng thay vì – Tofandel

+1

@Tofandel… Như bạn có thể thấy câu trả lời này là maid trước WC 3. Vì vậy, tôi thực hiện một bản cập nhật sau đó ... cảm ơn. – LoicTheAztec

1

Vui lòng xem tài liệu này cho mục hàng woocommerce trong lớp đơn đặt hàng. Here

Bạn có thể gọi tổng cộng để nhận tổng chi phí đơn đặt hàng. Nếu bạn muốn lấy lại chi phí mục duy nhất bằng cách lấy product_id

$_product = wc_get_product($product_id); 
$Price = $_product->get_price(); 

Hoặc bạn có thể làm điều này.

$price = get_post_meta(get_the_ID(), '_regular_price', true); 
$price = get_post_meta(get_the_ID(), '_sale_price', true); 
1

Giá mặt hàng có thể nhận được từ order đối tượng bằng cách mã bên dưới

$order->get_item_total($item); 
Các vấn đề liên quan