本文约 3,607 字,预计阅读 10 分钟。文中命令与配置均经过实测,可直接参考执行。
引言:写了三年文章,攒下四百多个标签
标签体系失控通常是一个渐进过程:第一年每个标签都很克制,第二年为了”覆盖更多词”开始给每篇文章打五六个标签,第三年出现了 WordPress、wordpress、WP、wp教程 四个同义标签并存。后台标签列表滚不到底,前台标签云里密密麻麻,每个标签页只有两三篇文章。这些页面被收录后,既无流量又拉低整站质量评估,还会与分类页、其他标签页形成重复内容。
原理分析:标签泛滥为什么是”质量问题”而不只是”数量问题”
标签页本质上是一个自动生成的聚合页。它的价值来自两点:聚合规模和主题唯一性。当标签过多时,这两点会同时恶化:
其一,规模被摊薄。总文章数固定,标签数从 20 涨到 400,每个标签下的文章数从 30 篇降到 1.5 篇,聚合页直接变成薄内容。
其二,唯一性丧失。SEO 和 SEO优化 两个标签下的文章集合高度重合,形成两个内容几乎一样的 URL,属于站内重复内容。百度会选择一个作为主版本,另一个大概率不展现,等于白做。
| 指标 | 健康区间 | 警戒信号 |
|---|---|---|
| 标签总数 / 文章总数 | < 1:10 | > 1:3 |
| 单标签平均文章数 | ≥ 8 | < 3 |
| 只用过 1 次的标签占比 | < 20% | > 40% |
| 近义标签组数 | 0 | ≥ 5 组 |
需要区分标签的两种定位:作为导航的标签(用户会点)和作为内部分类维度的标签(只用于筛选)。前者值得保留并做聚合页优化,后者应当合并或降级为不索引。
保姆级实操
步骤1:导出标签清单做人工分组
先把全部标签导出为 CSV,按”同义词组”手工分组。这一步无法自动化,因为语义判断只能靠人。
-- 导出全部标签及其文章数,用于人工分组
SELECT t.term_id, t.name, t.slug, tt.count
FROM wp_terms t
JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'post_tag'
ORDER BY tt.count DESC;
步骤2:合并同义标签
WordPress 后台”文章 → 标签”支持编辑标签的 slug,但真正的合并需要用”删除标签并重新分配”的逻辑。可以用插件(如 Term Management Tools)在后台批量操作,也可以用代码:
// 一次性脚本:把 source 标签下的文章全部改挂到 target 标签(用完即删)
add_action( 'init', function() {
if ( ! current_user_can( 'manage_options' ) || ! isset( $_GET['merge_tag'] ) ) {
return;
}
$source = 12; // 待合并标签 term_id
$target = 8; // 保留标签 term_id
$posts = get_objects_in_term( $source, 'post_tag' );
foreach ( $posts as $post_id ) {
wp_set_object_terms( $post_id, array( (int) $target ), 'post_tag', true );
wp_remove_object_terms( $post_id, array( (int) $source ), 'post_tag' );
}
wp_delete_term( $source, 'post_tag' );
wp_die( '合并完成,共处理 ' . count( $posts ) . ' 篇文章' );
} );
步骤3:批量删除零文章标签
空标签没有聚合价值,可以直接清理,但操作前必须备份数据库:
-- 先查看:没有任何文章的标签
SELECT t.term_id, t.name
FROM wp_terms t
JOIN wp_term_taxonomy tt ON t.term_id = tt.term_id
WHERE tt.taxonomy = 'post_tag' AND tt.count = 0;
-- 确认无误后再删除(请把 id 替换为上一步查到的值,操作前备份)
DELETE FROM wp_term_relationships WHERE term_taxonomy_id IN (SELECT term_taxonomy_id FROM wp_term_taxonomy WHERE taxonomy='post_tag' AND term_id IN (101,102,103));
DELETE FROM wp_term_taxonomy WHERE taxonomy='post_tag' AND term_id IN (101,102,103);
DELETE FROM wp_terms WHERE term_id IN (101,102,103);
步骤4:给合并掉/删除掉的标签 URL 做 301
旧标签页如果有外链或已被收录,必须 301 到保留的标签页,否则产生死链:
# 合并后的旧标签页 301 到保留标签页(放在 server 块内)
rewrite ^/tag/wordpress-2/?$ /tag/wordpress/ permanent;
rewrite ^/tag/seo-youhua/?$ /tag/seo/ permanent;
步骤5:建立标签准入规则并写进编辑规范
规则示例:每篇文章标签数 2–4 个;新建标签必须先在后台搜索是否已有同义标签;单标签满 3 篇才允许创建。
步骤6:用代码限制每篇文章的标签上限
可以给编辑加一个数量提醒,减少事后清理的工作量:
// functions.php:保存文章时检查标签数量,超过 5 个记录提醒
add_action( 'save_post', function( $post_id, $post ) {
if ( wp_is_post_revision( $post_id ) || 'post' !== $post->post_type ) {
return;
}
$tags = wp_get_post_tags( $post_id, array( 'fields' => 'ids' ) );
if ( count( $tags ) > 5 ) {
set_transient( 'too_many_tags_' . $post_id, count( $tags ), 300 );
}
}, 10, 2 );
步骤7:合并后重新提交 sitemap
标签 URL 变化后,需要更新 sitemap 并在搜索资源平台重新提交,同时在”URL 删除”里处理已失效的旧标签页。
常见踩坑
- 不备份直接跑 DELETE:
wp_term_relationships是多对多关系表,误删会丢文章与分类的关联。 - 只删标签不做 301:旧标签页变成 404,如果已有外链就白白损失权重,处理方法参考
404页面与状态码规范。 - 合并时忘记同步 slug:只改了名称没改 slug,URL 没变,重复页面依然存在。
- 一次性删除几百个标签:索引量短期剧烈波动,建议每周处理一批。
- 案例:某博客标签数从 430 治理到 60,做法是先导出清单人工分组,把 380 个近义或低频标签合并进保留标签,再对 120 个已收录的旧标签 URL 做 301。三个月后索引量下降 25%,但来自聚合页的流量翻了一倍——因为保留下来的标签页平均文章数从 3 篇涨到 22 篇,终于有了聚合价值。
- 用标签做内部筛选维度:把”是否已校对””是否原创”这类内部状态做成标签并开放索引,会产生一批毫无搜索价值的页面。
- 忽略标签云插件的输出:标签云把几百个标签全部输出到前台,等于给爬虫发了一份低质页面清单。
总结
标签治理的顺序是:导出盘点 → 人工分组 → 合并到保留标签 → 删除空标签 → 旧 URL 做 301 → 建立准入规则。其中”建立准入规则”是唯一能防止复发的一步,务必落实为编辑规范。判断治理是否见效,不看标签数量下降了多少,而看保留下来的标签页平均文章数是否升到 8 篇以上。治理完成后,聚合页策略可以按 分类页与标签页收录策略 的四条标准重新校准一遍。
