Obtenga todas las ID de pedidos desde una ID de producto

¿Cómo puedo obtener una matriz con ID de pedido por ID de producto?

Me refiero a recibir todos los pedidos donde se presenta un producto específico.

Sé cómo hacerlo por MySQL, pero ¿hay alguna manera de hacerlo mediante la función WP_Query ?

ACTUALIZADO: Cambió la consulta SQL a "SELECT DISTINCT" lugar de simplemente "SELECT" para evitar ID de Orden duplicados en la matriz (entonces no se necesita array_unique() para filtrar duplicados …).

Con una consulta de WP esto no es posible, pero usando WordPress class wpdb puedes hacerlo fácilmente incluyendo una consulta SQL.

Luego puede incrustar esto en una función personalizada con $product_id como argumento.
Deberá establecer dentro de él los estados de orden a los que se dirige.

Así que aquí está la función que hará el trabajo:

 function retrieve_orders_ids_from_a_product_id( $product_id ) { global $wpdb; // Define HERE the orders status to include in < == <== <== <== <== <== <== $orders_statuses = "'wc-completed', 'wc-processing', 'wc-on-hold'"; # Requesting All defined statuses Orders IDs for a defined product ID $orders_ids = $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 LIKE '_product_id' AND woim.meta_value LIKE '$product_id' ORDER BY woi.order_item_id DESC" ); // Return an array of Orders IDs for the given product ID return $orders_ids; } 

Este código va en cualquier archivo php.

Este código está probado y funciona para WooCommerce versión 2.5+, 2.6+ y 3.0+


EJEMPLOS DE USO:

 ## 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 = retrieve_orders_ids_from_a_product_id( $product_id ); // We display the orders in a coma separated list echo '

' . implode( ', ', $orders_ids_array ) . '

';

Me gustaría señalar que la respuesta anterior arrojará un duplicado del order_id si el pedido tiene múltiples elementos.

P.ej

Si hubiera un producto llamado “manzanas” con product_id => 1036

El cliente pone “manzanas” 3 veces en su carro y las compra, creando order_id => 555

Si consulto product_id-> 1036, obtendré una matriz (555,555,555).

Probablemente haya una forma SQL de hacer esto que puede ser más rápida (agradecería a cualquiera que pudiera agregar algo), de lo contrario utilicé: array_unqiue () para fusionar los duplicados.

 function retrieve_orders_ids_from_a_product_id( $product_id ) { global $wpdb; $table_posts = $wpdb->prefix . "posts"; $table_items = $wpdb->prefix . "woocommerce_order_items"; $table_itemmeta = $wpdb->prefix . "woocommerce_order_itemmeta"; // Define HERE the orders status to include in < == <== <== <== <== <== <== $orders_statuses = "'wc-completed', 'wc-processing', 'wc-on-hold'"; # Requesting All defined statuses Orders IDs for a defined product ID $orders_ids = $wpdb->get_col( " SELECT $table_items.order_id FROM $table_itemmeta, $table_items, $table_posts WHERE $table_items.order_item_id = $table_itemmeta.order_item_id AND $table_items.order_id = $table_posts.ID AND $table_posts.post_status IN ( $orders_statuses ) AND $table_itemmeta.meta_key LIKE '_product_id' AND $table_itemmeta.meta_value LIKE '$product_id' ORDER BY $table_items.order_item_id DESC" ); // return an array of Orders IDs for the given product ID $orders_ids = array_unique($orders_ids); return $orders_ids; } 

Función modificada para obtener identificadores de productos de usuarios específicos

 function retrieve_orders_ids_from_a_product_id( $product_id,$user_id ) { global $wpdb; $table_posts = $wpdb->prefix . "posts"; $table_postmeta = $wpdb->prefix . "postmeta"; $table_items = $wpdb->prefix . "woocommerce_order_items"; $table_itemmeta = $wpdb->prefix . "woocommerce_order_itemmeta"; // Define HERE the orders status to include in < == <== <== <== <== <== <== $orders_statuses = "'wc-completed', 'wc-processing', 'wc-on-hold'"; # Requesting All defined statuses Orders IDs for a defined product ID $orders_ids = $wpdb->get_col( " SELECT DISTINCT $table_items.order_id FROM $table_itemmeta, $table_items, $table_posts , $table_postmeta WHERE $table_items.order_item_id = $table_itemmeta.order_item_id AND $table_items.order_id = $table_posts.ID AND $table_posts.post_status IN ( $orders_statuses ) AND $table_postmeta.meta_key LIKE '_customer_user' AND $table_postmeta.meta_value LIKE '$user_id ' AND $table_itemmeta.meta_key LIKE '_product_id' AND $table_itemmeta.meta_value LIKE '$product_id' ORDER BY $table_items.order_item_id DESC" ); // return an array of Orders IDs for the given product ID return $orders_ids; } 

Ejemplo de uso

 ## This will display all orders containing this product ID in a coma separated string ## // A defined product ID: 40 $product_id = 40; // Current User $current_user = wp_get_current_user(); // We get all the Orders for the given product ID of current user in an arrray $orders_ids_array = retrieve_orders_ids_from_a_product_id( $product_id, $current_user->ID ); // We display the orders in a coma separated list echo '

' . implode( ', ', $orders_ids_array ) . '

';