本文为付费教程的骨架翻译:场景与步骤按原文梳理,锁定部分的代码按 Bricks 官方钩子补全实现,并已注明「补全实现」。未复制原文代码。
场景:只显示未来的活动年份
假设有一个 Events(活动)CPT,挂了一个「Event Year(活动年份)」自定义分类法,术语名就是年份:2021、2022、2024、2025、2028……
Bricks 的 Terms 查询默认会把所有术语列出来。这里有两个问题需要处理:
- 空术语:没有任何文章挂 2021,但 2021 仍然会出现在列表里——需要隐藏空术语(Bricks 查询设置里勾选 Hide Empty 即可)。
- 过去年份:2022 就算有文章也已经是历史活动,需求是只输出未来的、非空的年份。注意 2028 这样的年份术语名本身就是可比较的数字,过滤依据是术语名,不是文章内容。
付费原文正是用 bricks/terms/query_vars 过滤器解决第二个问题。
Step 1:搭建年份 Terms 查询
- 在 Bricks 编辑器给 Block 启用查询循环,查询类型选 Terms。
- 分类法选
event-year(你的年份分类法)。 - 查询设置里打开 Hide Empty(隐藏空术语),这样没有活动的年份直接消失。
- 循环内放 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 更省事。