向所有帖子添加新类别
假设我们刚刚创建了一个“新闻”类别,并且我们希望将其添加到所有文章中:尽管我们绝对可以通过登录到WordPress管理面板来使用GUI来做到这一点,但是如果我们的WordPress网站有很多文章,这种技术将非常慢(并且容易出错)。
以下是我们如何使用单个SQL查询解决问题的方法:
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order)
SELECT ID, @CategoryID, 0 FROM wp_posts p
WHERE p.post_type = 'post' AND p.ID NOT IN
(SELECT object_id FROM wp_term_relationships tr3
WHERE tr3.term_taxonomy_id = @CategoryID);
上面的查询以一种相当简单的方式工作:它从wp_posts表中检索所有帖子(减去已经与@CategoryID关联的帖子),并在wp_term_relationships表中为每个帖子创建一个条目。 不用说,@CategoryID必须替换为我们要添加的类别的实际 ID。
向具有现有类别的所有帖子添加新类别
现在让我们看看如何向已经与另一个已经存在的类别关联的所有帖子添加一个额外的类别。可以使用以下 SQL 查询执行此类任务:
INSERT INTO wp_term_relationships (object_id, term_taxonomy_id, term_order)
SELECT object_id, @CategoryID, 0 FROM wp_term_relationships tr2
WHERE tr2.term_taxonomy_id = @OldCategoryID AND object_id NOT IN
(SELECT object_id FROM wp_term_relationships tr3
WHERE tr3.term_taxonomy_id = @CategoryID);
如我们所见,我们必须将@CategoryID替换为要添加的其他类别的 ID,并将@OldCategoryID占位符替换为现有类别 ID。
上面的查询遵循与前一个查询相同的方法,但主要区别如下:我们需要添加新类别的帖子的 ID 不是通过查询wp_post表来检索的;而是从wp_term_relationships中获取的 。我们被允许这样做,因为我们知道他们必须在那里,因为我们只想检索那些已经有关系的人(与现有类别);从这些记录中,我们可以检索object_id,这正是我们创建与其他类别的新关系所需要的。
删除类别
现在让我们看看允许我们使用上面显示的相同条件删除给定类别(一旦我们知道其类别 ID)与一个或多个帖子之间的关系的查询。
要删除类别与所有帖子之间的关系,请执行以下操作:
DELETE FROM wp_term_relationships WHERE term_taxonomy_id = @CategoryID;
要删除一个类别与另一个类别有活动关系的所有帖子之间的关系,请执行以下操作:
DELETE FROM wp_term_relationships
WHERE term_taxonomy_id = @CategoryID
AND object_id IN
(SELECT object_id FROM (SELECT * FROM wp_term_relationships) AS tr2
WHERE tr2.term_taxonomy_id = @OtherCategoryID);
最后但并非最不重要的一点是,要删除一个类别与所有与另一个类别没有活动关系的帖子之间的关系:
DELETE FROM wp_term_relationships
WHERE term_taxonomy_id = @CategoryID
AND object_id NOT IN
(SELECT object_id FROM (SELECT * FROM wp_term_relationships) AS tr2
WHERE tr2.term_taxonomy_id = @OtherCategoryID);
值得注意的是,由于MySQL的已知限制,上述查询包含一个额外的 – 显然是多余的 – 子查询(SELECT * FROM wp_term_relationships而不仅仅是wp_term_relationships)