本文为付费教程的骨架翻译:场景与步骤按原文梳理,锁定部分的代码按 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 白名单回填。注意钩子只对目标分类法生效,并控制查询规模。
注意事项
这套「按关联文章过滤术语」有几点要留意:一是钩子只对目标分类法生效,在 bricks/terms/query_vars 里要按 taxonomy 判断,避免误伤别的术语查询;二是控制查询规模,反向查文章时用 fields=>'ids' 和必要参数,别在大站点上每术语都跑一次重查询;三是 Meta Box 和 ACF 在这套流程里没有区别,只是字段读取方式不同(rwmb_meta vs get_field),别因为换了插件重写整套逻辑。付费锁定部分的代码按官方钩子补全即可,未复制原文。
常见问题(FAQ)
Q:为什么钩子要限制 taxonomy? A:不限制会误伤站内其他术语查询,只在目标分类法上过滤才安全。
Q:ACF 字段也能用这套吗?
A:能,流程一样,只是把 rwmb_meta 换成 get_field 读取字段。
Q:大站点上会很慢吗?
A:反向查文章时带 fields=>'ids' 和控制参数,避免每术语都跑重查询即可。
Q:这是什么类型的需求? A:「按关联文章过滤术语」是 Terms 查询的进阶用法,行业/标签筛选常见。
延伸阅读
- 想要现成外贸独立站模板与建站实战?看 铲子铺 chanzipu 的外贸建站教程(同用 Bricks,从零搭出能收询盘的站)
- 相关阅读:Bricks Query Loop Api Data
延伸阅读
Bricks Terms 查询预过滤:只输出未来年份(bricks/terms/query_vars)
教程:Bricks Terms 查询预过滤:只输出未来年份(bricks/terms/query_vars)——terms query 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
tutorial用 Bricks 设计产品详情页:WooCommerce 还是 Meta Box?
拆解 Bricks 下产品详情页的两种做法:WooCommerce 现成小部件 vs Meta Box + MB CPT 自定义字段,并给出 B2B / B2C 的选型建议。
tutorial用 Bricks 做产品列表页:WooCommerce 与 Meta Box 两条路线怎么选
对比 Bricks 下做产品列表页的两种主流方案——WooCommerce 原生小部件与 Meta Box + MB CPT 自定义,并讲清 Products Filter 等核心小部件的用法与取舍。
tutorialBricks 自定义字段文本限字数动态标签:{custom_field_word_limit_字段名:数字}
教程:Bricks 自定义字段文本限字数动态标签:{custom_field_word_limit_字段名:数字}——dynamic data 附完整代码可直接复用,适合外贸独立站与 WordPress 开发者。
