Cara memodifikasi filter posts_where hanya untuk permintaan pencarian


8

Saya menggunakan filter posts_where untuk memodifikasi pencarian pengguna di web, tetapi saya mengetahui bahwa beberapa widget default seperti "posting terbaru" menggunakan filter ini juga dan perilaku mereka juga dimodifikasi. Saya mencoba menemukan cara untuk menghindari hal lain selain pencarian pengguna yang menggunakan filter posts_where.

Ini kode saya:

add_filter( 'posts_where' , 'posts_where_statement' );

function posts_where_statement( $where ) {
   global $wp_query;
   global $expp;
   global $wpdb;
   $local_db = $wpdb->prefix."posts";
   $front_page_id = get_option('page_on_front');

   if ( ('page' != get_option('show_on_front') || $front_page_id != $wp_query->query_vars['page_id']) && (!($wp_query->is_search)) )
       return $where;

   //some $where modifications

   remove_all_actions ( '__after_loop');
   return $where;
}

Apakah ada fungsi lain atau cara untuk membuat kait / filter ini hanya berfungsi dengan permintaan pencarian? (salah satu yang mengambil hasil dari input pengguna)

Jawaban:


17

Masalah:

Masalah dengan cuplikan Anda saat ini adalah Anda hanya memeriksa objek kueri utama global, apa pun objek kueri saat ini.

Penanganan masalah:

Perhatikan bahwa argumen input kedua untuk posts_wherecallback filter, adalah objek permintaan saat ini.

Gunakan itu untuk menentukan apakah itu permintaan pencarian utama di front-end dengan:

add_filter( 'posts_where', function ( $where, \WP_Query $q ) 
{
    if( ! is_admin() && $q->is_main_query() && $q->is_search()) // No global $wp_query here
    {
        // ... your modifications
    }

    return $where;      

}, 10, 2 ); // Note the priority 10 and number of input arguments is 2

Ada juga posts_searchfilter untuk bagian pencarian WHERE, jika itu yang perlu Anda modifikasi.

Tetapi secara umum saya akan mengatakan hanya memodifikasi SQL yang dihasilkan dengan tangan jika, Anda benar-benar harus dan tidak memiliki alternatif lain.


+1 untuk isyarat tipe. Bukan penggemar $qsekalipun.
Michael Ecklund

1
terima kasih, alangkah baiknya memiliki antarmuka. ya itu poin yang valid mengenai nama variabel. Saya harus mengakui bahwa bilah kode gulir di situs ini, memengaruhi cara saya menulis jawaban - Saya mencoba menghindarinya ;-) Beberapa menggunakan $wp_querytetapi itu dapat dikacaukan dengan penggunaan global $wp_query, lainnya $qryatau $query, tetapi itu mungkin juga membingungkan ketika kita berurusan dengan query SQL ;-) Saya setuju dengan $qpotongan pendek ini dan juga terlihat lebih sederhana daripada misalnya. $wp_query_objBiasanya saya mengambil beberapa if-contidtions ke dalam baris terpisah
@MichaelEcklund

apa maksudnya \ WP_Query $ q? Maksud saya mengapa slash?
brett

@ brett Jika kita menggunakan namespace di plugin kita, maka kita memerlukan ini untuk kelas WordPress, karena WordPress menggunakan ruang global.
birgire
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.