Woocommerce - 获取订单商品的价格和数量。
Woocommerce - Getting the order item price and quantity.
使用 Woocommerce 2.6.8,我无法获取 docs and .
中描述的订单项目数据信息
我只想获取行项目价格和数量,这应该很简单:
$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
直到找到我正在寻找的密钥。
我觉得我肯定遗漏了一些明显的东西。
请按顺序查看 woocommerce 订单项的文档 class。
Here
您可以致电总计获取订单总成本。
如果要取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 下订单,然后更改单价,您将获得新价格。该订单仍然具有旧的“原始”订单价格..
Update (For WooCommerce 3+)
现在对于代码,您可以使用 WC_Order_Item_Product
(and 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)
}
此代码已经过测试并且有效。
Method get_item_meta()
is deprecated and has been replaced by wc_get_order_item_meta
and it's not anymore a method but a function with some parameters:
/** 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 );
Prior versions of woocommerce (from 2.4 to 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;
}
此代码已经过测试且功能齐全。
商品价格可以通过以下代码从order
对象中获取
$order->get_item_total( $item );
使用 Woocommerce 2.6.8,我无法获取 docs and
我只想获取行项目价格和数量,这应该很简单:
$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
直到找到我正在寻找的密钥。
我觉得我肯定遗漏了一些明显的东西。
请按顺序查看 woocommerce 订单项的文档 class。 Here
您可以致电总计获取订单总成本。 如果要取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 下订单,然后更改单价,您将获得新价格。该订单仍然具有旧的“原始”订单价格..
Update (For WooCommerce 3+)
现在对于代码,您可以使用 WC_Order_Item_Product
(and 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)
}
此代码已经过测试并且有效。
Method
get_item_meta()
is deprecated and has been replaced bywc_get_order_item_meta
and it's not anymore a method but a function with some parameters:
/** 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 );
Prior versions of woocommerce (from 2.4 to 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;
}
此代码已经过测试且功能齐全。
商品价格可以通过以下代码从order
对象中获取
$order->get_item_total( $item );