⚠️ 原文为 BricksLabs Pro 付费教程,核心代码锁定。本文按可见步骤写场景 + 骨架,代码用 Bricks 官方钩子/官方查询功能补全并标注「补全实现」。
场景:设置页选人,页面显示该人资料
用户需求:有一个 CPT「开发者档案」(developer profiles),每篇档案存一位开发者的信息字段。然后在 Meta Box 设置页(Settings Page)里放一个 Post 类型字段,运营人员从这里选一位“当前重点展示的开发者”。现在要在首页输出这位开发者的档案数据——标题、正文、自定义字段(如邮箱、技术栈)。
用户的原始尝试全失败,他试过:
{mb_wl-settings_active_dev_profile:meta:dev_contact_email}
{mb_wl-settings_active_dev_profile:meta:post_id}
{mb_get_post_meta:{mb_wl-settings_active_dev_profile},dev_contact_email}
都只显示出了 Post 名称(选项的标签),取不到选中文章的元数据。
为什么动态数据直接取不出来
根因在于 Meta Box 设置页的 Post 字段,存进 wp_options 表(设置页是全局选项,不是文章元数据),值只是选中文章的 ID。动态数据标签 {mb_xxx:meta:yyy} 是按“文章上下文”解析的——它以为你在当前文章里取 meta,自然取不到另一篇文章的数据。正确思路是:先把设置页里的文章 ID 取出来,再把它作为查询目标,让 Bricks 把查询上下文切换成那篇文章。
Step 1:PHP 查询编辑器取选中文章(补全实现)
Bricks 的 PHP 查询编辑器支持动态数据解析,可以直接从设置页读出选中文章 ID,返回它作为查询结果。以下为补全实现(基于 Bricks 官方 PHP 查询功能,非原文代码),粘贴到 Query Loop 的 PHP 查询编辑器:
// 补全实现:从 Meta Box 设置页读取选中的 Post 字段值并作为查询结果
// 假设:CPT = team;设置页 ID = settings;Post 字段 ID = team_member
$selected_post_id = rwmb_meta( 'team_member', [ 'object_type' => 'setting' ], 'settings' );
if ( empty( $selected_post_id ) ) {
return []; // 未选择时返回空结果,配合 {query_results_count} 条件隐藏区块
}
return [
'post_type' => 'team',
'post__in' => [ (int) $selected_post_id ],
'posts_per_page' => 1,
];
要点:
-
rwmb_meta( $field_id, ['object_type' => 'setting'], $settings_page_id )是 Meta Box 官方 API 读取设置页字段值的方式(第二个参数声明对象类型是 setting,第三个参数是设置页 ID)。 -
把读到的 ID 放进
post__in,查询就锁定为这一篇文章。循环项即选中文章,循环内所有动态数据(标题、正文、任意自定义字段)自动切换为该文章上下文。 -
设置页里没选任何文章时返回空数组——配合
{query_results_count:bricksid}条件(见本站相关教程),区块无结果时整体隐藏,避免显示空白。
Step 2:模板输出字段数据
-
在 Section → Container 里加 Block,开启 Query Loop,Query 类型选 Custom Query / PHP,粘贴 Step 1 的代码。
-
循环项模板内正常放元素:
-
标题:
{post_title}(自动是选中开发者档案的标题)。 -
正文:
{post_content}。 -
自定义字段:
{mb_开发者档案字段组_字段ID}或按你的字段配置选择动态数据。
-
-
若区块需要在未选择时隐藏,给区块挂动态数据条件
{query_results_count:区块BricksID}(大于 0)。
相关阅读:
中文小结
“Meta Box 设置页选中文章 → 页面输出该文章数据”的通用解法是用 PHP 查询编辑器做一次上下文跳转:rwmb_meta() 读出设置页 Post 字段的 ID,构造 post__in 查询锁定该文章,循环内的所有动态数据自然指向它。核心认知:设置页数据在 wp_options、文章数据在 wp_postmeta,动态数据标签无法跨表解析,必须通过查询把上下文切换过去。这套模式同样适用于 ACF Options 页的 Post 对象字段(get_field('字段', 'option'))——思路完全一致,换函数名即可。
常见误区
这套写法最容易卡在一个认知误区:以为动态数据标签能直接读设置页字段。其实设置页数据存在 wp_options 表,文章数据在 wp_postmeta 表,两者不互通,动态标签没法跨表解析,所以必须通过一次 PHP 查询把上下文「跳」到那篇文章上。同样的坑也出现在 ACF Options 页——它的 Post 对象字段要用 get_field('字段','option') 在查询里读,而不是丢给前端动态标签。记住「跨表必走查询」,这类需求就通了。
常见问题(FAQ)
Q:为什么动态数据直接取不到设置页选的文章?
A:设置页数据在 wp_options、文章数据在 wp_postmeta,动态标签跨不了表,必须靠 PHP 查询切换上下文。
Q:ACF Options 页的 Post 字段也能这么取吗?
A:能,思路一致,把 rwmb_meta 换成 get_field('字段','option') 即可。
Q:设置页没选任何人会怎样? A:查询拿不到 ID,循环为空,前端那块自然不显示;上线前最好给个兜底判断。
Q:能一次输出多个设置页字段吗? A:可以,在查询里把需要的字段都读出来,循环内用对应动态标签分别渲染。
延伸阅读
- 想要现成外贸独立站模板与建站实战?看 铲子铺 chanzipu 的外贸建站教程(同用 Bricks,从零搭出能收询盘的站)
- 相关阅读:Bricks Setup Guide
延伸阅读
Bricks 自定义字段文本限字数动态标签:{custom_field_word_limit_字段名:数字}
教程:Bricks 自定义字段文本限字数动态标签:{custom_field_word_limit_字段名:数字}——dynamic data 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 让元素输出 N 次(N = 自定义字段值):Array 查询类型实战
教程:Bricks 让元素输出 N 次(N = 自定义字段值):Array 查询类型实战——query loop 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 输出 Meta Box 图片高级字段的随机一张图
教程:Bricks 输出 Meta Box 图片高级字段的随机一张图——meta box 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorialBricks 按 ACF Gallery 图片数量做动态条件输出
教程:Bricks 按 ACF Gallery 图片数量做动态条件输出——acf 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
