WordPress 自定义分类法中 wp_set_object_terms()
的顺序问题详解
在 WordPress 开发中,我们经常会注册自定义分类法(taxonomy),并通过 wp_set_object_terms()
给文章、产品或其他自定义文章类型绑定术语(terms)。
但是你可能会遇到这样的问题:
当我按照特定顺序传入术语时,这个顺序在以后获取时能不能保持一致?
本文将详细解析这个问题,并告诉你 什么时候顺序会被保留,什么时候不会。
1. 背景
wp_set_object_terms()
的作用是将指定的术语绑定到对象(例如文章 ID)上:
wp_set_object_terms( int $object_id, array|string $terms, string $taxonomy, bool $append = false );
例如:
wp_set_object_terms( 123, [ '香蕉', '苹果', '橙子' ], 'fruit' );
看似我们是「香蕉 → 苹果 → 橙子」这个顺序,但默认情况下,WordPress 不会保证以后获取到的术语还是这个顺序。
2. 关键点:sort
参数
在注册分类法时,我们可以在 register_taxonomy()
中传递一个参数:
'sort' => true
作用:
- 告诉 WordPress,这个分类法下的术语和对象的关系是有顺序意义的。
- 保存术语时会将顺序记录到数据库
wp_term_relationships
表的term_order
字段中。
默认值:false
false
:不记录顺序,获取术语时通常按名称、ID 或其它规则排序。true
:按你传入的数组顺序记录,之后可按term_order
排序取出。
3. 数据库存储差异
假设文章 ID 为 1
,传入的术语是:
[ '香蕉', '苹果', '橙子' ]
sort = true
object_id | term_taxonomy_id | term_order 1 | 香蕉ID | 0 1 | 苹果ID | 1 1 | 橙子ID | 2
sort = false
(默认)object_id | term_taxonomy_id | term_order 1 | 香蕉ID | 0 1 | 苹果ID | 0 1 | 橙子ID | 0
可以看到,只有开启了 sort => true
,term_order
才会保存我们传入的顺序。
4. 获取时的对比
当我们调用:
$terms = get_the_terms( 1, 'fruit' );
- 如果
sort = true
,并且用orderby => 'term_order'
排序,就能得到和传入一致的顺序。 - 如果
sort = false
,则顺序不确定,可能按 ID、字母、甚至数据库返回顺序排列。
5. 什么时候应该开启 sort
✅ 建议开启的场景
- 有明确业务顺序的标签,例如「步骤 1 → 步骤 2 → 步骤 3」
- 产品属性需要固定展示顺序(颜色、尺寸等)
- 自定义模块绑定多个标签时,要按手动顺序输出
❌ 不建议开启的场景
- 分类目录(通常按层级和名称展示)
- 一般标签云,不关心先后顺序
6. 总结对比
sort 值 |
保存顺序 | 获取时是否可按原顺序 | term_order 变化 |
---|---|---|---|
false (默认) |
否 | 否 | 全部为 0 |
true |
是 | 是(需 orderby 参数) | 记录为 0,1,2… |
一句话总结:
如果你的术语顺序有业务意义,就在
register_taxonomy()
时加上'sort' => true
,否则就按默认不排序处理。
这样整理后,你在 WordPress 开发中就能更有针对性地控制分类法术语的顺序了。
本文由 好主题 原创整理,致力于分享实用的 WordPress 建站知识与主题开发经验。 我们专注于提供高质量的 WordPress企业主题 资源,帮助中小企业轻松构建专业网站。 转载请注明来源,并保留原文链接,感谢您的支持与理解。