Mehrfachbeziehung für mehrere tax_query in WP_Query


10

Ich möchte die WP_Query()Klasse verwenden, um einige meiner Beiträge zu filtern. Das Problem, mit dem ich jetzt konfrontiert bin, ist die Behandlung der Taxonomie-Abfrage. Normalerweise ist die WP_Query()einzige Handle eine Beziehung für tax_query()(entweder UND oder ODER), aber was ich brauche, ist die gemischte Verwendung dieser Beziehungen auf der tax_query(), wie kann es 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 dafür einen WP_Query()Filter verwenden? Irgendeine Idee?

Antworten:


10

Dies kann durch Verwendung der term_taxonomy_id anstelle des Slugs erfolgen, wodurch die angegebene Taxonomie effektiv ignoriert wird und nur das eindeutige Feld term_taxonomy_id betrachtet wird. Auf diese Weise können Sie effektiv eine gemischte Beziehung herstellen. Sie möchten eine Gesamtbeziehung von UND verwenden und alle Begriffe, die in Beziehung gesetzt werden sollen, mit dem IN-Operator in ein Element einfügen. Sie müssen die gewünschten Begriffe zuerst 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 3.5 auch angeben müssen 'include_children' => false. Weitere Informationen finden Sie in diesem Trac-Ticket: https://core.trac.wordpress.org/ticket/21228


6
Übrigens, bitte entschuldigen Sie und machen Sie mich auf Fehler / Ungenauigkeiten aufmerksam :) Tippen Sie alles mit einer Hand mit einem Baby in der anderen.
Helenhousandi

1
Woher kommt $slug...?
Vancoder

1
Nur ein Platzhalter im Code. Ich denke, es war $ term1 usw. in der ursprünglichen Frage.
Helenhousandi

Sie haben Recht! Diese Methode scheint zu funktionieren. Ich werde es testen und zurückkommen, um für diese Antwort zu stimmen, wenn es funktioniert. Danke
ron_dev

Es scheint, dass das 'taxonomy' => 'taxonomy4', // gets ignorednicht ignoriert werden kann. Wenn ich zufälligen Text in dieses Feld eingebe, wurde kein Ergebnis gefunden. Nur wenn ich einen echten Taxonomienamen zugewiesen habe, erhalte ich das Ergebnis. Irgendeine Idee warum?
Ron_dev

1

Ich empfehle die Verwendung tax_queryals meta_queryfür mehrere oder / und Operatoren wie diese


Viel besserer Vorschlag. Da es einige Zeit nach der obigen Antwort veröffentlicht wurde.
FooBar
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.