为什么不用内置的 ACF Relationship 查询类型
Bricks 的查询循环其实内置了 ACF Relationship 查询类型——在单篇文章页面上,它可以自动读取当前文章的 Relationship 字段,把关联的文章列出来,零代码就能用。那为什么还要折腾 PHP 查询循环?
因为内置类型能做的很有限:你没法精细控制排序规则(比如按关联字段本身的手动顺序之外的方式排)、没法轻松叠加 meta_query、也没法在循环外拿到关联数量去做条件判断。换成 PHP 查询编辑器,一切回到你熟悉的 WP_Query 参数体系,灵活度直接拉满。
本文以“游戏(Game)和评测(Review)两个 CPT 通过 ACF Relationship 互相关联,在游戏单篇页显示其所有评测”为例,完整走一遍。
Step 1:建 CPT 与双向 Relationship 字段
-
在 ACF → Post Types 里创建
game(游戏)和review(评测)两个 CPT。 -
给每个 CPT 建字段组,各加一个 Relationship 类型字段:
-
gameCPT 的字段related_reviews,设置里勾选“双向关联”,目标填review的related_games字段; -
reviewCPT 的字段related_games,同样勾选双向关联,目标填game的related_reviews字段。
-
双向关联的好处:在任意一侧编辑文章时都能维护关系,而且 Bricks 查询循环自带的 ACF Relationship 类型在两侧都能用。字段的 Return Format 建议保持默认(返回文章对象数组),代码里我们会用 wp_list_pluck 取 ID,两种返回格式都能兼容。
Step 2:单篇模板里用 PHP 查询循环
-
新建类型为 Single 的模板,命名为 “Game”,编辑模板条件(Template Conditions)设为
game类型的全部单篇。 -
模板结构:第一个 Section 放 Post Title 和 Post Content;第二个 Section 放一个 “Related Review” 标题,标题下方是 Container > Block,用来承载查询循环。
-
在 Block 上启用查询循环,打开 Query editor (PHP),粘贴:
$related = get_field( 'related_reviews' );
// 没有关联评测时返回空结果
if ( empty( $related ) ) {
return [ 'post__in' => [ 0 ] ];
}
return [
'post_type' => 'review',
'post__in' => wp_list_pluck( $related, 'ID' ),
'orderby' => 'post__in',
'posts_per_page' => -1,
];
要点:
-
get_field( 'related_reviews' )在单篇模板里会自动读取当前文章的字段值,不需要传第二个参数; -
wp_list_pluck( $related, 'ID' )把返回的文章对象数组转成 ID 数组——如果字段 Return Format 设的是 ID 数组,这行可以省略,直接用$related; -
orderby => 'post__in'保持关联字段里手动拖拽的顺序,不会被打乱; -
空值返回
[ 'post__in' => [ 0 ] ]是 Bricks 社区的标准写法:构造一个必然查不到结果的查询,避免“没有关联时显示全部评测”的错误。
- 在循环 Block 里放 Post Title、Featured Image 等元素,输出每篇评测即可。
相关阅读:
进阶:排序、计数与空结果处理
几个常见的升级需求:
-
标题复数处理:如果想让标题在关联数大于 1 时自动显示 “Related Reviews”(带 s),可以在循环外放一个 Basic Text,值用自定义动态标签
{bl_related_count},注册方式见本站其他自定义动态标签教程(bricks/dynamic_data/tags钩子),里面count( get_field( 'related_reviews' ) )返回数字; -
给关联文章套分页:把
posts_per_page改成一个固定值(如 6),并打开查询设置里的分页选项,Bricks 会自动处理翻页参数; -
叠加筛选:返回数组里照常加
meta_query、tax_query,和原生 WP_Query 完全一致。
内置类型还是 PHP 查询?怎么选
先别急着上 PHP:纯展示、不用排序筛选、关联数少的场景,内置的 ACF Relationship 查询类型零代码就能跑,够用就别折腾。
需要下面任意一条,再切 PHP 查询循环:自定义排序(按字段值、按时间)、叠加 meta_query / tax_query 筛选、循环外要拿关联数量做条件、要做空结果的特殊处理。判断标准一句话——内置类型做不到的事,才值得上 PHP,复杂度要花在刀刃上。
小结:ACF Relationship 字段配合 PHP 查询循环,核心就三步——get_field 取出关联文章、wp_list_pluck 转成 ID 数组、post__in 交给查询。记住空值返回 post__in => [0] 这个防御写法,再配合 orderby => 'post__in' 保住手动排序,就能完全掌控“相关文章”区块的输出。同理适用于 ACF Post Object 字段(取值逻辑一致),只是字段语义上 Post Object 更偏“单选/多选指向”,Relationship 更偏“双向关系”。
常见问题(FAQ)
Q:什么时候用内置的 ACF Relationship 查询类型就够了? A:纯展示、不需要自定义排序和叠加筛选的场景,内置类型零代码就能列出关联文章。
Q:为什么要返回 post__in => [0]?
A:这是社区标准防御写法:构造一个必然查不到结果的查询,避免「没有关联时错误地显示全部文章」。
Q:orderby => 'post__in' 有什么用?
A:保持关联字段里手动拖拽的顺序,不会被默认排序打乱。
Q:字段 Return Format 设成 ID 数组怎么办?
A:代码里的 wp_list_pluck 一行可以省略,直接把 $related 传给 post__in 即可。
Q:Meta Box 的 Relationship 字段能用吗? A:能,取值函数换成 Meta Box 的即可,本站有对应的 Meta Box 版本教程。
延伸阅读
- 想要现成外贸独立站模板与建站实战?看 铲子铺 chanzipu 的外贸建站教程(同用 Bricks,从零搭出能收询盘的站)
- 相关阅读:Bricks Query Loop Api Data
延伸阅读
Bricks Query Loop:精选文章置顶且不重复(PHP 查询实现)
教程:Bricks Query Loop:精选文章置顶且不重复(PHP 查询实现)——query loop 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 查询循环输出 ACF 图片字段的 Alt、Caption、标题数据
教程:Bricks 查询循环输出 ACF 图片字段的 Alt、Caption、标题数据——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 中输出 ACF Relationship 关联文章的数量
教程:Bricks 中输出 ACF Relationship 关联文章的数量——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 查询循环按 ACF Repeater 子字段值筛选行
教程:Bricks 查询循环按 ACF Repeater 子字段值筛选行——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
