How can I get an array with Order IDs by Product ID?
I mean receive all orders where specific product is presented.
I know how to do this by MySQL, but is there a way to do this by WP_Query
function?
Advertisement
Answer
Updates:
2017 – SQL query changed to
"SELECT DISTINCT"
instead of"SELECT"
to avoid duplicated Order IDs in the array (then no need ofarray_unique()
to filter duplicates…).2019 – Enabled product variation type support in the SQL Query
Then you can embed this in a custom function with $product_id
as argument.
You will have to set inside it, the order statuses that you are targeting.
So here is the function that will do the job:
function get_orders_ids_by_product_id( $product_id ) { global $wpdb; // Define HERE the orders status to include in <== <== <== <== <== <== <== $orders_statuses = "'wc-completed', 'wc-processing', 'wc-on-hold'"; # Get All defined statuses Orders IDs for a defined product ID (or variation ID) return $wpdb->get_col( " SELECT DISTINCT woi.order_id FROM {$wpdb->prefix}woocommerce_order_itemmeta as woim, {$wpdb->prefix}woocommerce_order_items as woi, {$wpdb->prefix}posts as p WHERE woi.order_item_id = woim.order_item_id AND woi.order_id = p.ID AND p.post_status IN ( $orders_statuses ) AND woim.meta_key IN ( '_product_id', '_variation_id' ) AND woim.meta_value LIKE '$product_id' ORDER BY woi.order_item_id DESC" ); }
This code goes in any php file.
This code is tested and works for WooCommerce version 2.5+, 2.6+ and 3+
USAGE EXAMPLES:
## This will display all orders containing this product ID in a coma separated string ## // A defined product ID: 40 $product_id = 40; // We get all the Orders for the given product ID in an arrray $orders_ids_array = get_orders_ids_by_product_id( $product_id ); // We display the orders in a coma separated list echo '<p>' . implode( ', ', $orders_ids_array ) . '</p>';