WP_Query'de birden fazla tax_query için çoklu ilişki


10

WP_Query()Bazı yayınlarımı filtrelemek için sınıfı kullanmak istiyorum . Şimdi karşılaştığım sorun sınıflandırma sorgusu ele alıyor. Normalde, WP_Query()tek bir ilişki tax_query()(VE veya VEYA) için işlemek , ama ihtiyacım olan bu ilişkilerin karma kullanımı tax_query(), nasıl başarabilirim?
Örneğin

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

Yukarıdaki kodun çalışmadığını biliyorum, bunu yapmak için WP_Query()filtre kullanmam gerekir mi? Herhangi bir fikir?

Yanıtlar:


10

Bu, hangi sınıflandırma belirtilirse etkin bir şekilde yoksayılacak ve yalnızca benzersiz term_taksonomy_id alanına bakacak olan bilgi yerine sümük yerine_doksonomy_id kullanılarak yapılabilir. Bu, etkili bir şekilde karışık bir ilişki yapabilmenizi sağlayacaktır. VE'nin genel bir ilişkisini kullanmak ve IN operatörünü kullanarak ilgili VEYA ile ilgili olması gereken tüm terimleri tek bir öğeye koymak istersiniz. İstediğiniz terimleri önce term_taksonomi_id'leriyle eşlemeniz gerekir.

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

3.5 öncesi, belirtmeniz gerektiğini unutmayın 'include_children' => false. Daha fazla bilgi için bu Trac biletine bakın: https://core.trac.wordpress.org/ticket/21228


6
Bu arada, lütfen herhangi bir hata / yanlışlık için beni affedin ve uyarın :) Tüm bunları tek elle bir bebekle diğerine yazarak.
helenhousandi

1
Nereden $sluggeliyor ...?
vancoder

1
Kodda sadece bir yer tutucu. Orijinal soru $ term1 vb sanırım.
helenhousandi

Haklısın! Bu yöntem işe yarıyor gibi görünüyor. Test yapacağım ve eğer çalışıyorsa bu cevaba oy vermek için geri döneceğim. Teşekkürler
ron_dev

'taxonomy' => 'taxonomy4', // gets ignoredGöz ardı edilemez gibi görünüyor . Bu alana rastgele metin koyarsam sonuç bulunamadı. Sadece gerçek taksonomi adı tayin ettiğimde, bana sonuç verir. Neden olduğu hakkında bir fikrin var mı?
19_13

1

Ben kullanarak sugest tax_queryolarak meta_querybenzeri çoklu veya / ve operatörler bu


Çok daha iyi bir öneri. Yukarıdaki cevaptan bir süre sonra serbest bırakıldığı için.
FooBar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.