Я пытаюсь перечислить все купленные товары, принадлежащие к определенной категории товаров, например, все заказы на футболки в категории товаров «одежда».
Я нахожу структуру базы данных Woocommerce довольно запутанной, и вам приходится писать длинные запросы, чтобы получить простую информацию.
Может ли кто-нибудь предоставить пример запроса для получения всех заказов по определенной категории?
Я знаю, что это, вероятно, будет связано с таблицами wp_woocommerce_order_items
и wp_terms
, но не заблудитесь.
🤔 А знаете ли вы, что...
PHP поддерживает многопоточность и многозадачность.
Следующий SQL-запрос даст вам список идентификаторов продуктов, купленных хотя бы один раз, которые относятся к ярлыку категории продуктов «одежда»:
SELECT DISTINCT tr.object_id
FROM wp_term_relationships tr
INNER JOIN wp_term_taxonomy tt
ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN wp_terms t
ON tt.term_id = t.term_id
INNER JOIN wp_woocommerce_order_itemmeta oim
ON tr.object_id = oim.meta_value
INNER JOIN wp_woocommerce_order_items oi
ON oim.order_item_id = oi.order_item_id
INNER JOIN wp_posts as o
ON oi.order_id = o.ID
WHERE tt.taxonomy = 'product_cat'
AND t.slug = 'clothes'
AND oim.meta_key = '_product_id'
AND o.post_type = 'shop_order'
AND o.post_status IN ('wc-completed','wc-processing')
Проверено и работает
Или в Wordpress с использованием класса WPDB
это можно сделать с помощью:
global $wpdb;
$product_category = 'clothes'; // Term slug
$products_ids = $wpdb->get_col( "
SELECT DISTINCT tr.object_id
FROM wp_term_relationships tr
INNER JOIN wp_term_taxonomy tt
ON tr.term_taxonomy_id = tt.term_taxonomy_id
INNER JOIN wp_terms t
ON tt.term_id = t.term_id
INNER JOIN wp_woocommerce_order_itemmeta oim
ON tr.object_id = oim.meta_value
INNER JOIN wp_woocommerce_order_items oi
ON oim.order_item_id = oi.order_item_id
INNER JOIN wp_posts as o
ON oi.order_id = o.ID
WHERE tt.taxonomy = 'product_cat'
AND t.slug = '$product_category'
AND oim.meta_key = '_product_id'
AND o.post_type = 'shop_order'
AND o.post_status IN ('wc-completed','wc-processing')
");
// Pre-formatted raw display (an array of products ids)
echo '<pre>'; print_r($products_ids); echo '</pre>';