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 sebagai UTF-8
dikodekan oleh Unicode.
Secara keseluruhan, polanya
/^[\p{Latin}\p{Common}]+$/u
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 sebuah request
saringan .
function wpse261038_validate_search_characters( $query ) {
// Leave admin, non-main query, and non-search queries alone
if( is_admin() || !$query->is_main_query() || !$query->is_seach() )
return;
// Check if the search string contains only Latin/Common Unicode characters
$match_result = preg_match( '/^[\p{Latin}\p{Common}]+$/u', $query->get( 's' ) );
// If the search string only contains Latin/Common characters, let it continue
if( 1 === $match_result )
return;
// If execution reaches this point, the search string contains non-Latin characters
//TODO: Handle non-Latin search strings
//TODO: Set up logic to display error message
}
add_action( 'pre_get_posts', 'wpse261038_validate_search_characters' );
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 ke null
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 menampilkan search.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:
function wpse261038_validate_search_characters( $query ) {
// Leave admin, non-main query, and non-search queries alone
if( is_admin() || !$query->is_main_query() || !$query->is_seach() )
return;
// Check if the search string contains only Latin/Common Unicode characters
$match_result = preg_match( '/^[\p{Latin}\p{Common}]+$/u', $query->get( 's' ) );
// If the search string only contains Latin/Common characters, let it continue
if( 1 === $match_result )
return;
$query->set( 's', ' ' ); // Replace the non-latin search with an empty one
$query->set( 'post__in', array(0) ); // Make sure no post is ever returned
//TODO: Set up logic to display error message
}
add_action( 'pre_get_posts', 'wpse261038_validate_search_characters' );
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 hook pre_get_search_form
tindakan untuk menampilkan kesalahan Anda tepat di atas form pencarian:
function wpse261038_validate_search_characters( $query ) {
// Leave admin, non-main query, and non-search queries alone
if( is_admin() || !$query->is_main_query() || !$query->is_seach() )
return;
// Check if the search string contains only Latin/Common Unicode characters
$match_result = preg_match( '/^[\p{Latin}\p{Common}]+$/u', $query->get( 's' ) );
// If the search string only contains Latin/Common characters, let it continue
if( 1 === $match_result )
return;
$query->set( 's', ' ' ); // Replace the non-latin search with an empty one
$query->set( 'post__in', array(0) ); // Make sure no post is ever returned
add_action( 'pre_get_search_form', 'wpse261038_display_search_error' );
}
add_action( 'pre_get_posts', 'wpse261038_validate_search_characters' );
function wpse261038_display_search_error() {
echo '<div class="notice notice-error"><p>Your search could not be completed as it contains characters from non-Latin alphabets.<p></div>';
}
Beberapa kemungkinan lain untuk menampilkan pesan kesalahan meliputi:
- Jika situs Anda menggunakan JavaScript yang dapat menampilkan pesan "flash" atau "modal" (atau Anda menambahkan kemampuan seperti itu sendiri), tambahkan padanya logika untuk menampilkan pesan pada pemuatan halaman ketika variabel tertentu diatur, lalu tambahkan
wp_enqueue_script
kait dengan yang $priority
lebih besar daripada yang membuat JavaScript itu, dan gunakan wp_localize_script()
untuk mengatur variabel itu untuk memasukkan pesan kesalahan Anda.
- Gunakan
wp_redirect()
untuk mengirim pengguna ke URL pilihan Anda (metode ini membutuhkan pemuatan halaman tambahan).
- Tetapkan variabel PHP atau aktifkan metode yang akan menginformasikan tema / plugin Anda tentang kesalahan sehingga dapat menampilkannya jika perlu.
- Tetapkan
s
variabel kueri ''
sebagai ganti ' '
dan gunakan page_id
sebagai pengganti post__in
untuk mengembalikan halaman yang Anda pilih.
- Gunakan
loop_start
pengait untuk menyuntikkan WP_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".
- Gunakan
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.