How can I get customer details from an order in WooCommerce?
2017-2020 WooCommerce versions 3+ and CRUD Objects
1). You can use getter methods from WC_Order
and WC_Abstract_Order
classes on the WC_Order
object instance like:
// Get an instance of the WC_Order Object from the Order ID (if required)$order = wc_get_order( $order_id );// Get the Customer ID (User ID)$customer_id = $order->get_customer_id(); // Or $order->get_user_id();// Get the WP_User Object instance$user = $order->get_user();// Get the WP_User roles and capabilities$user_roles = $user->roles;// Get the Customer billing email$billing_email = $order->get_billing_email();// Get the Customer billing phone$billing_phone = $order->get_billing_phone();// Customer billing information details$billing_first_name = $order->get_billing_first_name();$billing_last_name = $order->get_billing_last_name();$billing_company = $order->get_billing_company();$billing_address_1 = $order->get_billing_address_1();$billing_address_2 = $order->get_billing_address_2();$billing_city = $order->get_billing_city();$billing_state = $order->get_billing_state();$billing_postcode = $order->get_billing_postcode();$billing_country = $order->get_billing_country();// Customer shipping information details$shipping_first_name = $order->get_shipping_first_name();$shipping_last_name = $order->get_shipping_last_name();$shipping_company = $order->get_shipping_company();$shipping_address_1 = $order->get_shipping_address_1();$shipping_address_2 = $order->get_shipping_address_2();$shipping_city = $order->get_shipping_city();$shipping_state = $order->get_shipping_state();$shipping_postcode = $order->get_shipping_postcode();$shipping_country = $order->get_shipping_country();
2). You can also use the WC_Order
get_data()
method, to get an unprotected data array from Order meta data like:
// Get an instance of the WC_Order Object from the Order ID (if required)$order = wc_get_order( $order_id );// Get the Order meta data in an unprotected array$data = $order->get_data(); // The Order data$order_id = $data['id'];$order_parent_id = $data['parent_id'];// Get the Customer ID (User ID)$customer_id = $data['customer_id'];## BILLING INFORMATION:$billing_email = $data['billing']['email'];$billing_phone = $order_data['billing']['phone'];$billing_first_name = $data['billing']['first_name'];$billing_last_name = $data['billing']['last_name'];$billing_company = $data['billing']['company'];$billing_address_1 = $data['billing']['address_1'];$billing_address_2 = $data['billing']['address_2'];$billing_city = $data['billing']['city'];$billing_state = $data['billing']['state'];$billing_postcode = $data['billing']['postcode'];$billing_country = $data['billing']['country'];## SHIPPING INFORMATION:$shipping_first_name = $data['shipping']['first_name'];$shipping_last_name = $data['shipping']['last_name'];$shipping_company = $data['shipping']['company'];$shipping_address_1 = $data['shipping']['address_1'];$shipping_address_2 = $data['shipping']['address_2'];$shipping_city = $data['shipping']['city'];$shipping_state = $data['shipping']['state'];$shipping_postcode = $data['shipping']['postcode'];$shipping_country = $data['shipping']['country'];
Now to get the user account data (from an Order ID):
1). You can use the methods from WC_Customer
Class:
// Get the user ID from an Order ID$user_id = get_post_meta( $order_id, '_customer_user', true );// Get an instance of the WC_Customer Object from the user ID$customer = new WC_Customer( $user_id );$username = $customer->get_username(); // Get username$user_email = $customer->get_email(); // Get account email$first_name = $customer->get_first_name();$last_name = $customer->get_last_name();$display_name = $customer->get_display_name();// Customer billing information details (from account)$billing_first_name = $customer->get_billing_first_name();$billing_last_name = $customer->get_billing_last_name();$billing_company = $customer->get_billing_company();$billing_address_1 = $customer->get_billing_address_1();$billing_address_2 = $customer->get_billing_address_2();$billing_city = $customer->get_billing_city();$billing_state = $customer->get_billing_state();$billing_postcode = $customer->get_billing_postcode();$billing_country = $customer->get_billing_country();// Customer shipping information details (from account)$shipping_first_name = $customer->get_shipping_first_name();$shipping_last_name = $customer->get_shipping_last_name();$shipping_company = $customer->get_shipping_company();$shipping_address_1 = $customer->get_shipping_address_1();$shipping_address_2 = $customer->get_shipping_address_2();$shipping_city = $customer->get_shipping_city();$shipping_state = $customer->get_shipping_state();$shipping_postcode = $customer->get_shipping_postcode();$shipping_country = $customer->get_shipping_country();
2). The WP_User
object (WordPress):
// Get the user ID from an Order ID$user_id = get_post_meta( $order_id, '_customer_user', true );// Get the WP_User instance Object$user = new WP_User( $user_id );$username = $user->username; // Get username$user_email = $user->email; // Get account email$first_name = $user->first_name;$last_name = $user->last_name;$display_name = $user->display_name;// Customer billing information details (from account)$billing_first_name = $user->billing_first_name;$billing_last_name = $user->billing_last_name;$billing_company = $user->billing_company;$billing_address_1 = $user->billing_address_1;$billing_address_2 = $user->billing_address_2;$billing_city = $user->billing_city;$billing_state = $user->billing_state;$billing_postcode = $user->billing_postcode;$billing_country = $user->billing_country;// Customer shipping information details (from account)$shipping_first_name = $user->shipping_first_name;$shipping_last_name = $user->shipping_last_name;$shipping_company = $user->shipping_company;$shipping_address_1 = $user->shipping_address_1;$shipping_address_2 = $user->shipping_address_2;$shipping_city = $user->shipping_city;$shipping_state = $user->shipping_state;$shipping_postcode = $user->shipping_postcode;$shipping_country = $user->shipping_country;
Related: How to get WooCommerce order details
If you want customer's details that customer had entered while ordering, then you can use the following code:
$order = new WC_Order($order_id);$billing_address = $order->get_billing_address();$billing_address_html = $order->get_formatted_billing_address();// For printing or displaying on the web page$shipping_address = $order->get_shipping_address();$shipping_address_html = $order->get_formatted_shipping_address(); // For printing or displaying on web page
Apart from this, $customer = new WC_Customer( $order_id );
can not get you customer details.
First of all, new WC_Customer()
doesn't take any arguments.
Secondly, WC_Customer
will get customer's details only when the user is logged in and he/she is not on the admin side. Instead he/she should be on website's front-end like the 'My Account', 'Shop', 'Cart', or 'Checkout' page.
Having tried $customer = new WC_Customer();
and global $woocommerce; $customer = $woocommerce->customer;
I was still getting empty address data even when I logged in as a non-admin user.
My solution was as follows:
function mwe_get_formatted_shipping_name_and_address($user_id) { $address = ''; $address .= get_user_meta( $user_id, 'shipping_first_name', true ); $address .= ' '; $address .= get_user_meta( $user_id, 'shipping_last_name', true ); $address .= "\n"; $address .= get_user_meta( $user_id, 'shipping_company', true ); $address .= "\n"; $address .= get_user_meta( $user_id, 'shipping_address_1', true ); $address .= "\n"; $address .= get_user_meta( $user_id, 'shipping_address_2', true ); $address .= "\n"; $address .= get_user_meta( $user_id, 'shipping_city', true ); $address .= "\n"; $address .= get_user_meta( $user_id, 'shipping_state', true ); $address .= "\n"; $address .= get_user_meta( $user_id, 'shipping_postcode', true ); $address .= "\n"; $address .= get_user_meta( $user_id, 'shipping_country', true ); return $address;}
...and this code works regardless of whether you are logged in as admin or not.