Hubungan berganda untuk multiple tax_query di WP_Query

10

Saya ingin menggunakan WP_Query()kelas untuk memfilter beberapa posting saya. Masalah yang saya hadapi sekarang adalah menangani permintaan taksonomi. Biasanya, WP_Query()satu - satunya menangani satu hubungan untuk tax_query()(baik DAN atau ATAU), tetapi yang saya butuhkan adalah penggunaan campuran dari hubungan ini pada tax_query(), bagaimana bisa mencapainya?
misalnya

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

Saya tahu kode di atas tidak berfungsi, apakah saya perlu menggunakan WP_Query()filter untuk melakukannya? Ada ide?

ron_dev
sumber

Jawaban:

10

Ini dapat dilakukan dengan menggunakan term_taxonomy_id daripada siput, yang secara efektif akan mengabaikan taksonomi mana pun yang ditentukan dan hanya melihat bidang term_taxonomy_id unik. Ini akan memungkinkan Anda untuk secara efektif dapat melakukan hubungan campuran. Anda ingin menggunakan hubungan keseluruhan dari AND dan meletakkan semua istilah yang harus terkait ATAU dalam satu item menggunakan operator IN. Anda harus memetakan persyaratan yang diinginkan terlebih dahulu ke term_taxonomy_ids mereka.

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

Perhatikan bahwa sebelum 3.5, Anda juga harus menentukan 'include_children' => false. Lihat tiket Trac ini untuk informasi lebih lanjut: https://core.trac.wordpress.org/ticket/21228

helenhousandi
sumber
6
Ngomong-ngomong, tolong permisi dan beri tahu saya jika ada kesalahan / ketidaktepatan :) Mengetik semua ini dengan tangan seorang bayi di tangan yang lain.
helenhousandi
1
Dari mana datangnya $slug...?
vancoder
1
Hanya penampung dalam kode. Saya kira itu $ term1 dll dalam pertanyaan awal.
helenhousandi
Kamu benar! Metode ini sepertinya berhasil. Saya akan memberikan tes itu, dan kembali untuk memberikan suara untuk jawaban ini jika berhasil. Terima kasih
ron_dev
Sepertinya 'taxonomy' => 'taxonomy4', // gets ignoredtidak bisa diabaikan. Jika saya meletakkan teks acak di bidang ini, tidak ada hasil yang ditemukan. Hanya ketika saya menetapkan nama taksonomi yang sebenarnya, itu memberi saya hasilnya. Ada yang tahu kenapa?
ron_dev
1

Saya paling suka menggunakan tax_querysebagai meta_queryuntuk beberapa atau / dan operator seperti ini

Maxime Culea
sumber
Saran yang jauh lebih baik. Seperti yang dirilis beberapa waktu setelah jawaban di atas.
FooBar