Saya ingin membatasi pencarian untuk karakter yang digunakan pada angka + bahasa Inggris. Alasannya adalah karena melihat kueri paling lambat pada log mysql saya menemukan sebagian besar berasal dari pencarian dalam karakter Arab, Rusia dan Cina, jadi saya ingin melewatkannya dan menampilkan pesan kesalahan sebagai gantinya.
9
Jawaban:
Solusi ini memfilter string pencarian dengan menerapkan ekspresi reguler yang hanya cocok dengan karakter dari skrip Unicode Umum dan Latin.
Mencocokkan Karakter Latin dengan Ekspresi Reguler
Saya hanya telah pikiranku tumbang di Stack Overflow . Ternyata, ekspresi reguler memiliki mekanisme untuk mencocokkan seluruh kategori Unicode, termasuk nilai untuk menentukan seluruh "skrip" Unicode , masing-masing sesuai dengan kelompok karakter yang digunakan dalam sistem penulisan yang berbeda.
Ini dilakukan dengan menggunakan
\p
meta-karakter diikuti oleh pengenal kategori Unicode dalam kurung kurawal - sehingga[\p{Common}\p{Latin}]
cocok dengan satu karakter dalam skrip Latin atau Umum - ini termasuk tanda baca, angka, dan simbol lain-lain.Seperti yang ditunjukkan oleh @Paul 'Sparrow Hawk' Biron ,
u
bendera pengubah pola harus ditetapkan di akhir ekspresi reguler agar fungsi-fungsi PCRE PHP memperlakukan string subjek sebagaiUTF-8
dikodekan oleh Unicode.Secara keseluruhan, polanya
akan cocok dengan seluruh string yang terdiri dari satu atau lebih karakter dalam skrip Latin dan Common Unicode.
Memfilter String Pencarian
Tempat yang baik untuk mencegat string pencarian yang
pre_get_posts
tindakan seperti kebakaran segera sebelum WordPress mengeksekusi query. Dengan lebih banyak perawatan , ini juga bisa dicapai dengan menggunakan sebuahrequest
saringan .Menanggapi Penelusuran yang Dilarang
Setelah ditentukan bahwa string pencarian berisi karakter non-Latin, Anda dapat menggunakan
WP_Query::set()
untuk mengubah kueri dengan mengubah itu bernama vars permintaan - dengan demikian mempengaruhi permintaan SQL WordPress kemudian menyusun dan mengeksekusi.Variabel kueri yang paling relevan mungkin adalah yang berikut:
s
adalah variabel kueri yang terkait dengan string pencarian. Menyetelnya kenull
atau string kosong (''
) akan mengakibatkan WordPress tidak lagi memperlakukan kueri sebagai pencarian - sering kali ini menghasilkan template arsip yang menampilkan semua posting atau halaman depan situs, tergantung pada nilai yang lain permintaan vars. Menetapkannya ke satu ruang (' '
), akan menghasilkan WordPress mengenalinya sebagai pencarian, dan dengan demikian berusaha untuk menampilkansearch.php
templat.page_id
dapat digunakan untuk mengarahkan pengguna ke halaman tertentu pilihan Anda.post__in
dapat membatasi kueri ke pilihan posting tertentu. Dengan mengaturnya ke array dengan ID posting yang tidak mungkin, itu dapat berfungsi sebagai ukuran untuk memastikan bahwa permintaan tidak menghasilkan apa-apa .Di atas dalam pikiran, Anda dapat melakukan hal berikut untuk menanggapi pencarian yang buruk dengan memuat
search.php
template tanpa hasil:Menampilkan Kesalahan
Cara Anda benar-benar menampilkan pesan kesalahan sangat tergantung pada aplikasi Anda dan kemampuan tema Anda - ada banyak cara yang bisa dilakukan. Jika tema Anda memanggil
get_search_form()
templat pencariannya, solusi termudah mungkin adalah menggunakan hookpre_get_search_form
tindakan untuk menampilkan kesalahan Anda tepat di atas form pencarian:Beberapa kemungkinan lain untuk menampilkan pesan kesalahan meliputi:
wp_enqueue_script
kait dengan yang$priority
lebih besar daripada yang membuat JavaScript itu, dan gunakanwp_localize_script()
untuk mengatur variabel itu untuk memasukkan pesan kesalahan Anda.wp_redirect()
untuk mengirim pengguna ke URL pilihan Anda (metode ini membutuhkan pemuatan halaman tambahan).s
variabel kueri''
sebagai ganti' '
dan gunakanpage_id
sebagai penggantipost__in
untuk mengembalikan halaman yang Anda pilih.loop_start
pengait untuk menyuntikkanWP_Post
objek palsu yang mengandung kesalahan Anda ke dalam hasil kueri - ini jelas merupakan peretasan yang buruk dan mungkin tidak cocok dengan tema khusus Anda, tetapi memiliki efek samping yang berpotensi diinginkan dengan menekan pesan "Tanpa Hasil".template_include
kait filter untuk menukar templat pencarian dengan yang kustom di tema atau plugin Anda yang menampilkan kesalahan Anda.Tanpa memeriksa tema yang dimaksud, sulit untuk menentukan rute mana yang harus Anda ambil.
sumber
Anda akan melakukan ini dengan memasukkan fungsi validasi dalam PHP untuk menguji input terhadap ekspresi reguler seperti
^[a-zA-Z0-9,.!?' ]*
Jadi akan terlihat seperti ini:
The RexEx Aku digunakan untuk semua karakter
A-Z
,a-z
,0-9
, serta,
,.
,!
,?
,'
,"
, dan(ruang).
sumber
EDIT: Solusi ini tidak disarankan
Salah satu cara untuk mencegah pencarian menggunakan huruf non-Latin adalah dengan menggunakan fungsi PHP
mb_detect_encoding()
untuk melihat apakah string pencarian sesuai dengan salah satu pilihan kustom pengkodean karakter. Tempat yang baik untuk melakukan ini adalah denganpre_get_posts
tindakan , seperti kebakaran tepat sebelum query dijalankan.Apa yang sebenarnya Anda lakukan setelah Anda menentukan pencarian menggunakan pengkodean yang tidak valid adalah benar-benar spesifik aplikasi. Di sini saya telah menetapkan permintaan pencarian ke satu ruang untuk memastikan bahwa WordPress masih menginterpretasikan permintaan sebagai pencarian, dan dengan demikian masih memuat
search.php
template (dan tidak mengarahkan pengguna ke halaman depan, seperti yang terjadi ketika string pencarian adalah string kosong). Saya juga mengambil tindakan pencegahan tambahan pengaturan'post__in'
ke array dengan ID posting mustahil untuk memastikan bahwa benar-benar tidak ada yang dikembalikan .Sebagai alternatif, Anda dapat mempertimbangkan mengatur string pencarian
null
dan pengaturanpage_id
untuk mengarahkan pengguna ke halaman dengan pesan kesalahan khusus Anda.Memilih Penyandian
Saya menulis tes cakupan membandingkan beberapa string dummy dalam huruf yang berbeda terhadap semua penyandian default yang didukung oleh PHP . Itu tidak sempurna oleh peregangan apa pun (saya tidak tahu seberapa realistis string dummy saya, dan tampaknya menghambat deteksi Jepang), tetapi agak berguna untuk menentukan kandidat. Anda dapat melihatnya beraksi di sini .
Setelah meneliti potensi penyandian karakter yang ditandai oleh tes itu, sepertinya
Windows-1252
ini adalah pilihan yang sempurna untuk kebutuhan Anda, meliputi alfabet Latin dan aksen untuk bahasa Latin umum.Pilihan
ISO-8859
set karakter harus menjadi pilihan lain yang layak, namun karena alasan saya tidak dapat membungkus kepala saya,mb_
fungsi - fungsi tersebut sepertinya tidak membedakan antaraISO-8859
set karakter yang berbeda, meskipun mendaftarkannya sebagai pengkodean terpisah.Untuk mengizinkan beberapa karakter umum lainnya, Anda juga dapat mempertimbangkan untuk menambahkan
HTML-ENTITIES
.sumber
ISO-8859
pengkodean .Ketika saya mencoba menjelaskan kepada @MichaelRogers ketika dia memposting pertanyaan serupa beberapa hari yang lalu, mengetahui set karakter (atau skrip) yang digunakan dalam string TIDAK cukup untuk mendeteksi bahasa string itu.
Jadi, sementara metode yang dirinci oleh @bosco akan menghapus string Rusia, dll. (Dengan 2 koreksi di bawah), TIDAK akan membatasi pencarian Anda ke bahasa Inggris.
Untuk melihat ini, coba:
[ catatan: 2 koreksi yang disebutkan di atas untuk apa yang disediakan @bosco adalah:
/u
pengubah (diperlukan untuk memperlakukan pola dan subjek sebagai pengkodean UTF-8, lihat PHP: Pengubah Pola Regex ]yang akan menghasilkan:
[ catatan: Saya berbicara bahasa Inggris, Prancis & beberapa Jerman (dan sedikit Lorem ipsum :-), tetapi mengandalkan Google Translate untuk bahasa Arab, Rusia, dan Cina]
Seperti yang Anda lihat, mengandalkan memeriksa skrip latin TIDAK akan memastikan Anda memiliki bahasa Inggris.
Ada sejumlah utas di StackOverflow (misalnya, Deteksi bahasa dari string di PHP ) yang memberikan lebih banyak informasi tentang subjek.
sumber