如何通过MySQL仅删除WooCommerce中分类XY下的产品?
只删除分类XY下WooCommerce产品的MySQL语句调整方案
首先务必记住:执行删除操作前一定要备份数据库,数据删除后几乎无法恢复,千万要谨慎!
第一步:获取分类XY对应的term_id
WooCommerce的产品分类存储在wp_terms表中,先查询你要删除的分类XY对应的ID:
-- 如果知道分类名称用这个 SELECT term_id FROM wp_terms WHERE name = 'XY'; -- 如果知道分类别名(slug)用这个更准确 SELECT term_id FROM wp_terms WHERE slug = 'xy';
把查询到的term_id(比如假设是123)替换到下面的所有语句中。
第二步:修改删除语句(仅删除分类XY下的产品)
我们需要通过wp_term_taxonomy(关联分类ID和分类类型product_cat)和wp_term_relationships(关联产品和分类)来精准筛选目标产品,而不是删除所有产品:
- 删除产品与分类的关联关系:
DELETE tr FROM wp_term_relationships tr JOIN wp_posts p ON tr.object_id = p.ID WHERE tr.term_taxonomy_id = ( SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = 123 AND taxonomy = 'product_cat' ) AND p.post_type IN ('product','product_variation');
- 删除产品的元数据:
DELETE pm FROM wp_postmeta pm JOIN wp_posts p ON pm.post_id = p.ID JOIN wp_term_relationships tr ON p.ID = tr.object_id WHERE tr.term_taxonomy_id = ( SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = 123 AND taxonomy = 'product_cat' ) AND p.post_type IN ('product','product_variation');
- 最后删除产品本身:
DELETE p FROM wp_posts p JOIN wp_term_relationships tr ON p.ID = tr.object_id WHERE tr.term_taxonomy_id = ( SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = 123 AND taxonomy = 'product_cat' ) AND p.post_type IN ('product','product_variation');
安全测试建议
在执行删除前,你可以把每个DELETE语句改成SELECT *,先确认要删除的产品是否正确,比如:
SELECT p.ID, p.post_title FROM wp_posts p JOIN wp_term_relationships tr ON p.ID = tr.object_id WHERE tr.term_taxonomy_id = ( SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE term_id = 123 AND taxonomy = 'product_cat' ) AND p.post_type IN ('product','product_variation');
如果查询结果是你要删除的产品,再执行删除操作就没问题了。
内容的提问来源于stack exchange,提问作者Toni_Nutone
相关产品推荐
相关产品推荐

