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

首页 / 中文教程 / 教程

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

教程:Bricks Terms 查询预过滤:只输出未来年份(bricks/terms/query_vars)——terms query 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。

Ray ChanRay Chan·2026-08-11·约 2 分钟
目录
  1. 1.场景:只显示未来的活动年份
  2. 2.Step 1:搭建年份 Terms 查询
  3. 3.Step 2:预过滤未来年份(补全实现)
  4. 4.原理说明
  5. 5.小结

本文为付费教程的骨架翻译:场景与步骤按原文梳理,锁定部分的代码按 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 更省事。

注意事项

预过滤未来年份时有几个细节:一是空术语用 Hide Empty 顺手去掉,不用在代码里额外判断;二是术语名存的是数值(年份)才方便比较,若你把年份存在 term meta 而非术语名里,改用 meta_query 按 meta 值比较更省事;三是**include 回填的是通过筛选的术语 ID 数组**,返回空时记得让查询优雅退化(比如显示全部或提示无结果),别让页面报错。付费锁定部分已按官方 bricks/terms/query_vars 钩子补全实现。

常见问题(FAQ)

Q:为什么用 bricks/terms/query_vars 而不是普通过滤? A:它能在术语查询执行前重查并筛选术语、再用 include 交回,适合按术语名/值预过滤。

Q:年份存在 term meta 里怎么筛? A:改用 meta_query 按 meta 值做数值比较,比从术语名里解析年份更稳。

Q:空年份术语怎么处理? A:开启查询的 Hide Empty 即可顺手去掉没有文章的年份。

Q:没有未来年份时页面会报错吗? A:让 include 在空结果时优雅退化(显示全部或提示),别直接传空导致报错。

延伸阅读

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.

延伸阅读