【问题标题】:Woocommerce - Getting the order item price and quantity.Woocommerce - 获取订单商品的价格和数量。
【发布时间】:2017-04-04 07:35:24
【问题描述】:

使用 Woocommerce 2.6.8 时,我无法获得 docshere on SO 中所述的订单商品数据信息。

我想要的只是获取 Line Item 的价格和数量,应该很简单:

$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 直到找到我要查找的密钥。

我觉得我必须在这里遗漏一些明显的东西。

【问题讨论】:

    标签: php wordpress woocommerce items orders


    【解决方案1】:

    更新(对于 WooCommerce 3+)

    现在对于代码,您可以改用WC_Order_Item_Product(和WC_Product)方法,例如:

    ## 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->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 methods 允许通过各种有趣的选项获取订单商品数据,例如:

    // 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) {
         ## 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 methods 以不受保护的数组形式获取订单商品数据,或从特定元键获取特定的嵌套或自定义元数据值:

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

    此代码经过测试且功能齐全。

    参考:Class WC_Abstract_Order Methods

    【讨论】:

    • 这很好用,而且我的大部分原始代码也能正常工作。问题是我在 woocommerce 满载之前调用了这些方法,因此没有返回正确的信息!您的代码帮助我意识到其他地方不太对劲,现在终于解决了,谢谢!
    • get_item_meta 自 WC 3.0 起已弃用,应改为使用 wc_get_order_item_meta
    • @Tofandel ......正如你所看到的,这个答案在 WC 3 之前一直是女仆。所以我做了更新......谢谢。
    • @BasvanDijk 但是get_total() 方法可用于WC_Order_Item_Product,这是订单“行”项目所涉及的主要类,因为WooCommerce 3......请参阅:docs.woocommerce.com/wc-apidocs/…
    • @Casper 我已经大大更新了我的答案......谢谢。
    【解决方案2】:

    请参阅此文档以了解订单类中的 woocommerce 订单项。 Here

    您可以调用 total 以获取总订单成本。 如果您想通过 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 下订单,然后更改单价,您将获得新价格。该订单仍然具有旧的“原始”订单价格..

    【讨论】:

    • 对于订单商品,这将破坏与许多插件的兼容性,这些插件会从最初设置的正常价格和销售价格动态更改结帐/订单价格。为了更好的交叉兼容性,我认为最好使用$order_item->get_subtotal()$order_item->get_total()
    【解决方案3】:

    商品价格可以通过以下代码从order对象获取

    $order->get_item_total( $item );
    

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 2018-10-14
      • 2021-04-02
      • 2018-11-24
      • 2017-09-17
      • 2018-01-24
      • 2019-02-23
      • 2021-07-24
      • 2013-10-16
      相关资源
      最近更新 更多