Wiele relacji dla wielu pytań o podatek w WP_Query

10

Chcę użyć tej WP_Query()klasy do filtrowania niektórych moich postów. Problem, z którym się teraz spotykam, polega na obsłudze zapytania o systematykę. Zwykle WP_Query()jedyną obsługiwaną jedną relacją dla tax_query()(AND lub OR), ale potrzebuję mieszanego wykorzystania tych relacji na tax_query(), w jaki sposób można to osiągnąć?
na przykład

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

Wiem, że powyższy kod nie działa, czy muszę do tego użyć WP_Query()filtra? Dowolny pomysł?

ron_dev
źródło

Odpowiedzi:

10

Można tego dokonać za pomocą term_taxonomy_id zamiast informacji o ślimaku, co skutecznie zignoruje dowolną określoną taksonomię i wystarczy spojrzeć na unikalne pole term_taxonomy_id. Pozwoli ci to skutecznie tworzyć mieszany związek. Chciałbyś użyć ogólnej relacji AND i umieścić wszystkie terminy, które powinny być powiązane LUB w jednym elemencie za pomocą operatora IN. Najpierw musisz zmapować pożądane warunki do ich 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',
    ),
);

Pamiętaj, że w wersjach wcześniejszych niż 3.5 musisz także określić 'include_children' => false. Zobacz ten bilet Trac, aby uzyskać więcej: https://core.trac.wordpress.org/ticket/21228

helenhousandi
źródło
6
Przy okazji, proszę wybacz mi i powiadamiaj mnie o wszelkich błędach / nieścisłościach :) Wpisując to wszystko jedną ręką z dzieckiem w drugiej.
helenhousandi
1
Skąd $slugpochodzi ...?
vancoder 18.04.13
1
Tylko symbol zastępczy w kodzie. Myślę, że to było $ term1 itd. W pierwotnym pytaniu.
helenhousandi
Masz rację! Ta metoda wydaje się działać. Dam test i wrócę, aby zagłosować na tę odpowiedź, jeśli zadziała. Dzięki
ron_dev,
Wydaje się, że 'taxonomy' => 'taxonomy4', // gets ignorednie można tego zignorować. Jeśli wstawię losowy tekst w tym polu, nie znaleziono żadnego wyniku. Dopiero kiedy przypisałem prawdziwą nazwę taksonomii, daje mi to wynik. Masz pomysł, dlaczego?
ron_dev
1

Sugeruję użycie tax_queryjako meta_querydla wielu lub operatorów takich jak ten

Maxime Culea
źródło
Znacznie lepsza sugestia. Jak zostało wydane jakiś czas po powyższej odpowiedzi.
FooBar