问题描述
我想使用 WP_Query()
类来过滤我的一些帖子。我现在面临的问题是处理分类法查询。通常,WP_Query()
只处理 tax_query()
(AND 或 OR) 的一个关系,但是我需要的是在 tax_query()
上混合使用这些关系,可以如何实现?例如
'tax_query' => array(
'relation' => 'AND',
array(
'taxonomy' => 'taxonomy1',
'field' => 'slug',
'terms' => array( $term)
),
array(
'taxonomy' => 'taxonomy3',
'field' => 'slug',
'terms' => 'terms' => array( $term3),
'operator' => 'IN',
)
// below i want to use OR relationship
'relation' => 'OR',
array(
'taxonomy' => 'taxonomy4',
'field' => 'slug',
'terms' => array( $term4)
),
array(
'taxonomy' => 'taxonomy2',
'field' => 'slug',
'terms' => 'terms' => array( $term2),
'operator' => 'IN',
)
)
我知道上面的代码不行,我需要用 WP_Query()
过滤器来做吗?任何想法?
最佳解决方案
这可以通过使用 term_taxonomy_id 而不是 slug 来完成,这将有效地忽略指定的分类法,只需查看唯一的 term_taxonomy_id 字段。这将使您能够有效地进行混合关系。您需要使用 AND 的整体关系,并使用 IN 运算符将所有与 OR 相关的术语放在一个项目中。您将需要首先将所需的术语映射到其 term_taxonomy_ids 。
$taxes = array( 'taxonomy1', 'taxonomy2', 'taxonomy3', 'taxonomy4' );
foreach ( $taxes as $tax ) {
$terms = get_terms( $tax );
foreach ( $terms as $term )
$tax_map[$tax][$term->slug] = $term->term_taxonomy_id;
}
$args['tax_query'] => array(
'relation' => 'AND',
array(
'taxonomy' => 'taxonomy1',
'field' => 'term_taxonomy_id',
'terms' => array( $tax_map['taxonomy1'][$slug] )
'operator' => 'IN',
),
array(
'taxonomy' => 'taxonomy3',
'field' => 'term_taxonomy_id',
'terms' => array( $tax_map['taxonomy3'][$slug] ),
'operator' => 'IN',
),
array(
'taxonomy' => 'taxonomy4', // gets ignored
'field' => 'term_taxonomy_id',
'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
'operator' => 'IN',
),
);
请注意,在 3.5 之前,您还需要指定'include_children' => false
。查看此 Trac 机票了解更多:https://core.trac.wordpress.org/ticket/21228
参考文献
注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。