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

首页 / 中文教程 / 教程

Bricks Terms 查询按文章自定义字段过滤(公开职位案例)

教程:Bricks Terms 查询按文章自定义字段过滤(公开职位案例)——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 官方钩子补全实现,并已注明「补全实现」。未复制原文代码。

场景:只显示公开职位的行业

想象这样一个内容结构:自定义文章类型(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 查询循环

  1. 在 Bricks 编辑器里给某个 Block 启用查询循环(Query Loop),查询类型选 Terms(术语)。

  2. 选择你的分类法(这里是 industry)。

  3. 在循环 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 查询的进阶用法,行业/标签筛选常见。

延伸阅读

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.

延伸阅读