如何从数据库中删除属于特定类别的 woocommerce 产品
Posted
技术标签:
【中文标题】如何从数据库中删除属于特定类别的 woocommerce 产品【英文标题】:How to delete woocommerce products that belongs to specific category from the database 【发布时间】:2021-09-09 08:00:35 【问题描述】:我需要一个 mysql 查询语句来删除所有属于某个类别或不属于另一个类别的 woocommerce 产品,类似这样:
DELETE FROM wp_postmeta WHERE post_id IN (SELECT ID
FROM wp_posts
LEFT JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
LEFT JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
WHERE wp_term_taxonomy.term_id NOT IN (29,31,32,33,34) AND post_type IN ('product','product_variation')
GROUP BY wp_posts.ID);
而且我正在处理大量数据,超过 100,000 种产品。
【问题讨论】:
【参考方案1】:如果有人有同样的需求。这就是我解决删除问题的方法:
1- 最重要的是确保类别不会相互重叠,就像您尝试删除的产品没有附加其他类别一样。这可以手动完成(如果您的产品很少)或通过查询来解除不需要的关系。
2- 接下来我会建议每次删除只属于一个类别的产品,查询应该是特定的,以防止任何不希望的结果和冲突。
3-选择删除前的产品,看看是否与本次查询有冲突:
SELECT * FROM wp_posts WHERE ID IN(SELECT posts.object_id from (SELECT object_id FROM wp_term_relationships
LEFT JOIN wp_posts ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE term_taxonomy_id = 38 AND post_type IN ('product','product_variation')
GROUP BY object_id) as posts);
4- 每次只删除一个想要的类别 (BY ID) 产品:
DELETE FROM wp_posts WHERE ID IN(SELECT posts.object_id from (SELECT object_id FROM wp_term_relationships
LEFT JOIN wp_posts ON (wp_posts.ID = wp_term_relationships.object_id)
WHERE term_taxonomy_id = 38 AND post_type IN ('product','product_variation')
GROUP BY object_id) as posts);
针对每个类别的 30,000 多个产品,上述查询耗时 1 秒。
【讨论】:
以上是关于如何从数据库中删除属于特定类别的 woocommerce 产品的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有插件的情况下从特定类别的帖子的 URL 中删除日期?
如何在 GatsbyJS 中对属于特定类别的帖子列表进行分页