Múltipla relação para vários tax_query em WP_Query

10

Quero usar a WP_Query()classe para filtrar algumas das minhas postagens. O problema que estou enfrentando agora é lidar com a consulta de taxonomia. Normalmente, o WP_Query()único identificador de um relacionamento para tax_query()(AND ou OR), mas o que eu preciso é o uso misto desses relacionamentos no tax_query(), como pode alcançá-lo?
por exemplo

'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',
        )
    )  

Sei que o código acima não está funcionando, preciso usar o WP_Query()filtro para fazer isso? Qualquer ideia?

ron_dev
fonte

Respostas:

10

Isso pode ser feito usando o term_taxonomy_id em vez da lesma, que ignorará efetivamente a taxonomia especificada e apenas observe o campo term_taxonomy_id exclusivo. Isso permitirá que você efetivamente possa fazer um relacionamento misto. Você deseja usar uma relação geral de AND e colocar todos os termos que devem estar relacionados OU em um item usando o operador IN. Você precisará mapear os termos desejados para os termos_taxonomia_ids primeiro.

$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',
    ),
);

Observe que antes da versão 3.5, você também precisa especificar 'include_children' => false. Veja este ticket do Trac para obter mais informações: https://core.trac.wordpress.org/ticket/21228

helenhousandi
fonte
6
A propósito, desculpe e me avise sobre quaisquer erros / imprecisões :) Digitando tudo isso com uma mão com um bebê na outra.
precisa saber é o seguinte
11
De onde $slugvem ...?
usar o seguinte código
11
Apenas um espaço reservado no código. Eu acho que foi $ term1 etc. na pergunta original.
helenhousandi
Você está certo! Este método parece funcionar. Vou testá-lo e voltarei a votar nesta resposta, se estiver funcionando. Graças
ron_dev
Parece 'taxonomy' => 'taxonomy4', // gets ignoredque não pode ser ignorado. Se eu colocar texto aleatório nesse campo, nenhum resultado foi encontrado. Somente quando designei o nome da taxonomia real, ele me deu o resultado. Alguma idéia do porquê?
ron_dev
1

Eu sugiro usar tax_querycomo meta_querypara múltiplos ou operadores como este

Maxime Culea
fonte
Sugestão muito melhor. Como foi lançado algum tempo depois da resposta acima.
FooBar