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

首页 / 中文教程 / 教程

Bricks 嵌套查询循环:CPT 循环里套 Meta Box Group 循环

教程:Bricks 嵌套查询循环:CPT 循环里套 Meta Box Group 循环——meta box 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。

Ray ChanRay Chan·2026-08-11·约 2 分钟
目录
  1. 1.场景:课程列表 + 每门课的日程
  2. 2.Step 1:日期时间字段的存取格式
  3. 3.Step 2:搭建嵌套循环结构
  4. 4.嵌套循环的对齐原理

场景:课程列表 + 每门课的日程

Bricks 查询循环支持嵌套:外层循环每输出一个循环项,内层循环就针对这个循环项再跑一次查询。经典组合是“CPT 列表 + 每篇文章的 Meta Box Group 字段”:

静态页面列出全部课程(course CPT),每门课下面显示它自己的日程事件——事件存在 Meta Box 的可克隆 Group 字段 events 里,子字段是开始时间(Start Datetime)和结束时间(End Datetime),都是 Datetime Picker 类型。

外层循环负责课程,内层循环用 Bricks 内置的 MB Group 查询类型直接读当前课程的 events 字段,两层循环的行数不同也没关系——内层循环只属于它所在的那个外层循环项。全程在构建器里点选,不需要 PHP。

Step 1:日期时间字段的存取格式

动手搭结构之前,先处理字段存取格式,这是最容易踩的坑:

  1. 在 Meta Box 字段设置里,把两个 Datetime Picker 子字段的 Save format 设为 Y-m-d H:i:s。

  2. 勾选 “Save value as timestamp”(存为时间戳)。

为什么?日期时间字段默认可能按显示格式存字符串,字符串排序和比较都不可靠。统一成时间戳存储后,后续要做“按开始时间排序”“只显示未来事件”这类操作时,数据本身就是可比的数字。注意:改格式不会自动转换已存数据——如果课程条目是在修改设置之前录入的,需要逐条重新选择一次日期时间并保存,让字段按新格式重写。

Step 2:搭建嵌套循环结构

用 Bricks 编辑一个静态页面,按下面结构搭(名称只是便于识别):

  1. Section > Container:放一个 “Our Courses” 的 h2 标题。

  2. 标题下方加一个 Container,里面放一个 Block,改名为 “Course CPT Loop”:

    • 启用查询循环,Post type 设为 Courses(课程);

    • Block 里放一个 Post Title 元素(h3),显示课程名。

  3. 在 Post Title 下方再加一个 Block,改名为 “Events Field Loop”:

    • 启用查询循环,查询类型选 MB Group: Events(对应 events 字段);

    • 循环项里放 Basic Text,通过动态数据面板的 Meta Box 分组插入开始时间和结束时间两个子字段,样式按需排版(比如“3月1日 10:00 – 12:00”)。

保存并查看前端:每个课程卡片下方都列出它自己的日程;没有填 events 字段的课程,内层循环为空,不会多出空白行。

相关阅读:

嵌套循环的对齐原理

嵌套循环之所以“自动对齐”,是因为 Bricks 的查询系统在渲染内层循环时,会把当前外层循环项作为查询上下文(即 object_id)传给内层查询。MB Group 查询类型读取的就是这个上下文文章的 events 字段——外层循环到哪门课,内层就读哪门课的数据,天然一一对应,不需要任何手动传参。

由此可以延伸出很多组合:

  • 外层是 Taxonomy 术语循环,内层是该分类下的文章;

  • 外层是 ACF Repeater 循环,内层读循环项引用的文章(配合自定义查询类型);

  • 内层 MB Group 查询同样支持按子字段排序/筛选(bricks/query/run 钩子),可以在嵌套场景里叠加。

小结:嵌套查询循环 = 外层循环提供上下文 + 内层循环消费上下文。MB Group 是 Bricks 内置查询类型里最适合做嵌套的之一,因为 Group 字段天然挂在单篇文章上。记住两个要点:日期时间子字段统一用时间戳存储(改了格式要重存旧数据),内层循环的查询类型选 MB Group 并指向目标字段名。这套结构同样适用于 MB Cloneable 等其他字段形态。

性能与注意事项

嵌套循环最该警惕的是查询次数膨胀:外层 N 篇文章,内层每篇再查一次,就是 N 次额外查询。文章量不大时无所谓,量上来后要确认内层查询走了缓存或索引,必要时用 update_post_meta 预存计算结果。另一个坑是日期时间字段的存储格式——统一用时间戳,改了格式记得把旧数据重存一遍,否则内层读出来的顺序和筛选会乱。其余嵌套组合(外层术语 + 内层文章、外层 ACF Repeater + 内层引用文章)思路完全一致。

常见问题(FAQ)

Q:内层循环怎么知道外层是哪篇文章? A:Bricks 渲染内层时会把当前外层循环项作为 object_id 传给内层查询,天然一一对应,不需要手动传参。

Q:日期字段格式要注意什么? A:统一用时间戳存储;改了格式之后旧数据要重存,否则内层读出来的排序和筛选会出错。

Q:还能怎么嵌套? A:外层是分类术语循环、内层是该分类下文章;或外层 ACF Repeater、内层读循环项引用的文章,都行。

延伸阅读

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.

延伸阅读