Woocommerce - Получение цены и количества позиции заказа.

Используя Woocommerce 2.6.8, я не могу получить информацию о данных элемента заказа, как описано в docs и здесь, на SO.

Все, что я хочу, это получить цену и количество позиции, которые должны быть такими простыми, как:

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

Присмотревшись к тому, что возвращается, возвращается

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:{}}
                    )

            )

    )

)

Все это использует документированные методы Woocommerce, почему необходимая мне информация хранится в этом item_meta_array?

Кто-нибудь знает, как я могу получить эту информацию?

Предпочтительно использовать документированные методы, а не грубый обход item_meta_array, пока я не найду ключ, который ищу.

Я чувствую, что здесь не хватает чего-то очевидного.


person robobobobo    schedule 21.11.2016    source источник


Ответы (3)


Обновление (для WooCommerce 3+)

Теперь для кода вы можете использовать WC_Order_Item_Product_ 2_), например:

## 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 ) {

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

    $active_price   = $product->get_price(); // The product active raw price

    $regular_price  = $product->get_sale_price(); // The product raw sale price

    $sale_price     = $product->get_regular_price(); // The product raw regular price

    $product_name   = $item->get_name(); // Get the item name (product name)

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

    $item_subtotal  = $item->get_subtotal(); // Get the item line total non discounted

    $item_subto_tax = $item->get_subtotal_tax(); // Get the item line total tax non discounted

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

    $item_total_tax = $item->get_total_tax(); // Get the item line total  tax discounted

    $item_taxes     = $item->get_taxes(); // Get the item taxes array

    $item_tax_class = $item->get_tax_class(); // Get the item tax class

    $item_tax_status= $item->get_tax_status(); // Get the item tax status

    $item_downloads = $item->get_item_downloads(); // Get the item downloads

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

Обновление: также все следующие WC_Abstract_Order методы позволяют получать данные о заказах с различными интересными опциями, такими как:

// 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) {
     ## Option: Including or excluding Taxes
     $inc_tax = true; 

     ## Option: Round at item level (or not)
     $round   = false; // Not rounded at item level ("true"  for rounding at item level)

     $item_cost_excl_disc = $order->get_item_subtotal( $item, $inc_tax, $round ); // Calculate item cost (not discounted) - useful for gateways.

     $item_cost_incl_disc = $order->get_item_total( $item, $inc_tax, $round ); // Calculate item cost (discounted) - useful for gateways.

     $item_tax_cost       = $order->get_item_tax( $item, $inc_tax, $round ); // Get item tax cost - useful for gateways.

      $item_Line_subtotal = $order->get_line_subtotal( $item, $inc_tax, $round ); // Get line subtotal - not discounted.

     $item_Line_total     = $order->get_line_total( $item, $inc_tax, $round ); // Get line total - discounted

     $item_Line_tax       = $order->get_line_tax( $item ); // Get line tax

     $form_line_subtotal  = $order->get_formatted_line_subtotal( $item, $tax_display = '' ) // Gets line subtotal - formatted for display.
}

Спасибо @Casper за его комментарий


Также можно использовать WC_Data методы для получения данных элемента заказа в виде незащищенного массива. или чтобы получить конкретное вложенное или настраиваемое значение метаданных из определенного мета-ключа:

// 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 ) {
    $order_item_data      = $item->get_data(); // Get WooCommerce order item meta data in an unprotected array
    print_r( $order_item_data ); // display raw data

    $item_meta_data = $item->get_meta_data(); // Get order item nested and custom meta data in an unprotected array
    print_r( $item_meta_data ); // display raw data

    $item_value     = $item->get_meta('meta_key'); // Get specific order item custom or nested meta data value from a meta_key
    print_r( $item_value ); // display raw data (can be a string or an array)
}

Этот код протестирован и работает.

Метод get_item_meta() устарел и был заменен на wc_get_order_item_meta и это больше не метод , а функция с некоторыми параметрами:

/** 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 );

Предыдущие версии woocommerce (от 2.4 до 2.6.x)

Вы можете использовать метод get_item_meta() WC_Abstract_order. , чтобы получить метаданные заказа (количество товара и общую цену товара).

Итак, ваш код будет:

// 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) {
    // Get the product name
    $product_name = $item['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;
}

Этот код протестирован и полностью работоспособен.

Ссылка: Методы класса WC_Abstract_Order

person LoicTheAztec    schedule 21.11.2016
comment
Это работает отлично, также оказалось, что большая часть моего исходного кода тоже работала правильно. Проблема заключалась в том, что я вызывал эти методы до того, как woocommerce был полностью загружен, поэтому нужная информация не возвращалась! Ваш код помог мне понять, что что-то еще не совсем так, наконец-то решите эту проблему, спасибо! - person robobobobo; 22.11.2016
comment
get_item_meta устарела с WC 3.0, вместо этого следует использовать wc_get_order_item_meta - person Tofandel; 11.08.2017
comment
@Tofandel… Как видите, этот ответ был дан до WC 3. Итак, я делаю обновление… спасибо. - person LoicTheAztec; 11.08.2017
comment
get_total() недоступен в классе Wc_Order_Item. См .: docs.woocommerce.com/wc-apidocs/class-WC_Order_Item.html < / а> - person Bas van Dijk; 05.11.2019
comment
ОП четко запрашивает цену товара. Я предлагаю добавить $ order- ›get_item_subtotal ($ item), чтобы получить единичную цену так же, как она используется в мета-полях заказа, но предложение было отклонено. - person Casper; 03.08.2020
comment
@Casper Я сильно обновил свой ответ ... Спасибо. - person LoicTheAztec; 03.08.2020
comment
@LoicTheAztec, возможно, вы имели в виду $item_cost_excl_disc = $order->get_item_subtotal( $item, $inc_tax, $round ) и так далее, поскольку get_item_subtotal и другие вещи основаны на методах из WC_Abstract_Order, поэтому к ним можно получить доступ только как $order->get_.... - person Davide Cavestro; 06.08.2020
comment
@DavideCavestro Упс, да, я забыл $order->… Спасибо. - person LoicTheAztec; 06.08.2020

Стоимость товара может быть получена от order объекта по приведенному ниже коду

$order->get_item_total( $item );
person Nishad Up    schedule 25.06.2017

См. Эту документацию для позиции woocommerce в классе заказа. Здесь < / а>

Вы можете позвонить по номеру, чтобы узнать общую стоимость заказа. Если вы хотите получить стоимость одного товара, взяв product_id

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

Или вы можете это сделать.

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

это будет цена продукта сегодня, а не цена при оформлении заказа. Таким образом, если заказ сделан по цене за единицу 10, а затем цена за единицу изменилась, вы получите новую цену. заказ по-прежнему имеет старую первоначальную цену заказа.

person Hemel    schedule 21.11.2016
comment
Для элемента заказа это нарушит совместимость со многими плагинами, которые динамически изменяют цену оформления заказа / заказа по сравнению с изначально установленными обычными ценами и ценами продажи. Я считаю, что для лучшей перекрестной совместимости лучше использовать $order_item->get_subtotal() или $order_item->get_total(). - person helgatheviking; 17.10.2018