⚠️ 原文为 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'))——思路完全一致,换函数名即可。