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

首页 / 中文教程 / 教程

Bricks 嵌套查询循环:向上取任意层父级循环对象(Parent Query Loop Object)

教程:Bricks 嵌套查询循环:向上取任意层父级循环对象(Parent Query Loop Object)——query loop 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。

Ray ChanRay Chan·2026-08-12·约 2 分钟
目录
  1. 1.场景:内层循环需要外层数据
  2. 2.Bricks 的循环对象体系
  3. 3.方式一:按元素 ID 取父级对象
  4. 4.方式二:自定义函数按层级取(补全实现)
  5. 5.中文小结

⚠️ 原文为 BricksLabs Pro 付费教程,核心代码锁定。本文按可见结构写原理 + 两种方式骨架,代码用 Bricks 官方 API 补全并标注「补全实现」。

场景:内层循环需要外层数据

Bricks 的嵌套查询支持无限层级:分类 → 年份 → 文章,或任意组合。内层循环经常需要“向上看”——比如文章循环里想输出“当前文章所属的外层分类 ID”,或者三层嵌套时想拿“最外层(而非紧邻父级)“的对象数据。

Bricks 默认只给紧邻的父级循环提供方便的对象引用,想拿任意层级的父级对象(以及其中的 term_id、post_id 等),有两种方式:

  1. 按元素 ID:直接引用外层查询元素的 Bricks ID。

  2. 动态方式:自定义函数,指定要取第几层父级。

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。掌握它之后,诸如“文章内显示其最外层分类的图片”“三层嵌套里用最外层数据做条件“这类需求都能直接落地。

性能与注意事项

向上取父级对象本质是在循环上下文里沿对象链往上找,开销很小,不必担心性能。真正要留意的是层级越深、每次取值越频繁,最好把取到的父级数据在模板里缓存一次、多处复用,别在循环每一项里反复向上查。另外方式二(自定义函数按层级)依赖 Bricks 的查询对象链 API,不同版本 API 细节可能有调整,升级后若取不到值,先核对官方查询钩子文档,别硬编码层级数。

常见问题(FAQ)

Q:内层怎么拿到外层数据? A:两种方式:按元素 ID 直接取父级对象(结构固定时用),或自定义函数沿查询对象链按层级取(三层以上或模板复用用时)。

Q:取最外层而不是紧邻父级怎么做? A:自定义函数里把层级往上多走几层即可,不限于父级。

Q:升级 Bricks 后取不到父级了? A:多半是查询对象链 API 细节随版本变了,核对官方钩子文档再调整,别写死层级。

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.

延伸阅读