首页 / 中文教程 / 教程

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

嵌套查询里如何拿到任意层父级循环的对象(分类 ID、文章 ID 等)?两种方式:按元素 ID 取,或用自定义函数按层级动态取。付费原文锁定,官方钩子补全实现。

Ray Chan·2026-08-12·约 2 分钟

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

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

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

Bricks 默认只给紧邻的父级循环提供方便的对象引用,想拿任意层级的父级对象(以及其中的 term_idpost_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 建站?我接客户项目。

从快速营销站到完整的 Bricks 建站,再到从 Elementor 迁移——我都做过。本站每篇教程都来自真实项目经验。告诉我你的需求,一个工作日内回复。

  • Bricks 建站与改版
  • Elementor / Divi → Bricks 迁移
  • Bricks → Astro / headless 性能升级
  • 速度优化,PageSpeed 95+ 目标