首页 / 中文教程 / 教程

Bricks Terms 查询预过滤:只输出未来年份(bricks/terms/query_vars)

在 Bricks 的 Terms 查询循环中按术语值本身过滤,例如活动年份分类法只显示未来的非空年份,通过 bricks/terms/query_vars 官方钩子实现。

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

本文为付费教程的骨架翻译:场景与步骤按原文梳理,锁定部分的代码按 Bricks 官方钩子补全实现,并已注明「补全实现」。未复制原文代码。

场景:只显示未来的活动年份

假设有一个 Events(活动)CPT,挂了一个「Event Year(活动年份)」自定义分类法,术语名就是年份:2021、2022、2024、2025、2028……

Bricks 的 Terms 查询默认会把所有术语列出来。这里有两个问题需要处理:

  1. 空术语:没有任何文章挂 2021,但 2021 仍然会出现在列表里——需要隐藏空术语(Bricks 查询设置里勾选 Hide Empty 即可)。
  2. 过去年份:2022 就算有文章也已经是历史活动,需求是只输出未来的、非空的年份。注意 2028 这样的年份术语名本身就是可比较的数字,过滤依据是术语名,不是文章内容。

付费原文正是用 bricks/terms/query_vars 过滤器解决第二个问题。

Step 1:搭建年份 Terms 查询

  1. 在 Bricks 编辑器给 Block 启用查询循环,查询类型选 Terms
  2. 分类法选 event-year(你的年份分类法)。
  3. 查询设置里打开 Hide Empty(隐藏空术语),这样没有活动的年份直接消失。
  4. 循环内放 Heading 或 Basic Text,动态数据 {term_name} 输出年份。

此时列表里剩下的都是有活动的年份,但 2021、2022 这类过去年份仍在。接下来做预过滤。

Step 2:预过滤未来年份(补全实现)

付费原文锁定,这里按官方钩子补全实现。bricks/terms/query_vars 修改的是 get_terms() 的参数,除了常规查询参数,还可以用 meta_query 对术语元数据过滤——但年份存在术语名里,所以正确做法是拉取后按名称过滤,再用 include 回填:

// 补全实现:只保留未来的非空年份术语
add_filter( 'bricks/terms/query_vars', function( $query_vars ) {
    if ( empty( $query_vars['taxonomy'] ) || 'event-year' !== $query_vars['taxonomy'] ) {
        return $query_vars;
    }

    $terms = get_terms( [
        'taxonomy'   => 'event-year',
        'hide_empty' => true, // 与 Bricks 查询设置保持一致
        'fields'     => 'all',
    ] );

    $current_year = (int) date( 'Y' );
    $keep = [];

    foreach ( $terms as $term ) {
        if ( is_numeric( $term->name ) && (int) $term->name >= $current_year ) {
            $keep[] = $term->ID;
        }
    }

    $query_vars['include'] = $keep;
    return $query_vars;
} );

is_numeric 先过滤掉名称不是纯数字的意外术语,(int) 强转后与当前年份比较。年份术语名是四位数,字典序和数值序一致,直接 >= 字符串比较也可行,但转 int 更严谨。字段名、分类法名请按你的实际配置替换。

原理说明

  • bricks/terms/query_vars 是 Bricks 为 Terms 查询暴露的官方过滤器,返回数组即 get_terms() 的参数。
  • 过滤依据是术语名(年份),不是文章元数据,所以走「取出 → 遍历 → 按名比较 → include 回填」的路线,而不是 meta_query
  • 重复拉一次术语列表的开销在该场景可接受;术语量大时建议加 transient 缓存(如每天刷新一次年份列表)。
  • 如果年份存在术语 meta 而非术语名(比如字段存成独立 meta),则可以直接在 query_vars 里加 meta_query,无需 include 回填。

小结

「按术语名/术语值预过滤 Terms 查询」是 bricks/terms/query_vars 的典型用法:钩子里重查术语、按规则筛选、include 交回。空术语用 Hide Empty 顺手解决。付费锁定部分按官方钩子补全实现,未复制原文代码。

小结:未来年份过滤 = Hide Empty 去空术语 + bricks/terms/query_vars 按术语名数值比较 + include 回填。术语存 meta 时改用 meta_query 更省事。

需要帮忙?

用 Bricks 建站?我接客户项目。

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

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