Pencarian Admin WordPress: Memperluas Hasil

Diterbitkan: 2021-01-20

Terkadang menemukan konten di situs web bisa jadi sulit. Sebagai Admin WordPress, semakin mudah menemukan konten yang Anda cari semakin baik. Untungnya, WordPress menyediakan fungsi pencarian di sebagian besar layar Admin yang akan Anda gunakan (misalnya layar Postingan). Sementara fungsi pencarian ini bagus, itu tetap terbatas dalam beberapa cara.

Misalnya, jika Anda mencari posting di layar admin Postingan, fungsi pencarian akan, secara default, mencari teks permintaan pencarian di judul posting, kutipan posting, dan konten posting dan kemudian akan mengembalikan hasil tersebut. Namun, bagaimana jika Anda ingin mencari dengan kata kunci yang terkait dengan bidang khusus? Informasi ini tidak termasuk dalam hasil pencarian tabel daftar posting admin yang dapat membuat frustasi.

Dalam artikel sebelumnya, kami mempelajari cara menambahkan bidang khusus di jenis posting kami. Mari kita lihat bagaimana kita dapat menyertakan bidang khusus dalam hasil pencarian juga.

Perluas Permintaan Pencarian di Pencarian Layar Admin

Dalam contoh kerja kami di bidang khusus, kami membuat bidang khusus yang disebut 'sumber' di salah satu Postingan kami dan memasukkan nilai URL.

Jika Anda masuk ke tabel daftar Postingan dan menggunakan salah satu nilai 'sumber' ini di bilah pencarian, Anda tidak akan mendapatkan hasil apa pun karena WordPress tidak melihat bidang khusus saat mencari secara default.

Untuk mengubahnya, kita perlu memperluas kait asli yang disediakan WordPress untuk fitur pencarian. Kait yang harus kita perluas adalah pre_get_posts yang disertakan dalam wp-includes/class-wp-query.php di sekitar baris 1779 di dalam fungsi get_posts .

Pertanyaan WordPress

Setiap kali Anda mengunjungi halaman, baik di tampilan depan atau area admin, serangkaian skrip kode dijalankan untuk membuat Objek WP_Query yang sesuai dengan permintaan Anda, beserta propertinya.

Mari buat tampilan sementara dari beberapa output properti kueri untuk memahami perubahan apa yang terjadi pada objek WP_Query dalam setiap kasus.

Untuk melihat kueri sebelum dieksekusi, kami akan menambahkan cetakan di kait tindakan pre_get_posts . Filter pre_get_posts diaktifkan setelah objek variabel kueri dibuat, tetapi sebelum kueri aktual dijalankan.

Dalam file functions.php tema aktif Anda, masukkan potongan kode ini:

 add_action( 'pre_get_posts', 'print_query' ); function print_query( ) { print_r ( $GLOBALS['wp_query']->query ); echo "<hr>"; print_r ( $GLOBALS['wp_query']->query_vars ); echo "<hr>"; }

Sekarang, jika Anda mengunjungi layar admin Posts, output query dan query_var s akan dicetak di bagian atas.

Untuk melihat kode dengan lebih mudah, Anda dapat menyalin dan menempelkannya ke percantik PHP online gratis.

