
本文详解 timber 框架下 `tax_query` 的标准语法结构,指出常见错误(将 tax_query 写为单层数组),并提供符合 wordpress 查询规范的嵌套数组写法,确保自定义分类法筛选正常生效。
在 Timber 开发中,通过 tax_query 关联自定义分类法(Taxonomy)筛选自定义文章类型(如 collaborateur)是高频需求。但一个极易被忽略的关键点是:tax_query 参数必须是一个「数组的数组」——即外层数组包含一个或多个查询子数组,每个子数组定义一条独立的分类法匹配规则。
你原始代码中的问题正源于此:
'tax_query' => array( 'taxonomy' => 'expertise-collaborateur', 'field' => 'term_id', 'terms' => array(11), ),
这段写法将 tax_query 直接设为一个关联数组,而非数组集合。WordPress 查询引擎会因此忽略整个 tax_query,导致筛选失效(即使其他参数如 post_type 正确,结果仍返回未过滤的全部文章)。
✅ 正确写法如下(注意内层 array(...)):
$args = array(
'post_type' => 'collaborateur',
'post_status' => 'publish',
'order' => 'DESC',
'posts_per_page' => -1, // 可选:避免分页截断
'tax_query' => array(
array(
'taxonomy' => 'expertise-collaborateur',
'field' => 'term_id', // 支持 'term_id', 'slug', 'name'
'terms' => array(11), // 可传单值(11)或数组([11, 12])
'operator' => 'IN' // 默认值,也可用 'AND', 'NOT IN' 等
)
)
);
$context['teamfilter'] = Timber::get_posts($args);? 进阶提示:动态绑定 ACF 字段值
你提到 $expertise_team = get_field('categorie_dexpertise') 获取的是 ACF 分类字段值。若该字段返回的是 term object 或 term ID(推荐),可直接用于 terms:
// 假设 ACF 字段返回的是 term_id(数字)
if ($expertise_team && is_numeric($expertise_team)) {
$args['tax_query'][0]['terms'] = array((int)$expertise_team);
}
// 若返回的是 term slug(字符串),则需同步修改 field:
// 'field' => 'slug'
$context['teamfilter'] = Timber::get_posts($args);⚠️ 注意事项
- tax_query 必须是二维数组结构,哪怕只有一条规则;
- terms 接受整数、字符串或数组,但类型需与 field 严格一致(term_id → 数字,slug → 字符串);
- 使用 Timber::get_posts() 时,确保目标分类法 expertise-collaborateur 已在 WordPress 中正确定义,并已为 collaborateur 类型注册;
- 调试建议:临时添加 'suppress_filters' => false 并用 WP_Query 原生对象检查 SQL,或使用 Query Monitor 插件验证实际执行的查询语句。
掌握这一语法规范,即可稳定实现基于分类法的精准内容聚合,大幅提升 Timber 主题的灵活性与专业性。










