In early 2008 when I started working in WordPress/WooCommerce I hardly know StackOverflow and WooCommerce API, so I had to write several API for some of our web service. Then I had written this function to get order details by order/post ID. Hope this function will be helpful for you as well.
WooCommerce 3.x
or above
<?php
if (!function_exists(‘getOrderDetailById’)) {
//to get full order details
function getOrderDetailById($id, $fields = null, $filter = array()) {
if (is_wp_error($id))
return false;
// Get the decimal precession
$dp = (isset($filter[‘dp’])) ? intval($filter[‘dp’]) : 2;
$order = wc_get_order($id); //getting order Object
if ($order === false)
return false;
$order_data = array(
‘id’ => $order->get_id(),
‘order_number’ => $order->get_order_number(),
‘created_at’ => $order->get_date_created()->date(‘Y-m-d H:i:s’),
‘updated_at’ => $order->get_date_modified()->date(‘Y-m-d H:i:s’),
‘completed_at’ => !empty($order->get_date_completed()) ? $order->get_date_completed()->date(‘Y-m-d H:i:s’) : ”,
‘status’ => $order->get_status(),
‘currency’ => $order->get_currency(),
‘total’ => wc_format_decimal($order->get_total(), $dp),
‘subtotal’ => wc_format_decimal($order->get_subtotal(), $dp),
‘total_line_items_quantity’ => $order->get_item_count(),
‘total_tax’ => wc_format_decimal($order->get_total_tax(), $dp),
‘total_shipping’ => wc_format_decimal($order->get_total_shipping(), $dp),
‘cart_tax’ => wc_format_decimal($order->get_cart_tax(), $dp),
‘shipping_tax’ => wc_format_decimal($order->get_shipping_tax(), $dp),
‘total_discount’ => wc_format_decimal($order->get_total_discount(), $dp),
‘shipping_methods’ => $order->get_shipping_method(),
‘order_key’ => $order->get_order_key(),
‘payment_details’ => array(
‘method_id’ => $order->get_payment_method(),
‘method_title’ => $order->get_payment_method_title(),
‘paid_at’ => !empty($order->get_date_paid()) ? $order->get_date_paid()->date(‘Y-m-d H:i:s’) : ”,
),
‘billing_address’ => array(
‘first_name’ => $order->get_billing_first_name(),
‘last_name’ => $order->get_billing_last_name(),
‘company’ => $order->get_billing_company(),
‘address_1’ => $order->get_billing_address_1(),
‘address_2’ => $order->get_billing_address_2(),
‘city’ => $order->get_billing_city(),
‘state’ => $order->get_billing_state(),
‘formated_state’ => WC()->countries->states[$order->get_billing_country()][$order->get_billing_state()], //human readable formated state name
‘postcode’ => $order->get_billing_postcode(),
‘country’ => $order->get_billing_country(),
‘formated_country’ => WC()->countries->countries[$order->get_billing_country()], //human readable formated country name
’email’ => $order->get_billing_email(),
‘phone’ => $order->get_billing_phone()
),
‘shipping_address’ => array(
‘first_name’ => $order->get_shipping_first_name(),
‘last_name’ => $order->get_shipping_last_name(),
‘company’ => $order->get_shipping_company(),
‘address_1’ => $order->get_shipping_address_1(),
‘address_2’ => $order->get_shipping_address_2(),
‘city’ => $order->get_shipping_city(),
‘state’ => $order->get_shipping_state(),
‘formated_state’ => WC()->countries->states[$order->get_shipping_country()][$order->get_shipping_state()], //human readable formated state name
‘postcode’ => $order->get_shipping_postcode(),
‘country’ => $order->get_shipping_country(),
‘formated_country’ => WC()->countries->countries[$order->get_shipping_country()] //human readable formated country name
),
‘note’ => $order->get_customer_note(),
‘customer_ip’ => $order->get_customer_ip_address(),
‘customer_user_agent’ => $order->get_customer_user_agent(),
‘customer_id’ => $order->get_user_id(),
‘view_order_url’ => $order->get_view_order_url(),
‘line_items’ => array(),
‘shipping_lines’ => array(),
‘tax_lines’ => array(),
‘fee_lines’ => array(),
‘coupon_lines’ => array(),
);
//getting all line items
foreach ($order->get_items() as $item_id => $item) {
$product = $item->get_product();
$product_id = null;
$product_sku = null;
// Check if the product exists.
if (is_object($product)) {
$product_id = $product->get_id();
$product_sku = $product->get_sku();
}
$order_data[‘line_items’][] = array(
‘id’ => $item_id,
‘subtotal’ => wc_format_decimal($order->get_line_subtotal($item, false, false), $dp),
‘subtotal_tax’ => wc_format_decimal($item[‘line_subtotal_tax’], $dp),
‘total’ => wc_format_decimal($order->get_line_total($item, false, false), $dp),
‘total_tax’ => wc_format_decimal($item[‘line_tax’], $dp),
‘price’ => wc_format_decimal($order->get_item_total($item, false, false), $dp),
‘quantity’ => wc_stock_amount($item[‘qty’]),
‘tax_class’ => (!empty($item[‘tax_class’]) ) ? $item[‘tax_class’] : null,
‘name’ => $item[‘name’],
‘product_id’ => (!empty($item->get_variation_id()) && (‘product_variation’ === $product->post_type )) ? $product->get_parent_id() : $product_id,
‘variation_id’ => (!empty($item->get_variation_id()) && (‘product_variation’ === $product->post_type )) ? $product_id : 0,
‘product_url’ => get_permalink($product_id),
‘product_thumbnail_url’ => wp_get_attachment_image_src(get_post_thumbnail_id($product_id), ‘thumbnail’, TRUE)[0],
‘sku’ => $product_sku,
‘meta’ => wc_display_item_meta($item, [‘echo’ => false])
);
}
//getting shipping
foreach ($order->get_shipping_methods() as $shipping_item_id => $shipping_item) {
$order_data[‘shipping_lines’][] = array(
‘id’ => $shipping_item_id,
‘method_id’ => $shipping_item[‘method_id’],
‘method_title’ => $shipping_item[‘name’],
‘total’ => wc_format_decimal($shipping_item[‘cost’], $dp),
);
}
//getting taxes
foreach ($order->get_tax_totals() as $tax_code => $tax) {
$order_data[‘tax_lines’][] = array(
‘id’ => $tax->id,
‘rate_id’ => $tax->rate_id,
‘code’ => $tax_code,
‘title’ => $tax->label,
‘total’ => wc_format_decimal($tax->amount, $dp),
‘compound’ => (bool) $tax->is_compound,
);
}
//getting fees
foreach ($order->get_fees() as $fee_item_id => $fee_item) {
$order_data[‘fee_lines’][] = array(
‘id’ => $fee_item_id,
‘title’ => $fee_item[‘name’],
‘tax_class’ => (!empty($fee_item[‘tax_class’]) ) ? $fee_item[‘tax_class’] : null,
‘total’ => wc_format_decimal($order->get_line_total($fee_item), $dp),
‘total_tax’ => wc_format_decimal($order->get_line_tax($fee_item), $dp),
);
}
//getting coupons
foreach ($order->get_items(‘coupon’) as $coupon_item_id => $coupon_item) {
$order_data[‘coupon_lines’][] = array(
‘id’ => $coupon_item_id,
‘code’ => $coupon_item[‘name’],
‘amount’ => wc_format_decimal($coupon_item[‘discount_amount’], $dp),
);
}
return array(‘order’ => apply_filters(‘woocommerce_api_order_response’, $order_data, $order, $fields));
}
}
WooCommerce 2.6.x
or below
<?php
if (!function_exists(‘getOrderDetailById’)) {
function getOrderDetailById($id, $fields = null, $filter = array()) {
if (is_wp_error($id))
return $id;
// Get the decimal precession
$dp = isset($filter[‘dp’]) ? intval($filter[‘dp’]) : 2;
$order = wc_get_order($id);
$order_post = get_post($id);
$order_data = array(
‘id’ => $order->id,
‘order_number’ => $order->get_order_number(),
‘created_at’ => $order_post->post_date,
‘updated_at’ => $order_post->post_modified,
‘completed_at’ => !empty($order->completed_date) ? $order->completed_date : ”,
‘status’ => $order->get_status(),
‘currency’ => $order->get_order_currency(),
‘total’ => wc_format_decimal($order->get_total(), $dp),
‘subtotal’ => wc_format_decimal($order->get_subtotal(), $dp),
‘total_line_items_quantity’ => $order->get_item_count(),
‘total_tax’ => wc_format_decimal($order->get_total_tax(), $dp),
‘total_shipping’ => wc_format_decimal($order->get_total_shipping(), $dp),
‘cart_tax’ => wc_format_decimal($order->get_cart_tax(), $dp),
‘shipping_tax’ => wc_format_decimal($order->get_shipping_tax(), $dp),
‘total_discount’ => wc_format_decimal($order->get_total_discount(), $dp),
‘shipping_methods’ => $order->get_shipping_method(),
‘order_key’ => $order->order_key,
‘payment_details’ => array(
‘method_id’ => $order->payment_method,
‘method_title’ => $order->payment_method_title,
‘paid_at’ => !empty($order->paid_date) ? $order->paid_date : ”,
),
‘billing_address’ => array(
‘first_name’ => $order->billing_first_name,
‘last_name’ => $order->billing_last_name,
‘company’ => $order->billing_company,
‘address_1’ => $order->billing_address_1,
‘address_2’ => $order->billing_address_2,
‘city’ => $order->billing_city,
‘state’ => $order->billing_state,
‘formated_state’ => WC()->countries->states[$order->billing_country][$order->billing_state], //human readable formated state name
‘postcode’ => $order->billing_postcode,
‘country’ => $order->billing_country,
‘formated_country’ => WC()->countries->countries[$order->billing_country], //human readable formated country name
’email’ => $order->billing_email,
‘phone’ => $order->billing_phone,
),
‘shipping_address’ => array(
‘first_name’ => $order->shipping_first_name,
‘last_name’ => $order->shipping_last_name,
‘company’ => $order->shipping_company,
‘address_1’ => $order->shipping_address_1,
‘address_2’ => $order->shipping_address_2,
‘city’ => $order->shipping_city,
‘state’ => $order->shipping_state,
‘formated_state’ => WC()->countries->states[$order->shipping_country][$order->shipping_state], //human readable formated state name
‘postcode’ => $order->shipping_postcode,
‘country’ => $order->shipping_country,
‘formated_country’ => WC()->countries->countries[$order->shipping_country] //human readable formated country name
),
‘note’ => $order->customer_note,
‘customer_ip’ => $order->customer_ip_address,
‘customer_user_agent’ => $order->customer_user_agent,
‘customer_id’ => $order->get_user_id(),
‘view_order_url’ => $order->get_view_order_url(),
‘line_items’ => array(),
‘shipping_lines’ => array(),
‘tax_lines’ => array(),
‘fee_lines’ => array(),
‘coupon_lines’ => array(),
);
//getting all line items
foreach ($order->get_items() as $item_id => $item) {
$product = $order->get_product_from_item($item);
$product_id = null;
$product_sku = null;
// Check if the product exists.
if (is_object($product)) {
$product_id = !empty($product->variation_id) ? $product->variation_id : $product->id;
$product_sku = $product->get_sku();
}
$meta = new WC_Order_Item_Meta($item, $product);
$item_meta = array();
$hideprefix = ( isset($filter[‘all_item_meta’]) && $filter[‘all_item_meta’] === ‘true’ ) ? null : ‘_’;
foreach ($meta->get_formatted($hideprefix) as $meta_key => $formatted_meta) {
$item_meta[] = array(
‘key’ => $formatted_meta[‘key’],
‘label’ => $formatted_meta[‘label’],
‘value’ => $formatted_meta[‘value’],
);
}
$order_data[‘line_items’][] = array(
‘id’ => $item_id,
‘subtotal’ => wc_format_decimal($order->get_line_subtotal($item, false, false), $dp),
‘subtotal_tax’ => wc_format_decimal($item[‘line_subtotal_tax’], $dp),
‘total’ => wc_format_decimal($order->get_line_total($item, false, false), $dp),
‘total_tax’ => wc_format_decimal($item[‘line_tax’], $dp),
‘price’ => wc_format_decimal($order->get_item_total($item, false, false), $dp),
‘quantity’ => wc_stock_amount($item[‘qty’]),
‘tax_class’ => (!empty($item[‘tax_class’]) ) ? $item[‘tax_class’] : null,
‘name’ => $item[‘name’],
‘product_id’ => !empty($product->variation_id) ? $product->parent_id : $product_id,
‘variation_id’ => !empty($product->variation_id) ? $product_id : 0,
‘sku’ => $product_sku,
‘product_url’ => get_permalink($product_id),
‘product_thumbnail_url’ => wp_get_attachment_image_src(get_post_thumbnail_id($product_id), ‘thumbnail’, TRUE)[0],
‘meta’ => $item_meta,
);
}
//getting shipping
foreach ($order->get_shipping_methods() as $shipping_item_id => $shipping_item) {
$order_data[‘shipping_lines’][] = array(
‘id’ => $shipping_item_id,
‘method_id’ => $shipping_item[‘method_id’],
‘method_title’ => $shipping_item[‘name’],
‘total’ => wc_format_decimal($shipping_item[‘cost’], $dp),
);
}
//getting taxes
foreach ($order->get_tax_totals() as $tax_code => $tax) {
$order_data[‘tax_lines’][] = array(
‘id’ => $tax->id,
‘rate_id’ => $tax->rate_id,
‘code’ => $tax_code,
‘title’ => $tax->label,
‘total’ => wc_format_decimal($tax->amount, $dp),
‘compound’ => (bool) $tax->is_compound,
);
}
//getting fees
foreach ($order->get_fees() as $fee_item_id => $fee_item) {
$order_data[‘fee_lines’][] = array(
‘id’ => $fee_item_id,
‘title’ => $fee_item[‘name’],
‘tax_class’ => (!empty($fee_item[‘tax_class’]) ) ? $fee_item[‘tax_class’] : null,
‘total’ => wc_format_decimal($order->get_line_total($fee_item), $dp),
‘total_tax’ => wc_format_decimal($order->get_line_tax($fee_item), $dp),
);
}
//getting coupons
foreach ($order->get_items(‘coupon’) as $coupon_item_id => $coupon_item) {
$order_data[‘coupon_lines’][] = array(
‘id’ => $coupon_item_id,
‘code’ => $coupon_item[‘name’],
‘amount’ => wc_format_decimal($coupon_item[‘discount_amount’], $dp),
);
}
return array(‘order’ => apply_filters(‘woocommerce_api_order_response’, $order_data, $order, $fields));
}
}
Okay now, how do I use it?
First add getOrderDetailById()
to your active theme functions.php
or to any active plugin PHP file.
Then call getOrderDetailById()
from anywhere in your app by passing the Order ID like below.
<?php
$order_detail = getOrderDetailById(101); //to get the detail of order ID #101
print_r($order_detail);
Using WooCommerce Shipment Tracking and want’s to add that as well?
WooCommerce Shipment Tracking is an awesome paid plugin that you must have! If you want to add this in your custom order detail function then just add below code in above mentions.
For Shipment Tracking 1.4.0
or above
<?php
$order_id = method_exists($order, ‘get_id’) ? $order->get_id() : $order->id;
//getting shipping details
$objWC_Shipment = WC_Shipment_Tracking_Actions::get_instance();
$shipping_details = $objWC_Shipment->get_tracking_items($order_id);
if (!empty($shipping_details)) {
foreach ($shipping_details as $shipping_detail) {
$order_data[‘shipping_details’][] = array(
‘tracking_provider’ => $shipping_detail[‘tracking_provider’],
‘tracking_number’ => $shipping_detail[‘tracking_number’],
‘date_shipped’ => $shipping_detail[‘date_shipped’]
);
}
}
For Shipment Tracking 1.3.6
or below
<?php
$order_id = method_exists($order, ‘get_id’) ? $order->get_id() : $order->id;
//getting shipping details
$tracking_number = get_post_meta($order_id, ‘_tracking_number’, TRUE);
if (isset($tracking_number) && !empty($tracking_number)) {
$order_data[‘shipping_details’] = array(
‘tracking_provider’ => get_post_meta($order_id, ‘_tracking_provider’, TRUE),
‘tracking_number’ => $tracking_number,
‘date_shipped’ => get_post_meta($order_id, ‘_date_shipped’, TRUE)
);
}
is this work with WooCommerce 3.2.4?
Yes, follow code under “WooCommerce 3.x or above” section.
worked liked a charm!
$order = wc_get_order(20);
while using above code,i m getting error as
Please let me know, where i did mistake.
Thanks in advance.
Do you have any order with #20?
thanks!
Hi, I’m getting this:
Warning: Missing argument 4 for WC_PB_REST_API::legacy_order_response() in (…)/wp-content/plugins/woocommerce-product-bundles/includes/class-wc-pb-rest-api.php on line 1074
I think you need to contact the plugin author.
Nice post! I solve my issue
It throws
CRITICAL Uncaught Error: Call to undefined function getOrderById()
Hello! I’m at work browsing your blog from my new apple iphone!
Just wanted to say I love reading your blog and look forward to all
your posts! Carry on the superb work!