php - WooCommerce:使用 SQL 查询获取产品类别的购买商品

标签 php mysql sql woocommerce taxonomy-terms

我试图列出属于特定产品类别的所有已购买产品,例如“衣服”产品类别下的所有 T 恤订单。

我发现 Woocommerce 数据库结构非常困惑,您必须编写很长的查询才能获取简单的信息。

有人可以提供一个示例查询来获取特定类别的所有订单吗?

我知道这可能会涉及 wp_woocommerce_order_itemswp_terms 表,但从那里迷失了方向。

最佳答案

以下 SQL 查询将为您提供至少购买过一次且属于“衣服”产品类别 slug 的产品 ID 列表:

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>';

关于php - WooCommerce:使用 SQL 查询获取产品类别的购买商品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55678653/

相关文章:

php - 当我使用 Requests 模拟 postman 请求时,客户端发送的请求在语法上不正确

php - 带有参数的joomla mysql查询

php - XPath表达式在<br>标记后获取字符串

sql - 创建表作为 Select,然后在 Oracle 中使用 JOIN 更新语句

php - PHP 中单引号和双引号字符串有什么区别?

php - 在 Websocket 中添加自定义数据

java - 是否有 Hibernate 注释可以筛选无效的 MySQL 日期?

php - 更改模块名称

sql - 带有选择和值的 Postgres 插入

SQL Server SQL JOIN 帮助