首页 / 中文教程 / 教程

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

在 Bricks 的 Terms 查询循环中,只显示关联了特定自定义字段值的文章所归属的术语。以职位可见性字段为例,通过 bricks/terms/query_vars 过滤术语列表。

Ray Chan·2026-08-11·约 2 分钟

本文为付费教程的骨架翻译:场景与步骤按原文梳理,锁定部分的代码按 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 建站?我接客户项目。

从快速营销站到完整的 Bricks 建站,再到从 Elementor 迁移——我都做过。本站每篇教程都来自真实项目经验。告诉我你的需求,一个工作日内回复。

  • Bricks 建站与改版
  • Elementor / Divi → Bricks 迁移
  • Bricks → Astro / headless 性能升级
  • 速度优化,PageSpeed 95+ 目标