Get all WooCommerce orders for a customer

Gain visibility.

There are several reasons you might want to get all WooCommerce orders for a customer in your shop. For example, you may want to find out if they’ve ever purchased a product, or do something as simple as count the number of orders they’ve placed with you.

Since orders are a custom post type, you can use get_posts to query orders, which is a pretty standard WP query that most developers are familiar with and can use. There are a couple things you should note though:

  • Most of the time, people query shop_order as the post type. You want to use wc_get_order_types() for the post type instead, as this will ensure that you have all order types available in the shop. Plugins can create their own order types, so this is a must for future-proofing your code.
  • The post_status is also something that’s easy to mess up. Order statuses (processing, completed, etc), are post statuses, so you can’t just used ‘publish’. You also don’t want to hard-code the core WooCommerce statuses, as plugins may have added additional ones. Use array_keys( wc_get_order_statuses() ) for post statuses instead.

If we want to query orders for a customer, we can check for the _customer_user meta key (the customer id) in the order, and we’ll get orders that match our customer’s id.

Let’s say we want to get orders for a logged-in customer. The 'meta_key' => '_customer_user' will be used as part of our query, and we’ll set 'meta_value' => get_current_user_id().

$customer_orders = get_posts( array(
    'numberposts' => -1,
    'meta_key'    => '_customer_user',
    'meta_value'  => get_current_user_id(),
    'post_type'   => wc_get_order_types(),
    'post_status' => array_keys( wc_get_order_statuses() ),
) );

Let’s go through a complete sample that will get the customer orders, count them, and display a notice to our loyal customers on the account page who’ve placed 5 or more orders.

Use Case: Welcome Message for Repeat Customers

Let’s get our current user:

$customer = wp_get_current_user();

And determine what number of orders indicates a “loyal” customer:

$loyal_count = 5;

We’ll then use our query above to get all of the WooCommerce orders for our customer.

As a final step, let’s build a welcome notice for the customer to show on the account page, and only show it if they’ve placed our minimum number of orders:

// Text for our "thanks for loyalty" message
$notice_text = sprintf( 'Hey %1$s 😀 We noticed you\'ve placed more than %2$s orders with us – thanks for being a loyal customer!', $customer->display_name, $loyal_count );
    
// Display our notice if the customer has at least 5 orders
if ( count( $customer_orders ) >= $loyal_count ) {
    wc_print_notice( $notice_text, 'notice' );
}

Now to complete it, let’s put all of this together and add it to the My Account page:

function wc_get_customer_orders() {
    
    // Get all customer orders
    $customer_orders = get_posts( array(
        'numberposts' => -1,
        'meta_key'    => '_customer_user',
        'meta_value'  => get_current_user_id(),
        'post_type'   => wc_get_order_types(),
        'post_status' => array_keys( wc_get_order_statuses() ),
    ) );
    
    $customer = wp_get_current_user();
    
    // Order count for a "loyal" customer
    $loyal_count = 5;
    
    // Text for our "thanks for loyalty" message
    $notice_text = sprintf( 'Hey %1$s 😀 We noticed you\'ve placed more than %2$s orders with us – thanks for being a loyal customer!', $customer->display_name, $loyal_count );
    
    // Display our notice if the customer has at least 5 orders
    if ( count( $customer_orders ) >= $loyal_count ) {
        wc_print_notice( $notice_text, 'notice' );
    }
}
add_action( 'woocommerce_before_my_account', 'wc_get_customer_orders' );

If the customer has placed more than 5 orders in the shop, a thank you message will be displayed:

WooCommerce Loyalty Message

If not, they’ll see nothing.

Beka Rice is a Sr. Director of Product Management at GoDaddy where she focuses on building an amazing WooCommerce experience. She’s been working with WooCommerce since 2013 and has built dozens of plugins used by hundreds of thousands of online stores.