如何从数据库中删除属于特定类别的 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 中对属于特定类别的帖子列表进行分页

php 从特定类别的产品的单个产品页面中删除相关产品

如何使用 Firebase RealTime 数据库根据特定类别获取项目集合

如何在MongoDB中从某些类别中查找特定文档

如何在woocommerce中获取特定类别的所有产品?