🆕 Bricks 2.4 已发布:查询循环性能提升 40%,迁移教程同步更新 →

首页 / 中文教程 / 教程

Bricks 输出 Meta Box 设置页里选中文章的数据(PHP 查询实现)

教程:Bricks 输出 Meta Box 设置页里选中文章的数据(PHP 查询实现)——meta box 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。

Ray ChanRay Chan·2026-08-12·约 2 分钟
目录
  1. 1.场景:设置页选人,页面显示该人资料
  2. 2.为什么动态数据直接取不出来
  3. 3.Step 1:PHP 查询编辑器取选中文章(补全实现)
  4. 4.Step 2:模板输出字段数据
  5. 5.中文小结

⚠️ 原文为 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:模板输出字段数据

  1. 在 Section → Container 里加 Block,开启 Query Loop,Query 类型选 Custom Query / PHP,粘贴 Step 1 的代码。

  2. 循环项模板内正常放元素:

    • 标题:{post_title}(自动是选中开发者档案的标题)。

    • 正文:{post_content}。

    • 自定义字段:{mb_开发者档案字段组_字段ID} 或按你的字段配置选择动态数据。

  3. 若区块需要在未选择时隐藏,给区块挂动态数据条件 {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:可以,在查询里把需要的字段都读出来,循环内用对应动态标签分别渲染。

延伸阅读

Ray Chan

站长

Ray Chan

WordPress Developer & Bricks Specialist

WordPress developer with 10+ years of client builds. Switched to Bricks in 2023 — now builds fast WordPress sites and migrates legacy Elementor/Divi projects.

延伸阅读