web-dev-qa-db-ger.com

Mehrfachbeziehung für mehrere tax_query in WP_Query

Ich möchte die Klasse WP_Query() verwenden, um einige meiner Beiträge zu filtern. Das Problem, vor dem ich jetzt stehe, ist die Bearbeitung der Taxonomie-Abfrage. Normalerweise behandelt die WP_Query() nur eine Beziehung für tax_query() (entweder AND oder OR), aber ich benötige eine gemischte Verwendung dieser Beziehungen für die tax_query(), wie kann dies erreicht werden?
z.B

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

Ich weiß, dass der obige Code nicht funktioniert. Muss ich dazu den Filter WP_Query() verwenden? Irgendeine Idee?

9
ron_dev

Dies kann durch die Verwendung von term_taxonomy_id anstelle des Slugs erreicht werden. Dabei wird die angegebene Taxonomie ignoriert und nur das eindeutige term_taxonomy_id-Feld betrachtet. Auf diese Weise können Sie effektiv eine gemischte Beziehung eingehen. Sie möchten eine Gesamtbeziehung von AND verwenden und alle Begriffe, die in Beziehung stehen sollen, OR mit dem Operator IN in ein Element einfügen. Sie müssen zuerst die gewünschten Begriffe ihren term_taxonomy_ids zuordnen.

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

Beachten Sie, dass Sie vor Version 3.5 auch 'include_children' => false angeben müssen. Weitere Informationen finden Sie in diesem Trac-Ticket: https://core.trac.wordpress.org/ticket/21228

7
helenhousandi

Ich schlage vor, tax_query als meta_query für mehrere oder/und Operatoren wie this zu verwenden.

0
Maxime Culea