欢迎光临好主题官网!致力于 WordPress 企业主题定制开发及 WP外贸模板下载。

WordPress 自定义分类法中 wp_set_object_terms() 的顺序问题详解

文章目录

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 => trueterm_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企业主题 资源,帮助中小企业轻松构建专业网站。 转载请注明来源,并保留原文链接,感谢您的支持与理解。

发表回复

相关文章
主题推荐
还没有账号?

会员注册

成为会员,获得更多专属优惠!

验证码: 加载中... =

已有账号?