$GLOBALS['wp_query']->query (keluar pertama) akan terlihat seperti ini:

 Array ( [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Dalam kasus pencarian di layar admin Postingan misalnya, output array akan berubah termasuk string pencarian. Jika kita mencari 'wordpress.org' misalnya, akan terlihat seperti ini:

 Array ( [m] => 0 [cat] => 0 [s] => wordpress.org [paged] => 1 [order] => [orderby] => [post_type] => post [posts_per_page] => 20 [post_status] => [perm] => )

Merakit Kode

Dengan mengingat informasi di atas, kami akan memasukkan kode yang benar untuk mencapai fungsi pencarian yang kami butuhkan. Untuk melakukan ini, kembali ke functions.php tema aktif Anda dan hapus kode yang Anda masukkan beberapa saat yang lalu di langkah sebelumnya. Kemudian masukkan kode di bawah ini:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Langkah selanjutnya adalah mengubah $post_type dan $custom_fields ke nilai yang sesuai dengan kebutuhan Anda. Mari kita lihat apa yang kita lakukan dalam kode.

  • $post_type = 'post'; – Di sini kita menentukan jenis posting yang ingin kita cari.
  • $custom_fields = array("source",); – Di sini kita menentukan bidang khusus yang ingin kita cari.

Karena kami bekerja dengan kait pre_get_posts , penting untuk memastikan dalam kode kami bahwa kami menerapkan ekstensi pencarian khusus kami saat kami berada di halaman yang benar. Untuk memberitahu WordPress untuk menampilkan kode kami dalam kondisi tertentu, kami menggunakan beberapa tag kondisional.

  • if ( ! is_admin() ) return; kondisi memastikan bahwa jika kita tidak berada di area admin, tidak ada kode kita yang akan dieksekusi.
  • if ( $query->query['post_type'] != $post_type ) memeriksa apakah kita bekerja pada jenis posting yang telah kita definisikan dalam variabel $post_type . Dalam kasus kami, post .
  • $search_term = $query->query_vars['s']; adalah tempat kita menyimpan string pencarian dalam sebuah variabel dan kemudian kita menyetelnya menjadi kosong lagi $query->query_vars['s'] = ''; jika tidak, ia tidak akan menemukan apa pun.

Sekarang, dengan pembaruan ini, jika Anda menyegarkan pencarian terakhir, Anda akan mendapatkan hasil yang benar. Dalam kasus kami, kami melihat pos 'Posting 1' di hasil yang menyertakan entri bidang khusus 'sumber': 'https://dev. wordpress.org /reference/functions/add_post_meta/'.

tingkatkan pencarian admin wordpress

Perluas Permintaan Pencarian di Pencarian Tampilan Depan

Sekarang kami telah 'memperbaiki' pencarian Admin kami, kami dapat melanjutkan untuk meningkatkan fungsi pencarian front-end kami sehingga pengguna situs web kami juga dapat mencari bidang khusus.

Dengan cara yang sama seperti sebelumnya, pencarian Admin tidak akan menghasilkan hasil untuk bidang khusus, pencarian ujung depan juga gagal mengembalikan hasil apa pun untuk bidang khusus.

Idealnya kami ingin pengguna dapat mencari bidang ini. Dalam contoh ini, kami memiliki bidang 'sumber' khusus di salah satu pos kami yang saat ini berisi url 'https://dev.wordpress.org/reference/functions/add_post_meta/'. Jika pengguna mencari 'wordpress.org' maka posting ini akan muncul di hasil. Mari kita cari tahu bagaimana melakukannya.

Kode yang Diperlukan

Buka kembali file functions.php Anda dan salin kode yang Anda tempelkan sebelumnya. Sekarang, rekatkan ini langsung di bawah kode itu (jadi Anda memiliki dua salinan kode ini di functions.php ) Sekarang, ubah nama fungsi di lot kedua kode ini menjadi sesuatu seperti extend_front_search . Seharusnya terlihat seperti ini:

 add_action( 'pre_get_posts', 'extend_admin_search' ); function extend_admin_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( ! is_admin() ) return; if ( $query->query['post_type'] != $post_type ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Selanjutnya, kita perlu menghapus if ( $query->query['post_type'] != $post_type ) return; kondisi.

 add_action( 'pre_get_posts', 'extend_front_search' ); function extend_front_search( $query ) { $post_type = 'post'; $custom_fields = array("source",); if( is_admin() ) return; $search_term = $query->query_vars['s']; $query->query_vars['s'] = ''; if ( $search_term != '' ) { $meta_query = array( 'relation' => 'OR' ); foreach( $custom_fields as $custom_field ) { array_push( $meta_query, array( 'key' => $custom_field, 'value' => $search_term, 'compare' => 'LIKE' )); } $query->set( 'meta_query', $meta_query ); }; }

Kita hanya perlu menjaga kondisi if( is_admin() ) return; untuk memastikan kode hanya akan berlaku di bagian depan dan kami siap melakukannya.

Strategi Alternatif

Cara lain untuk memperluas pencarian WordPress untuk memasukkan bidang khusus adalah dengan mengubah kueri SQL.

Kelas WP_Query membantu Anda dengan itu dengan memecahnya menjadi beberapa bagian seperti yang dijelaskan di sekitar baris 2897 dari wp-includes/class-wp-query.php .

 $clauses = (array) apply_filters_ref_array( 'posts_clauses_request', array( compact( $pieces ), &$this ) ); $where = isset( $clauses['where'] ) ? $clauses['where'] : ''; $groupby = isset( $clauses['groupby'] ) ? $clauses['groupby'] : ''; $join = isset( $clauses['join'] ) ? $clauses['join'] : ''; $orderby = isset( $clauses['orderby'] ) ? $clauses['orderby'] : ''; $distinct = isset( $clauses['distinct'] ) ? $clauses['distinct'] : ''; $fields = isset( $clauses['fields'] ) ? $clauses['fields'] : ''; $limits = isset( $clauses['limits'] ) ? $clauses['limits'] : '';

Seperti yang telah kami sebutkan sebelumnya di artikel bidang khusus, semua data bidang khusus disimpan dalam database di tabel 'postmeta' yang tidak disertakan dalam pencarian WordPress secara default. Jadi langkah pertama kita adalah menggabungkan kedua tabel ini dengan menggunakan kode di bawah ini:

 function join_meta_table( $join ) { global $wpdb; if ( is_search() ) { $join .=' LEFT JOIN '.$wpdb->postmeta. ' ON '. $wpdb->posts . '..post_id '; } return $join; } add_filter('posts_join', 'join_meta_table' );

Kami menggunakan kait posts_join tentu saja karena memfilter klausa JOIN dari kueri.

Selanjutnya, kita akan menggunakan kait posts_where untuk mengubah bagian WHERE dari kueri untuk memenuhi kebutuhan kita.

 function modify_where_clause( $where ) { global $pagenow, $wpdb; if ( is_search() ) { $where = preg_replace( "/\(\s*".$wpdb->posts.".post_title\s+LIKE\s*(\'[^\']+\')\s*\)/", "(".$wpdb->posts.".post_title LIKE $1) OR (".$wpdb->postmeta.".meta_value LIKE $1)", $where ); } return $where; } add_filter( 'posts_where', 'modify_where_clause' );

Last but not least kita perlu mencegah duplikat. Untuk mencapai ini, kami menggunakan kait posts_distinct yang memfilter klausa DISTINCT dari kueri.

 function prevent_duplicates( $where ) { global $wpdb; if ( is_search() ) { return "DISTINCT"; } return $where; } add_filter( 'posts_distinct', 'prevent_duplicates' );

Sekarang mari kita lihat apa yang terjadi di frontend jika kita mencari string “wordpress.org”.

pencarian wordpress di ujung depan

Seperti yang diharapkan, hasilnya benar kali ini. Pencarian WordPress menemukan "posting 1" sebagai hasilnya karena berisi bidang 'sumber' dengan nilai 'https://dev. wordpress.org /reference/functions/add_post_meta/

Jenis Posting Kustom di Hasil Pencarian WordPress

Hal lain yang mungkin ingin Anda lakukan adalah membuat Jenis Posting Kustom dapat dicari (jika Anda tidak yakin cara membuat jenis posting kustom, pastikan Anda membaca artikel kami tentang ini di sini).

Mari kita bayangkan kita telah membuat jenis posting khusus bernama 'buku' dan kita ingin jenis posting ini muncul di hasil pencarian. Kali ini kita tidak perlu membuat ulang kueri SQL, tetapi hanya mendefinisikan ulang jenis posting di hook pre_get_posts seperti yang dijelaskan di bawah ini. Kode harus ditempatkan sekali lagi di file functions.php .

 function tg_include_custom_post_types_in_search_results( $query ) { if ( $query->is_main_query() && $query->is_search() && ! is_admin() ) { $query->set( 'post_type', array( 'post', 'books' ) ); } } add_action( 'pre_get_posts', 'tg_include_custom_post_types_in_search_results' );

Apa yang kami lakukan di sini adalah menambahkan jenis posting yang diinginkan untuk dimasukkan dalam hasil pencarian sebagai argumen ke hook post_type .

Jika Anda ingin mengecualikan suatu tipe, hapus saja dari array.

Kesimpulan

Meningkatkan pencarian di situs WordPress Anda bisa sangat membantu dan menghemat waktu. Untuk pengguna akhir Anda, penting juga bahwa mereka dapat mencari jenis posting khusus dan juga bidang khusus. Semoga instruksi di atas memberi Anda wawasan tentang cara mencapai ini di situs web Anda sendiri.