WordPress 分类目录体系:父子结构、未分类与批量整理
先给判断:一篇文章只进一个分类,可以挂多个标签。这句话听着像老生常谈,但大部分中文 WordPress 站点的目录混乱,都是从没守住这条线开始的——该进分类的进了标签,该做层级的地方摊平成几十个平级分类,最后导航栏塞不下,只能靠搜索框兜底。
分类和标签的本质区别
WordPress 后台的文章编辑页右侧有两个框,上面是分类目录,下面是标签。它们在数据库里都存进 wp_terms、wp_term_taxonomy、wp_term_relationships 三张表,结构几乎一样,差别在于语义约束:分类是树,标签是集合。
分类有 parent 字段,能形成父子关系,所以它适合表达「栏目」——读者顺着导航一层层点下去,能穷举出站点所有内容。标签没有层级,它是横切的,适合表达「主题词」,比如 WooCommerce、Nginx、备案,一篇文章可以同时属于这三个词。
| 维度 | 分类目录 | 标签 |
|---|---|---|
| 数量关系 | 一篇一个主分类 | 一篇可挂多个 |
| 层级 | 支持父子,wp_terms 里存 parent | 不支持层级 |
| 地址结构 | /category/父/子/ | /tag/别名/ |
| 主要用途 | 栏目导航、面包屑、落地页 | 相关内容、主题聚合 |
| 是否进主导航 | 应该进 | 一般不进 |
实际判断标准很简单:如果这个词你会想让它出现在顶部导航,它是分类;如果只是想让读者看完这篇能顺手点开同类文章,它是标签。两者都要控制总量,分类超过 30 个、标签超过 200 个,就该停下来重新规划了。
后台允许一篇文章勾选多个分类,技术上没问题,但一旦这么做,分类页的文章数会互相重叠,读者也没法判断「这篇文章到底属于哪个栏目」。如果确实有跨栏目需求,正确做法是选一个主分类,另外那个用标签补,或者在模板里用「相关文章」模块手动关联。这条纪律在多人协作的站点尤其重要,因为它直接决定后台列表能不能按栏目筛出干净的结果。
父子分类最多做几层
WordPress 本身不限层数,wp_terms 的 parent 是自引用字段,你想建十层它也存得下。但可用性上,超过三层就没意义了:移动端导航展开困难,面包屑会挤成一行,搜索引擎的抓取深度也变差。
给客户做改版时通常按「两层为主、三层封顶」规划,例如:
- 技术资料(一级) → WordPress 建站(二级) → 安全加固(三级)
- 案例(一级) → 制造业(二级)
如果某个分支确实需要第四层,说明这一层应该拆成独立栏目,而不是继续往树里挂。
还有一个容易忽略的点:子分类的文章不会自动出现在父分类页。后台「文章 → 分类」里,父分类那一行的计数不含子分类文章。想让父分类页把子分类内容一起列出来,得用 pre_get_posts 改主查询,或者在模板里自己拼参数:
add_action( 'pre_get_posts', function( $q ) {
if ( is_admin() || ! $q->is_main_query() || ! $q->is_category() ) {
return;
}
$cat = get_queried_object();
$ids = get_term_children( $cat->term_id, 'category' );
$ids[] = $cat->term_id;
$q->set( 'category__in', $ids );
} );
get_term_children 返回的是 term_id 数组,category__in 接受的也正是 term_id,两者别和 slug 混用,混了会静默返回空列表。
未分类:删不掉,但可以驯服
「未分类」是安装时自动创建的,term_id 固定为 1,后台不允许删除。很多站把它当历史遗留不管,结果没选分类的文章全堆在这里,最后变成几百篇的大杂烩,分类页第一页全是杂项。
正确处理分三步。
- 改默认分类。进入「设置 → 写作 → 默认文章分类」,指向一个真实栏目,例如「资讯」。这样以后新文章漏选分类也至少落在合理位置。
- 改名字和别名。确实要保留兜底位,就把它改名成「其他」,别名改成 others,界面上比 Uncategorized 体面。改名不影响已有链接,改别名才需要配 301。
- 清空存量。用「文章 → 所有文章」按分类筛选,勾选后「批量操作 → 编辑 → 应用」一次性改到目标分类。数量过千时后台会超时,改用 SQL 或 WP-CLI。
-- 把未分类文章挂到 term_id = 12 的分类
INSERT OR IGNORE INTO wp_term_relationships (object_id, term_taxonomy_id, term_order)
SELECT p.ID, 12, 0 FROM wp_posts p
JOIN wp_term_relationships tr
ON tr.object_id = p.ID AND tr.term_taxonomy_id = 1
WHERE p.post_type = 'post' AND p.post_status = 'publish';
DELETE tr FROM wp_term_relationships tr
WHERE tr.term_taxonomy_id = 1;
执行前先 mysqldump 导出这两张表。term_taxonomy_id 和 term_id 在默认安装下数值相同,但如果你手动改过数据,务必先 select 确认,写错了会把文章挂到别的栏目上。
批量导入和批量改名
改版迁移时最常见的活,是把一个表格里的几百个栏目名变成分类树。三种做法各有边界:
| 做法 | 适用规模 | 代价 |
|---|---|---|
| 后台逐个新建 | 10 个以内 | 慢,但不会出错 |
| CSV 导入插件 | 数百到数万 | 要配字段映射,导入后重建缩略图 |
| WP-CLI 脚本 | 任意 | 要会写脚本,可重复执行 |
WP-CLI 最稳,因为可以写成文件反复跑:
wp term create category "安全加固" --parent=15 --slug=anquan-jiagu
wp term list category --fields=term_id,name,slug,parent,count
批量改名用 wp term update category 加 ID 和 –name 参数。改名前先导一份对照表,改完再导一次做 diff,比肉眼核对靠得住。中文分类名改成英文别名后,后台列表里两者的对应关系容易忘,对照表要留在项目文档里。
另一个高频需求是合并重复分类。后台没有合并功能,只能先迁文章再删空分类:
# 把 old-slug 下的文章全部转到 new-slug
wp post list --category_name=old-slug --field=ID --format=ids
| xargs -r wp post term set {} category new-slug --by=slug
# 确认计数为 0 后删除
wp term delete category $(wp term get category old-slug --field=term_id)
分类页 URL 和描述对 SEO 的价值
默认分类页地址是 /category/技术资料/,中文会被 urlencode 成 /category/%e6%8a%80%e6%9c%af%e8%b5%84%e6%96%99/。虽然能访问,但分享出去很难看,日志里也难读。两条路:给每个分类填英文别名,或者在「设置 → 固定链接」里换掉分类前缀。改前缀会改变全部分类页地址,上线前必须做好 301,具体做法见 固定链接设置。
分类描述(后台分类编辑页的「描述」框)默认多数主题不显示,但它是分类页唯一能写正文的地方。填 80 到 150 字,说明这个栏目收录什么、怎么组织,比留空更有意义。部分 SEO 插件会把它输出到分类页顶部,配合 canonical 使用,效果比在内链里堆关键词好得多,完整思路在 WordPress SEO 优化 里有展开。
还有两个开关值得设置:分类页分页之后(第 2 页起)建议 noindex、follow;空分类要么删掉,要么 noindex。空分类返回 200 但没有任何内容,属于典型的低质量页,留着只是让爬虫多跑一趟。
列表密度也该顺手调一下。「设置 → 阅读 → 博客页面至多显示」控制的是全站列表条数,默认 10 条,对技术类长文偏少。分类页每页 12 到 20 条比较合适:太少会让分页数量暴增,产生大量 /page/8/ 这种薄页;太多则单页体积过大,移动端首屏要等很久。改完记得在主题里确认分页函数用的是全局 $wp_query,不是自己另起一个 query,否则条数设置不生效。
建议的整理顺序
- 导出全站分类:wp term list category –fields=term_id,name,slug,parent,count > cats.csv
- 标出 count 为 0 的分类,确认无用后删除。
- 标出名称近似的(教程、WordPress 教程、wp 教程),合并到一个,其余做 301。
- 确定两层骨架,把平级分类挂到父级下。
- 处理未分类存量,并把默认分类指向真实栏目。
- 给每个保留的分类填别名和描述。
- 检查导航菜单,一级栏目控制在 6 到 8 个。
整理完刷新一次固定链接(「设置 → 固定链接」直接点保存即可),清掉缓存插件和 CDN 的分类页缓存,再顺着 全站目录 走一遍,确认每个分类都能点进去、每篇文章都有归属、没有孤立的空栏目。这套流程在 网站改版 项目里基本是标准动作,因为它一次解决导航、内链和收录三件事。