如何编写SQL查询获取WooCommerce产品的SKU、产品标签ID及名称
解决方案
你需要将查询中的产品分类(product_cat)替换为产品标签对应的分类法product_tag,同时移除不必要的字段,只保留你需要的SKU、产品标签ID和名称。以下是调整后的SQL:
SELECT p.ID AS product_id, p.post_title, MAX(CASE WHEN pm1.meta_key = '_sku' THEN pm1.meta_value ELSE NULL END) AS sku, t.term_id AS product_tag_id, t.name AS product_tag_name FROM uzn2_posts p LEFT JOIN uzn2_postmeta pm1 ON pm1.post_id = p.ID LEFT JOIN uzn2_term_relationships AS tr ON tr.object_id = p.ID JOIN uzn2_term_taxonomy AS tt ON tt.taxonomy = 'product_tag' AND tt.term_taxonomy_id = tr.term_taxonomy_id JOIN uzn2_terms AS t ON t.term_id = tt.term_id WHERE p.post_type IN ('product', 'product_variation') AND p.post_status = 'publish' GROUP BY p.ID, p.post_title, t.term_id, t.name;
关键改动说明
- 替换分类法:将原查询中关联的
product_cat(产品分类)改为product_tag,这是WooCommerce产品标签对应的官方分类法标识。 - 精简字段:移除了产品分类、价格等无关字段,只保留
sku、product_tag_id(标签ID)、product_tag_name(标签名称),以及必要的产品ID和标题用于关联。 - 调整分组条件:新增
t.term_id和t.name到GROUP BY中,避免因分组逻辑导致标签信息丢失(一个产品可能对应多个标签,分组时需要包含标签字段)。
关于产品变体的补充说明
WooCommerce的产品变体默认不会单独设置标签,标签通常属于父产品。如果需要让变体也显示父产品的标签,可以通过关联父产品的标签信息实现,调整后的SQL如下:
SELECT p.ID AS product_id, p.post_title, MAX(CASE WHEN pm1.meta_key = '_sku' THEN pm1.meta_value ELSE NULL END) AS sku, t.term_id AS product_tag_id, t.name AS product_tag_name FROM uzn2_posts p LEFT JOIN uzn2_postmeta pm1 ON pm1.post_id = p.ID -- 关联父产品(如果是变体) LEFT JOIN uzn2_postmeta pm_parent ON pm_parent.post_id = p.ID AND pm_parent.meta_key = '_parent_id' -- 关联父产品的标签,或自身标签(父产品) LEFT JOIN uzn2_term_relationships AS tr ON tr.object_id = COALESCE(pm_parent.meta_value, p.ID) JOIN uzn2_term_taxonomy AS tt ON tt.taxonomy = 'product_tag' AND tt.term_taxonomy_id = tr.term_taxonomy_id JOIN uzn2_terms AS t ON t.term_id = tt.term_id WHERE p.post_type IN ('product', 'product_variation') AND p.post_status = 'publish' GROUP BY p.ID, p.post_title, t.term_id, t.name;
这个版本会让产品变体继承父产品的标签信息,同时父产品也会正常显示自身标签。
内容的提问来源于stack exchange,提问作者Pa3k
相关产品推荐
相关产品推荐

