如何清理WordPress的未用标签和分类 wp terms关联删除清理实战案例|Duuu笔记
安全清理WordPress未用标签/分类须严格按三步执行:先删wp_term_relationships中无对应文章的记录,再删wp_term_taxonomy中count=0且taxonomy为category或post_tag的记录,最后删wp_terms中无对应term_id的记录。
WordPress未用标签/分类为什么删不干净
直接执行
delete from wp_terms
会破坏数据库一致性,因为
wp_terms
表本身不存“是否被使用”的状态,它只靠
wp_term_taxonomy
和
wp_term_relationships
关联维系。你删了
wp_terms
里的某条记录,但对应
wp_term_taxonomy
还在,甚至可能指向一个不存在的
term_id
,后续后台编辑分类、调用
get_terms()
都可能报错或返回空。
安全清理的三步关联删除顺序
必须按依赖关系逆向清理:先清关系,再清分类元数据,最后清术语本身。顺序错一步,就会留下孤儿记录或触发外键约束(如果启用了 InnoDB 外键)。
第一步:删掉所有没被任何文章/页面/自定义类型引用的
term_taxonomy_id
关联 —— 即清空
wp_term_relationships
中无人认领的项
第二步:删掉
wp_term_taxonomy
中
count = 0
且
taxonomy IN ('category', 'post_tag')
的记录(注意:不要删
nav_menu
或
post_format
类型,它们逻辑不同)
第三步:删掉
wp_terms
中那些
term_id
不再出现在任何
wp_term_taxonomy.term_id
里的行(即已无分类/标签元数据挂载的术语)
SQL语句怎么写才不翻车
别手写 DELETE 嵌套子查询去一次清完——MySQL 5.7+ 对同一张表的子查询 DELETE 有限制,容易报错
You can't specify target table for update in FROM clause
。分三步执行更稳:
DELETE tr FROM wp_term_relationships tr
LEFT JOIN wp_posts p ON tr.object_id = p.ID
WHERE p.ID IS NULL;
DELETE tt FROM wp_term_taxonomy tt
WHERE tt.count = 0
AND tt.taxonomy IN ('category', 'post_tag');
DELETE t FROM wp_terms t
WHERE NOT EXISTS (
SELECT 1 FROM wp_term_taxonomy tt WHERE tt.term_id = t.term_id
);
执行前务必备份数据库;
wp_term_relationships
表很大时,第一条语句可能锁表较久,建议在低峰期操作。
插件和 WP-CLI 方案的隐藏风险
很多插件(比如 “Term Management Tools”)或 WP-CLI 命令(如
wp term list --format=ids --count=0
+
wp term delete
)看似方便,但它们默认只删
wp_term_taxonomy
和
wp_terms
,跳过
wp_term_relationships
清理。结果就是:前台查不到标签,后台却仍显示“× 个文章已关联”,点进去却 404 或空白——因为关系记录还在,只是对应的文章已被删或状态异常。
ima.copilot
腾讯大混元模型推出的智能工作台产品,提供知识库管理、AI问答、智能写作等功能
下载
真正干净的清理,绕不开直连数据库跑那三段 SQL。WP-CLI 的
wp term delete
只适合删单个明确无用的标签,批量清理时它不会自动判断是否“真没人用”。
最常被忽略的是:自定义文章类型、产品(WooCommerce)、问答(bbPress)等扩展可能注册了自己的 taxonomy,它们的
count
字段未必实时更新,得先运行
wp term recount
或对应插件的修复工具,否则
count = 0
不代表真没人用。
