场景:课程列表 + 每门课的日程
Bricks 查询循环支持嵌套:外层循环每输出一个循环项,内层循环就针对这个循环项再跑一次查询。经典组合是“CPT 列表 + 每篇文章的 Meta Box Group 字段”:
静态页面列出全部课程(
courseCPT),每门课下面显示它自己的日程事件——事件存在 Meta Box 的可克隆 Group 字段events里,子字段是开始时间(Start Datetime)和结束时间(End Datetime),都是 Datetime Picker 类型。
外层循环负责课程,内层循环用 Bricks 内置的 MB Group 查询类型直接读当前课程的 events 字段,两层循环的行数不同也没关系——内层循环只属于它所在的那个外层循环项。全程在构建器里点选,不需要 PHP。
Step 1:日期时间字段的存取格式
动手搭结构之前,先处理字段存取格式,这是最容易踩的坑:
- 在 Meta Box 字段设置里,把两个 Datetime Picker 子字段的 Save format 设为
Y-m-d H:i:s。 - 勾选 “Save value as timestamp”(存为时间戳)。
为什么?日期时间字段默认可能按显示格式存字符串,字符串排序和比较都不可靠。统一成时间戳存储后,后续要做“按开始时间排序”“只显示未来事件”这类操作时,数据本身就是可比的数字。注意:改格式不会自动转换已存数据——如果课程条目是在修改设置之前录入的,需要逐条重新选择一次日期时间并保存,让字段按新格式重写。
Step 2:搭建嵌套循环结构
用 Bricks 编辑一个静态页面,按下面结构搭(名称只是便于识别):
- Section > Container:放一个 “Our Courses” 的 h2 标题。
- 标题下方加一个 Container,里面放一个 Block,改名为 “Course CPT Loop”:
- 启用查询循环,Post type 设为 Courses(课程);
- Block 里放一个 Post Title 元素(h3),显示课程名。
- 在 Post Title 下方再加一个 Block,改名为 “Events Field Loop”:
- 启用查询循环,查询类型选 MB Group: Events(对应
events字段); - 循环项里放 Basic Text,通过动态数据面板的 Meta Box 分组插入开始时间和结束时间两个子字段,样式按需排版(比如“3月1日 10:00 – 12:00”)。
- 启用查询循环,查询类型选 MB Group: Events(对应
保存并查看前端:每个课程卡片下方都列出它自己的日程;没有填 events 字段的课程,内层循环为空,不会多出空白行。
嵌套循环的对齐原理
嵌套循环之所以“自动对齐”,是因为 Bricks 的查询系统在渲染内层循环时,会把当前外层循环项作为查询上下文(即 object_id)传给内层查询。MB Group 查询类型读取的就是这个上下文文章的 events 字段——外层循环到哪门课,内层就读哪门课的数据,天然一一对应,不需要任何手动传参。
由此可以延伸出很多组合:
- 外层是 Taxonomy 术语循环,内层是该分类下的文章;
- 外层是 ACF Repeater 循环,内层读循环项引用的文章(配合自定义查询类型);
- 内层 MB Group 查询同样支持按子字段排序/筛选(
bricks/query/run钩子),可以在嵌套场景里叠加。
小结:嵌套查询循环 = 外层循环提供上下文 + 内层循环消费上下文。MB Group 是 Bricks 内置查询类型里最适合做嵌套的之一,因为 Group 字段天然挂在单篇文章上。记住两个要点:日期时间子字段统一用时间戳存储(改了格式要重存旧数据),内层循环的查询类型选 MB Group 并指向目标字段名。这套结构同样适用于 MB Cloneable 等其他字段形态。