⚠️ 原文为 BricksLabs Pro 付费教程,核心代码锁定。本文按可见步骤写场景 + 骨架,代码用 Bricks 官方钩子补全并标注「补全实现」。
场景:大列表 + 每分类独立加载更多
BricksLabs 群里有位用户做产品目录:归档页结构是“外层查询列出产品分类(手机、平板…),内层查询列出该分类下的产品”。分类很多、产品上千,每分类默认只显示 4-5 个,点该分类自己的 Load More 按钮再追加。但他遇到两个硬伤:
- 分类列表本身是动态查询出来的,无法给每个分类选一个唯一的 CSS 选择器,AJAX 加载器不知道当前点的是哪个分类的按钮。
- 用 Bricks 原生的 Load more 交互,在嵌套查询循环里点击任意按钮,加载的都是错误分类的产品,或所有分组同时被影响。
这正是嵌套查询循环 + Load More 的经典坑:每个分类共享同一个查询实例 key,Bricks 的加载更多机制不知道“当前组”是哪个。
为什么原生 Load More 在嵌套循环里失效
Bricks 的 Load more 交互依赖查询元素的 data-query-* 属性和 Bricks ID。在嵌套循环里,内层查询被循环渲染多次(每个分类一份),但每份 DOM 上的查询标识相同——于是点击任一按钮,Bricks 都以为你在给“同一个查询”翻页,结果所有分组一起翻页,或翻到错误分组的数据。
方案骨架:Component + JS + 动态标签
原文的完整方案分三层,付费墙内的具体代码锁定,思路如下:
- Bricks Component 封装分组标记:把“分类名 + 内层产品列表 + Load More 按钮 + 剩余数量”封装成组件,每个分类实例通过组件参数获得唯一的
data-category-id标记。 - 自定义 JS 读取查询 trail:Bricks 渲染查询时会在 DOM 里写入内部查询痕迹元素(query trail,含查询参数和分页信息)。JS 在它们被移除前读取,识别当前组对应的查询 key 与分类 ID,实现“点了哪个分类的按钮就只翻哪个分类的页”。
- 自定义 PHP 动态数据标签
{bl_remaining_posts}:首次加载时输出该分类剩余未显示的文章数,每次 AJAX 加载后由 JS 同步更新,全部加载完后隐藏按钮。
核心补全实现:剩余数量动态标签
动态数据标签部分可以用 Bricks 官方钩子 bricks/dynamic_data/tags + bricks/dynamic_data/render_tag 补全,放入子主题 functions.php(去掉开头 <?php):
// 补全实现:注册 {bl_remaining_posts:分类ID} 动态标签,非原文代码
add_filter( 'bricks/dynamic_data/tags', function( $tags ) {
$tags['bl_remaining_posts'] = [
'label' => 'Remaining Posts Count per Category',
'render' => 'bl_render_remaining_posts',
];
return $tags;
} );
function bl_render_remaining_posts( $tag, $post, $context, $name ) {
// 参数:分类 ID(如 {bl_remaining_posts:12})
$term_id = isset( $tag['args'][0] ) ? intval( $tag['args'][0] ) : 0;
if ( ! $term_id ) {
return 0;
}
// 该分类下的总文章数
$total = (int) get_term( $term_id )->count;
// 每分类默认显示数量(与内层查询设置保持一致,如 5)
$per_page = 5;
return max( 0, $total - $per_page );
}
模板里按分类输出 {bl_remaining_posts:分类ID}(分类 ID 用外层循环的 {term_id} 动态传入),按钮文案即可显示“还有 N 篇”。
中文小结
嵌套查询循环里做“每分类独立 Load More”,本质要解决两件事:每个分组的查询上下文唯一化(组件传参 + 唯一 data 标记)和 剩余数量的数据源(动态标签按分类计算)。Bricks 原生交互做不到前者,必须借助 JS 读取查询 trail 或自行维护分页状态;后者用 bricks/dynamic_data/tags 注册自定义标签即可,官方钩子齐全。骨架中“Component + 自定义 JS + 动态标签”三层结构是这类需求的通用解法,也适用于“每分类无限滚动”——把按钮换成滚动监听,触发点改成“滚动到该分组底部”即可。