WordPress开发笔记

在使用ACF插件为WordPress创建分类法时,有一项 术语排序(该分类法中的术语是否应按照提供给 `wp_set_object_terms()` 的顺序排序。)是什么意思?

好的,这是一个关于 WordPress 核心功能和 ACF 插件结合的非常专业的问题。我们来详细拆解一下。

核心概念:wp_set_object_terms()

首先,wp_set_object_terms() 是 WordPress 的一个核心函数,它的作用是为某篇文章(或任何其他类型的文章对象,如页面、自定义文章类型)设置(添加或覆盖)它所属于的术语(term)。

它的函数签名大致如下:

wp_set_object_terms( $object_id, $terms, $taxonomy, $append );
  • $object_id: 文章ID
  • $terms: 要设置的术语数组或字符串
  • $taxonomy: 分类法名称(如 ‘category’, ‘post_tag’ 或你的自定义分类法)
  • $append: 如果为 false(默认),新设置的术语将覆盖原有的。如果为 true,则新术语会追加到原有术语之后。

“按照提供给 wp_set_object_terms() 的顺序排序”是什么意思?

这个选项(在 ACF 中创建分类法时勾选 Term Order)控制的是:当你为文章设置多个术语时,WordPress 是否会记住你传入这些术语的先后顺序,并在查询时按照这个顺序进行排序。

让我们通过两种场景来理解:


场景一:启用 / 按照 提供的顺序排序 (‘term_order’ => true)

情况描述:
你创建了一个名为 “演员” 的自定义分类法,并勾选了 “术语排序”。你在编辑一篇文章时,为它选择了三个术语:[‘莱昂纳多’, ‘汤姆·汉克斯’, ‘摩根·弗里曼’]。ACF 在后台调用 wp_set_object_terms() 时,传入的术语数组就是这个顺序。

会发生什么:

  1. 数据库记录:WordPress 不仅会在关系表 (wp_term_relationships) 中记录“文章A属于术语X,Y,Z”,还会在一个专门的 term_order 字段里为每个关系记录一个数字顺序(例如:莱昂纳多=0,汤姆·汉克斯=1,摩根·弗里曼=2)。
  2. 查询结果:当你使用 wp_get_post_terms()get_the_terms() 等函数获取这篇文章的“演员”术语时,如果不指定其他排序参数(如 orderby),WordPress 会默认按照你当初设置的顺序返回术语对象数组。
    php $actors = get_the_terms( $post_id, 'actor' ); // $actors 数组的顺序很可能是: [莱昂纳多, 汤姆·汉克斯, 摩根·弗里曼]
  3. 用途:这对于需要手动指定优先级或显示顺序的场景非常有用。比如,你想把主角放在第一位,配角放在后面;或者为一个产品指定多个特性,并按重要性排序。

场景二:禁用 / 不按照 提供的顺序排序 (‘term_order’ => false)

情况描述:
同样是 “演员” 分类法,但你没有勾选 “术语排序”。你在编辑文章时,同样选择了 [‘莱昂纳多’, ‘汤姆·汉克斯’, ‘摩根·弗里曼’]

会发生什么:

  1. 数据库记录:WordPress 仍然会在关系表中记录这些关系,但会忽略你传入的顺序term_order 字段的值通常会被设置为 0 或被忽略。
  2. 查询结果:当你获取这篇文章的术语时,WordPress 不会使用任何特定的顺序。它的默认行为可能是按照术语ID、名称或其他字段的字母顺序进行排序。具体顺序取决于查询的 orderby 参数,默认通常是按 ‘name’ 排序。
    php $actors = get_the_terms( $post_id, 'actor' ); // $actors 数组的顺序可能是按名称字母排序: [莱昂纳多, 摩根·弗里曼, 汤姆·汉克斯] (中文按拼音) // 或者是按术语ID排序,这完全取决于它们被创建的先后顺序。
  3. 用途:这是大多数分类法(如默认的“标签”)的默认行为。当你不关心术语与文章关联的具体顺序,只关心关联关系本身时,就使用这个选项。排序交给其他的逻辑(如按名称、按文章数量等)来处理。

总结与对比

特性按照顺序排序 (启用)不按照顺序排序 (禁用)
ACF 选项勾选 “术语排序”不勾选 “术语排序”
数据库使用 term_order 字段存储顺序忽略 term_order 字段
获取术语的默认顺序调用 wp_set_object_terms() 时传入的顺序通常是术语的 ‘name’(名称字母顺序)或 ‘term_id’
控制力,开发者/编辑者可精确控制顺序,顺序由数据库默认排序规则决定
性能开销轻微,需要维护顺序字段无额外开销
典型用例人员名单(按主演、配角)、产品特性排序、步骤流程博客标签、普通分类、任何不需要固定顺序的场景

重要提示

  1. $append 参数的影响:当你使用 wp_set_object_terms( $post_id, [‘术语C’, ‘术语A’], ‘genre’, false )$appendfalse)时,它会用新的数组 完全替换 旧的术语列表更新顺序。如果你使用 true,那么 [‘术语C’, ‘术语A’] 会被追加到现有列表的末尾,从而影响整体顺序。
  2. 查询可覆盖:即使用户启用了术语排序,在调用 get_the_terms() 时,你仍然可以通过 ‘orderby’ => ‘name’ 这样的参数覆盖默认的排序行为。禁用术语排序后,‘orderby’ => ‘term_order’ 参数将无效。
  3. ACF 界面的操作:在 ACF 的关联术语字段界面上拖拽排序,其本质就是在调用 wp_set_object_terms() 时传入一个有序的数组。这个功能依赖于分类法是否支持 term_order

简单来说,这个选项决定了你是否能通过“设置术语时的顺序”来控制“获取术语时的顺序”。 如果需要这个功能就勾选,不需要则保持不勾选以保持简单和默认行为。