如何从数据库中删除属于特定类别的 woocommerce 产品

How to delete woocommerce products that belongs to specific category from the database

我需要一个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- 最重要的是确保类别彼此不重叠,例如您要删除的产品没有附加其他类别。这可以手动完成(如果您的产品很少)或通过查询取消附加不需要的关系。

2- 接下来我会建议每次只删除属于一个类别的产品,查询应该是特定的,以防止任何不希望的结果和冲突。

3- Select 删除前的产品,看是否与此查询有任何冲突:

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 秒。