Apakah ada cara untuk menggunakan $ query-> set ('tax_query' di filter pre_get_posts?

16

Theres cara untuk digunakan $query->set('tax_query', ...)di pre_get_postsfilter? misalnya kode selanjutnya tidak mengubah kueri. Perhatikan bahwa saya sedang membangun $ taksonomi dari dan pencarian kustom.

function custom_search_filter($query) {
        ...

        // array('taxonomy' => 'category', 'field' => 'id', 'terms' => array( 41,42 ), 'operator' => 'IN')
        $taxonomies = implode(',', $taxonomy_arr);

        // /wordpress/25076/how-to-filter-wordpress-search-excluding-post-in-some-custom-taxonomies

        $taxonomy_query = array('relation' => 'AND', $taxonomies);

        $query->set('tax_query', $taxonomy_query);
    }

    return $query; 
}


add_filter( 'pre_get_posts', 'custom_search_filter', 999 );

Terima kasih sebelumnya.

José Pablo Orozco Marín
sumber
1
Mengapa Anda melewatkan WP_Queryobjek ke metode pengaturan argumen?
t31os
Ya saya salah, sekarang saya mendapatkannya menggunakan eval untuk mengubah string menjadi array (dan saya benar-benar yakin bahwa string aman). Terima kasih.
José Pablo Orozco Marín

Jawaban:

35

The $queryvariabel dalam filter merupakan WP_Queryobjek, sehingga Anda tidak harus melewati baruWP_Query objek ke metode untuk menetapkan sifat yang objek.

The Pertanyaan Anda menyalin kode dari itu benar menggunakan filter, yang saya rasakan adalah inti dari masalah Anda.

Ya, tax_querydapat digunakan di dalam filter / aksi pre_get_posts(atau yang serupa parse_request).

Berikut ini contohnya:
Tentukan taksonomi khusus untuk permintaan pencarian

function search_filter_get_posts($query) {
    if ( !$query->is_search )
        return $query;

    $taxquery = array(
        array(
            'taxonomy' => 'career_event_type',
            'field' => 'id',
            'terms' => array( 52 ),
            'operator'=> 'NOT IN'
        )
    );

    $query->set( 'tax_query', $taxquery );

}
add_action( 'pre_get_posts', 'search_filter_get_posts' );
t31os
sumber
6
dapatkah Anda memberikan contoh kerja pengaturan tax_query di dalam tindakan pre_get_posts?
Helgatheviking
$ tax_query adalah objek yang berisi array bersarang. Anda tidak bisa menimpa objek dengan array bersarang.
AlxVallejo
3
$tax_querybukan objek, $querymeskipun (ini merupakan contoh WP_Query).
t31os
2
bukankah ini sepenuhnya mengabaikan tax_query? tidakkah $ taxquery ditambahkan ke data saat ini di arg tax_query?
hot_barbara
@hot_barbara seperti berdiri, itu akan menimpa tax_query. Sebaliknya, versi ini akan menambahkan kueri saat ini: $ taxquery = array ('relation' => 'OR', array ('taxonomy' => 'career_event_type', 'field' => 'id', 'terms' => array ( 52), 'operator' => 'NOT IN'));
rambillo