Meta Box Relationship 与 Bricks 查询循环
Meta Box 的 Relationship 字段(Meta Box 自带功能,不需要额外插件)用来建立 CPT 之间的多对多关联,比如“产品关联到创作者”“活动关联到证言”。Bricks 查询循环内置了 MB Relationship 查询类型,单篇页上零代码就能列出关联文章——这一点和 ACF Relationship 一样。
但内置类型同样有边界:拿不到关联数量做条件渲染、排序规则有限、无法叠加额外筛选。这篇用 PHP 查询编辑器给出完全可控的写法:rwmb_meta() 取关联 ID 数组,塞进 post__in,其余交给 WP_Query 参数体系。
Step 1:建字段与双向关联
- 建好两个 CPT,比如
game(游戏)和review(评测)。 - 给
game加一个字段组,字段类型选 Relationship,字段 IDrelated_reviews,Post Type 选review,勾选 Multiple(允许选多个)。 - 想让关系双向(在评测侧也能看到关联的游戏),在 Relationship 字段设置里启用双向关联,并填上对面 CPT 的对应字段 ID——Meta Box 会在两端各建一个字段,后台编辑任何一侧都能维护关系。
Step 2:PHP 查询编辑器取关联 ID
- 新建类型为 Single 的模板,模板条件设为
game的单篇。 - 结构:Section 里放 Post Title / Post Content;再一个 Section 放 “Related Reviews” 标题和 Container > Block。
- Block 启用查询循环,打开 Query editor (PHP),粘贴:
$related = rwmb_meta( 'related_reviews' );
// 没有关联评测时返回空结果
if ( empty( $related ) ) {
return [ 'post__in' => [ 0 ] ];
}
return [
'post_type' => 'review',
'post__in' => (array) $related,
'orderby' => 'post__in',
'posts_per_page' => -1,
];
和 ACF 版的区别就在取值函数:rwmb_meta( 'related_reviews' ) 在单篇模板里自动读当前文章的字段值,Relationship 字段默认直接返回 ID 数组(ACF 默认返回文章对象,Meta Box 默认返回 ID,这是两个插件最典型的差异),所以这里直接用 (array) $related 转一下类型就行,不需要 wp_list_pluck。
其余逻辑一致:orderby => 'post__in' 保持后台手动排序;空值返回 [ 'post__in' => [ 0 ] ] 让查询必然为空,防止“没关联就显示全部”。
- 循环里放 Post Title、Featured Image 等元素输出每篇评测。
排序、计数与常见坑
几个实用补充:
- 手动顺序优先:后台拖拽的顺序就是
$related数组的顺序,配合orderby => 'post__in'原样输出。想按发布日期排,把orderby改成'date'加'order' => 'DESC'即可; - 计数与条件渲染:需要“有相关评测才显示整个区块”时,可以在区块外层加条件,或用自定义动态标签
{bl_related_count}输出count( rwmb_meta( 'related_reviews' ) )(注册方式见bricks/dynamic_data/tags钩子),配合 Bricks 的可见性条件做判断; - 空值返回类型:
rwmb_meta()对未填写的 Relationship 字段返回空数组,个别情况返回null,所以empty()判断加(array)强转是双保险; - 双向关联的取值方向:在
review单篇模板里想显示关联游戏,把字段名换成related_games即可,代码结构一字不改。
Relationship 与 Post 字段的区别
Meta Box 还有一类 Post 类型字段(单选/多选指向文章),容易和 Relationship 混淆。两者在 Bricks 里的取法几乎一样(都是 rwmb_meta 拿 ID 数组),区别在语义:Post 字段是单向的简单指向,适合“这篇评测关联那篇文章”;Relationship 是独立的关系表,支持双向、多对多,能在 Meta Box → Relationships 里统一管理。如果只是单页显示“相关文章”,Post 字段更轻;要做双向维护或两侧互相可见,用 Relationship。
小结:Meta Box Relationship + PHP 查询循环 = rwmb_meta() 取 ID 数组 + post__in 查询。与 ACF 版唯一实质区别是返回值形态(ID 数组 vs 对象数组)。记住 empty 兜底、(array) 强转、orderby => 'post__in' 三个细节,就能在任意单篇模板里自由输出关联文章,还能随手叠加筛选、分页和排序。