Relație multiplă pentru tax_query multiple în WP_Query

18 apr. 2013, 19:44:01
Vizualizări: 46K
Voturi: 14

Vreau să folosesc clasa WP_Query() pentru a filtra unele dintre postările mele. Problema cu care mă confrunt acum este gestionarea interogării taxonomiei. În mod normal, WP_Query() gestionează doar o singură relație pentru tax_query() (fie AND sau OR), dar ceea ce am nevoie este utilizarea mixtă a acestor relații în tax_query(), cum pot realiza acest lucru?
exemplu

'tax_query' => array(
        'relation' => 'AND',
        array(
            'taxonomy' => 'taxonomy1',
            'field' => 'slug',
            'terms' => array( $term )
        ),
        array(
            'taxonomy' => 'taxonomy3',
            'field' => 'slug',
            'terms' => array( $term3 ),
            'operator' => 'IN',
        )
       // mai jos vreau să folosesc relația OR
       'relation' => 'OR',
      array(
            'taxonomy' => 'taxonomy4',
            'field' => 'slug',
            'terms' => array( $term4 )
        ),
        array(
            'taxonomy' => 'taxonomy2',
            'field' => 'slug',
            'terms' => array( $term2 ),
            'operator' => 'IN',
        )
    )  

Știu că codul de mai sus nu funcționează, trebuie să folosesc filtrul WP_Query() pentru a face asta? Aveți vreo idee?

0
Toate răspunsurile la întrebare 2
10
17

Aceasta poate fi realizată prin utilizarea term_taxonomy_id în loc de slug, ceea ce va ignora efectiv orice taxonomie este specificată și se va uita doar la câmpul unic term_taxonomy_id. Acest lucru vă va permite să efectuați efectiv o relație mixtă. Ați dori să utilizați o relație generală de AND și să puneți toți termenii care ar trebui să fie relaționați OR într-un singur element folosind operatorul IN. Va trebui să mapați mai întâi termenii doriti la term_taxonomy_id-urile lor.

$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', // este ignorat
        'field' => 'term_taxonomy_id',
        'terms' => array( $tax_map['taxonomy4'][$slug], $tax_map['taxonomy2'][$slug] ),
        'operator' => 'IN',
    ),
);

Rețineți că pentru versiunile anterioare 3.5, va trebui să specificați și 'include_children' => false. Pentru mai multe detalii, consultați acest ticket Trac: https://core.trac.wordpress.org/ticket/21228

19 apr. 2013 02:16:32
Comentarii

Apropo, vă rog să mă scuzați și să mă anunțați dacă observați greșeli/inexactități :) Scriu toate astea cu o singură mână, ținând un bebeluș în cealaltă.

helenhousandi helenhousandi
19 apr. 2013 02:19:09

De unde vine $slug...?

vancoder vancoder
19 apr. 2013 02:45:25

Doar un placeholder în cod. Presupun că în întrebarea originală era $term1 etc.

helenhousandi helenhousandi
19 apr. 2013 02:47:20

Ai dreptate! Această metodă pare să funcționeze. O voi testa și voi reveni să votez acest răspuns dacă funcționează. Mulțumesc

ron_dev ron_dev
19 apr. 2013 06:22:11

Se pare că 'taxonomy' => 'taxonomy4', // este ignorat nu poate fi ignorat. Dacă pun text aleatoriu în acest câmp, nu s-a găsit niciun rezultat. Doar când am atribuit un nume real de taxonomie, mi-a dat rezultatul. Ai vreo idee de ce?

ron_dev ron_dev
19 apr. 2013 12:39:50

Probabil verifică dacă taxa există undeva de-a lungul procesului.

helenhousandi helenhousandi
19 apr. 2013 17:39:55

Dar din ce am văzut în https://core.trac.wordpress.org/ticket/21228 și https://core.trac.wordpress.org/changeset/21552, nu ar trebui să verifice taxonomia când există 'term_taxonomy_id', corect?

ron_dev ron_dev
20 apr. 2013 10:49:34

După ce am încercat de multe ori, încă nu funcționează, cred că această metodă nu merge... după ce am verificat clasa WP_TAX_QUERY la https://core.trac.wordpress.org/browser/trunk/wp-includes/taxonomy.php?rev=21552, am descoperit că este încă necesar să verifici numele taxonomiei înainte de a putea folosi term_taxonomy_id în acest scop (corectați-mă dacă greșesc), așadar numele taxonomiei trebuie să existe în array-ul tax_query. Prin urmare, această metodă nu poate rezolva problema. Aveți alte sugestii pentru a rezolva această problemă?

ron_dev ron_dev
23 apr. 2013 07:43:41

Bine, în sfârșit am scris asta (și am publicat): http://10up.com/blog/wordpress-mixed-relationship-taxonomy-queries/ - practic, da, trebuie să folosești un nume de taxonomie valid, dar restul rămâne valabil.

helenhousandi helenhousandi
17 dec. 2013 01:02:17

Doamne, e ridicol că ceva de genul ăsta nu se găsește în documentația WP. Mulțumesc pentru articol, dacă aceeași interogare nu funcționează pentru alte câmpuri așa cum funcționează pentru term_taxonomy_id, atunci de ce naiba mai acceptă și celelalte.

jmcgrory jmcgrory
5 mar. 2022 23:28:55
Arată celelalte 5 comentarii
2

Recomand să folosești tax_query în loc de meta_query pentru operatori multipli or/and precum aici

5 nov. 2015 13:00:22
Comentarii

Sugestie mult mai bună. Deoarece a fost lansată ceva timp după răspunsul de mai sus.

FooBar FooBar
12 feb. 2020 13:04:22

meta_query permite filtrarea după taxonomie? Nu văd unde să specific tipul de taxonomie

LTroya LTroya
9 aug. 2022 05:56:56