本文为付费教程的骨架翻译:场景与步骤按原文梳理,锁定部分的代码按 Bricks 官方钩子补全实现,并已注明「补全实现」。未复制原文代码。
场景:只显示公开职位的行业
想象这样一个内容结构:自定义文章类型(CPT)job(职位),自定义分类法 industry(行业),以及一个 Radio 类型的自定义字段 job_visibility,默认值 public,另一个选项是 private(私有)。
需求是:只展示「有公开职位」的行业术语。也就是说,一个行业术语下如果只有私有职位,就不该出现在前端;职位全部公开的行业才显示。
示例数据:职位 A(Construction 行业、public)、职位 B(Pharmaceutical 行业、public)、职位 C(Construction 行业、private)……最终 Terms 输出应该只有 Construction 和 Pharmaceutical。这里用 Meta Box 建字段组(换成 ACF 做法完全一样)。
Step 1:搭建 Terms 查询循环
- 在 Bricks 编辑器里给某个 Block 启用查询循环(Query Loop),查询类型选 Terms(术语)。
- 选择你的分类法(这里是
industry)。 - 在循环 Block 内添加 Heading 或 Basic Text 元素,动态数据填:
{term_name}
此时前端会输出该分类法的全部术语——包括只有私有职位的行业,这正是接下来要过滤掉的。
Step 2:按文章字段过滤术语(补全实现)
付费原文锁定,这里给出基于官方钩子的补全实现。Bricks 的 Terms 查询最终会走 get_terms(),并暴露 bricks/terms/query_vars 过滤器来修改查询参数。思路:查出该分类法下所有术语,再用「术语下是否存在 job_visibility = public 的职位」来筛选。
// 补全实现:仅保留存在公开职位的行业术语
add_filter( 'bricks/terms/query_vars', function( $query_vars ) {
// 只对目标分类法生效
if ( empty( $query_vars['taxonomy'] ) || 'industry' !== $query_vars['taxonomy'] ) {
return $query_vars;
}
// 拉取该分类法全部术语(含空的,便于后续判断)
$terms = get_terms( [
'taxonomy' => 'industry',
'hide_empty' => false,
'fields' => 'ids',
] );
$keep = [];
foreach ( $terms as $term_id ) {
// 判断该术语下是否存在 job_visibility 为 public 的职位
$has_public = new WP_Query( [
'post_type' => 'job',
'posts_per_page' => 1,
'fields' => 'ids',
'tax_query' => [ [ 'taxonomy' => 'industry', 'terms' => $term_id ] ],
'meta_query' => [ [ 'key' => 'job_visibility', 'value' => 'public' ] ],
] );
if ( $has_public->have_posts() ) {
$keep[] = $term_id;
}
wp_reset_postdata();
}
// 把过滤后的术语 ID 交给查询
$query_vars['include'] = $keep;
return $query_vars;
} );
用 include 参数把术语列表限定为白名单,Bricks 会按这些 ID 输出术语。字段名、文章类型、分类法名都按你的实际配置替换。
原理说明
- Terms 查询本质是对
get_terms()的封装,bricks/terms/query_vars是官方提供的修改入口,返回的数组会作为查询参数传入。 - 术语本身没有「可见性」概念,可见性挂在关联的文章上,所以必须反向查询:遍历术语 → 查术语下有没有满足字段条件的文章。
- 用
posts_per_page = 1的轻量WP_Query只验证存在性,避免一次性拉取大量文章。 - 正式使用时建议给结果加一层
wp_cache或 transient,术语多、文章多时避免每个术语一次数据库查询。
小结
「按关联文章过滤术语」是 Terms 查询里最常见的进阶需求。核心套路:bricks/terms/query_vars 钩子里遍历术语、反向查文章、把通过筛选的术语 ID 用 include 交回查询。Meta Box 和 ACF 在这套流程里没有区别,字段读取方式不同而已。
小结:Terms 查询按文章字段过滤 = 遍历术语 + 反向 WP_Query 验证 + include 白名单回填。注意钩子只对目标分类法生效,并控制查询规模。