WP_Query中多个tax_query的多重关系


10

我想使用WP_Query()该类来过滤一些帖子。我现在面临的问题是处理分类法查询。通常,WP_Query()唯一处理一个关系tax_query()(“与”或“或”)的关系,但是我需要在上混合使用这些关系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()过滤器来做到这一点?任何的想法?

Answers:


10

这可以通过使用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


6
顺便说一句,请原谅并提醒我任何错误/不准确:)一方面用一只手打字,另一方面用一个婴儿打字。
helenhousandi 2013年

1
哪里是$slug...?
vancoder

1
只是代码中的占位符。我想这是原始问题中的$ term1等。
helenhousandi 2013年

你是对的!这种方法似乎有效。我将对其进行测试,如果有效,请重新投票给该答案。谢谢
ron_dev

似乎 'taxonomy' => 'taxonomy4', // gets ignored不能忽视。如果我在此字段中输入随机文本,则找不到结果。只有当我分配了真实的分类名称时,它才会给我结果。知道为什么吗?
ron_dev 2013年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.