
本文详解如何使用 WP_Query 正确排除带有指定标签(如 tag ID 36)的文章,同时保留含其他标签(如 tag ID 18)的文章——关键在于避免误用 tax_query 的默认关系,改用 tag__in、tag__not_in 或组合式 tax_query 并显式指定 'operator' => 'AND'。
本文详解如何使用 wp_query 正确排除带有指定标签(如 tag id 36)的文章,同时保留含其他标签(如 tag id 18)的文章——关键在于避免误用 `tax_query` 的默认关系,改用 `tag__in`、`tag__not_in` 或组合式 `tax_query` 并显式指定 `'operator' => 'and'`。
在 WordPress 中,WP_Query 的 tax_query 参数默认采用 'relation' => 'OR'(即使未显式声明),这意味着你提供的 ['18', '-36'] 并不会被解析为“包含 18 且不包含 36”,而是被当作两个独立条件:term_id = 18 OR term_id = -36 —— 而负号 -36 在 tax_query 中并非排除语法,它会被忽略或导致意外行为(如匹配 term slug 为 "36" 的标签,而非排除)。因此,原始写法实际等效于仅查询含标签 18 的文章,完全无法实现排除逻辑。
✅ 正确做法有以下三种,按推荐顺序排列:
1. 使用专用标签参数(最简洁可靠)
$args = array(
'tag__in' => array(18), // 必须包含标签 ID 18
'tag__not_in'=> array(36), // 同时必须不包含标签 ID 36
);
$query = new WP_Query($args);
✅ 优势:语义清晰、性能高效、无需手动处理 taxonomy 关系;tag__not_in 是 WordPress 原生支持的排除参数,专为此类场景设计。
WordPress API Pro下载生产级WordPress REST API集成,用于管理文章、页面、媒体、WooCommerce产品、Elementor内容、SEO元数据、ACF及JetEngine字段
2. 使用 tax_query + 显式 AND 关系与 NOT IN 运算符
$args = array(
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'post_tag',
'field' => 'term_id',
'terms' => 18,
'operator' => 'IN' // 必须包含
),
array(
'taxonomy' => 'post_tag',
'field' => 'term_id',
'terms' => 36,
'operator' => 'NOT IN' // 必须不包含
)
)
);
$query = new WP_Query($args);
⚠️ 注意:'field' => 'term_id' 必须明确指定,否则默认按 'slug' 匹配,可能导致误判;两个子数组需置于同一 tax_query 中并设 'relation' => 'AND'。
3. 避免的错误写法(对照警示)
// ❌ 错误:负 ID 在 tax_query 中无效
'tax_query' => array(
array(
'taxonomy' => 'post_tag',
'terms' => ['18', '-36'] // -36 不会被识别为排除!
)
)
// ❌ 错误:缺少 relation 和 operator,逻辑仍为 OR
'tax_query' => array(
array('taxonomy'=>'post_tag','terms'=>18),
array('taxonomy'=>'post_tag','terms'=>36,'operator'=>'NOT IN')
) // 默认 relation='OR' → 结果包含任一条件,失去排除意义
? 总结建议:
- 优先使用 tag__in + tag__not_in(适用于标签)或 cat__in + cat__not_in(适用于分类目录),代码简短且意图明确;
- 若需跨多个自定义分类法(如同时筛选标签和产品类别),再选用 tax_query 并严格配置 relation 和 operator;
- 永远避免在 terms 数组中混用正负 ID——这不是 WordPress 的语法规范,属于常见误解。
通过以上任一正确方式,即可精准获取「含有标签 18 但不含标签 36」的文章集合,彻底解决排除失效问题。











