⚠️ 原文为 BricksLabs Pro 付费教程,核心代码锁定。本文按可见结构写原理 + 两种方式骨架,代码用 Bricks 官方 API 补全并标注「补全实现」。
场景:内层循环需要外层数据
Bricks 的嵌套查询支持无限层级:分类 → 年份 → 文章,或任意组合。内层循环经常需要“向上看”——比如文章循环里想输出“当前文章所属的外层分类 ID”,或者三层嵌套时想拿“最外层(而非紧邻父级)“的对象数据。
Bricks 默认只给紧邻的父级循环提供方便的对象引用,想拿任意层级的父级对象(以及其中的 term_id、post_id 等),有两种方式:
- 按元素 ID:直接引用外层查询元素的 Bricks ID。
- 动态方式:自定义函数,指定要取第几层父级。
Bricks 的循环对象体系
Bricks 在渲染查询循环时,会把当前循环对象(文章 / 分类 / 用户 / 术语等)放进一个对象栈。\Bricks\Query::get_loop_object() 取的是当前层级的对象;父级对象则通过元素 ID 或遍历对象栈获取。理解这一点,嵌套循环的数据流就通了:内层查询执行时,外层对象仍在栈中,只是需要显式的 API 去取。
方式一:按元素 ID 取父级对象
在编辑器里给外层查询元素记下它的 Bricks ID(比如 abc123),内层模板中通过动态数据或自定义函数引用:
// 补全实现:按元素 ID 获取父级循环对象,非原文代码
$parent_object = \Bricks\Query::get_loop_object_by_element_id( 'abc123' );
拿到对象后:
- 外层循环是分类:
$parent_object->term_id取分类 ID。 - 外层循环是文章:
$parent_object->ID取文章 ID。
适合层级固定、不会大改的页面——ID 写死,简单直接。缺点是外层元素 ID 变了要同步改。
方式二:自定义函数按层级取(补全实现)
层级动态变化或想复用,写一个函数按“向上第几层”取对象。以下为补全实现(基于 Bricks 官方循环对象 API,非原文代码),放入子主题 functions.php(去掉开头 <?php):
// 补全实现:取第 $level 层父级循环对象,非原文代码
// $level = 1 表示紧邻的父级,2 表示再上一层,依此类推
function bl_get_parent_loop_object( $level = 1 ) {
// Bricks 把当前查询对象上下文暴露在查询实例中
$query_id = \Bricks\Query::get_query_element_id() ?: '';
// 通过查询对象链向上追溯:Bricks 查询对象带 parent 引用
$query = \Bricks\Query::get_instance_by_element_id( $query_id );
$current = $query;
for ( $i = 0; $i < $level; $i++ ) {
if ( ! $current || empty( $current->parent ) ) {
return null; // 没有这么多层父级
}
$current = $current->parent; // 向上移动一层
}
return $current ? $current->object : null;
}
再配合一个取属性的便捷函数:
// 补全实现:取第 $level 层父级对象的指定属性(如 term_id / ID),非原文代码
function bl_get_parent_loop_prop( $level = 1, $prop = 'term_id' ) {
$obj = bl_get_parent_loop_object( $level );
if ( ! $obj ) {
return '';
}
if ( $obj instanceof WP_Term ) {
return $obj->term_id;
}
if ( $obj instanceof WP_Post ) {
return $obj->ID;
}
return isset( $obj->{$prop} ) ? $obj->{$prop} : '';
}
白名单注册后即可在模板动态数据里用 {echo:bl_get_parent_loop_prop:2,term_id} 取“向上第 2 层”的分类 ID:
add_filter( 'bricks/code/echo_function_names', function( $names ) {
return array_merge( $names, [ 'bl_get_parent_loop_prop' ] );
} );
中文小结
嵌套查询“向上取父级对象”是 Bricks 进阶开发的必修课,两种方式各有适用场景:按元素 ID 直给、零抽象,适合结构固定的页面;自定义函数按层级灵活可复用,适合三层以上嵌套或模板复用。核心原理是 Bricks 的查询对象链(每个查询实例持有 parent 引用),沿链向上移动即可拿到任意层级的循环对象及其 term_id/ID。掌握它之后,诸如“文章内显示其最外层分类的图片”“三层嵌套里用最外层数据做条件“这类需求都能直接落地。