⚠️ 原文为 BricksLabs Pro 付费教程,核心代码锁定。本文按可见步骤给场景 + 骨架,代码用 Bricks 官方钩子补全并标注「补全实现」。
场景:父分类标签 + 子分类内容
需求:用 Bricks 的 Tabs(Nestable) 元素展示分类层级——每个顶级父分类作为一个标签页标题,标签内容区显示该父分类下的子分类列表。原文只输出第 2 层(即顶级父分类的直接子分类),不再向下递归。
典型结构示例:
分类结构:
├─ 电子设备(父)
│ ├─ 手机
│ └─ 平板
└─ 家居(父)
├─ 沙发
└─ 灯具
页面效果:Tabs 标签 = [电子设备] [家居]
电子设备 面板内:手机 / 平板(子分类列表)
数据结构与实现思路
实现分两段:
- 标签循环:外层遍历顶级父分类(
parent = 0的分类),渲染成 Tab 标题。 - 内容循环:每个 Tab 面板内,遍历“当前父分类”的直接子分类(
parent = 当前分类 ID),渲染子分类名称 + 链接(点击跳转到该子分类归档页)。
难点同样是嵌套上下文:内层“子分类查询”必须知道当前标签对应哪个父分类。Bricks 的 Terms 查询支持 {term_id} 动态数据,但嵌套时要显式引用外层循环对象。
Step 1:Tabs 容器与标签循环
在 Bricks 编辑器里:
- 添加 Tabs(Nestable) 元素,删除默认的静态标签项。
- 在 Tabs 标题容器里加一个 Query Loop(Terms 查询类型),查询顶级分类:Taxonomy 选
category,Parent留空或设为 0(仅顶级),排序按名称。 - 循环项内放文本元素,动态数据用
{term_title}输出分类名,{term_link}输出链接。
Tabs(Nestable)与普通 Tabs 的区别:标题和面板是一一对应的循环结构,允许用查询循环动态生成标签数量——这正是本需求的基石,静态 Tabs 无法实现未知数量的分类。
Step 2:子分类列表循环(补全实现)
每个标签面板内,添加第二个 Query Loop(Terms 查询),要求它只输出当前外层父分类的直接子分类。
以下为补全实现(基于官方钩子 bricks/terms/query_vars——Bricks 官方文档中 Terms 查询的过滤钩子),放入子主题 functions.php(去掉开头 <?php):
// 补全实现:Terms 查询过滤钩子,非原文代码
// 让内层子分类查询跟随外层循环的当前父分类
add_filter( 'bricks/terms/query_vars', function( $query_vars, $settings ) {
// 仅处理标记为"子分类"的查询(可通过 queryKey 或元素 ID 区分)
if ( empty( $settings['query']['bl_subcategories'] ) ) {
return $query_vars;
}
// 读取外层循环当前分类对象(Bricks 循环上下文)
$parent_term = \Bricks\Query::get_loop_object( 'term' );
if ( $parent_term instanceof WP_Term ) {
$query_vars['parent'] = $parent_term->term_id; // 只取直接子分类
$query_vars['hide_empty'] = false; // 无文章的子分类也显示
} else {
$query_vars['parent'] = -1; // 无外层上下文时返回空结果
}
return $query_vars;
}, 10, 2 );
模板侧配合:内层 Terms 查询的 PHP 查询编辑器中加入标记参数('bl_subcategories' => true),让过滤钩子能识别出这是子分类查询。子分类项渲染名称 + 链接即可,样式上用列表排版。
中文小结
“父分类做标签、子分类做内容”的架构 = Tabs(Nestable)提供动态标签骨架 + 双层 Terms 查询提供数据。核心技术点是把内层子分类查询用 bricks/terms/query_vars 钩子绑定到外层当前分类的 term_id 上,实现嵌套上下文传递。这套模式还可延伸:父分类标签 + 父分类下最新文章列表(把内层换成 Posts 查询、cat 参数用外层 {term_id})、或三级分类(外层再套一层)。Bricks 的 Terms 查询配合循环上下文,是搭分类导航、目录页、归档索引的利器。