Bu çözüm, yalnızca Common ve Latin Unicode komut dosyalarındaki karakterlerle eşleşen normal bir ifade uygulayarak arama dizelerini filtreler.
Latin Karakterlerini Normal İfadelerle Eşleştirme
Sadece aklım yığın taşması de üzerinde şişirilmiş vardı . Görüldüğü gibi, normal ifadeler , her biri farklı yazma sistemlerinde kullanılan karakter gruplarına karşılık gelen tüm Unicode "komut dosyalarını" belirten değerler de dahil olmak üzere tüm Unicode kategorilerini eşleştirmek için bir mekanizmaya sahiptir .
Bu, \p
meta karakter ve ardından kıvırcık ayraçlarda bir Unicode kategori tanımlayıcısı kullanılarak yapılır - bu nedenle Latin veya Ortak komut dosyalarındaki[\p{Common}\p{Latin}]
tek bir karakterle eşleşir - buna noktalama işaretleri, sayılar ve çeşitli simgeler dahildir.
As @ Paul 'Sparrow Hawk' Biron işaret , u
desen değiştirici bayrak olarak konu dizesini tedavisinde PHP'nin PCRE işlevleri için sırayla normal ifadenin sonunda ayarlanmalıdır UTF-8
Unicode kodlanmış.
Hep birlikte o zaman, desen
/^[\p{Latin}\p{Common}]+$/u
Latin ve Ortak Unicode komut dosyalarında bir veya daha fazla karakterden oluşan bir dizenin tamamı ile eşleşir.
Arama Dizesini Filtreleme
Bir arama dizesini yakalamak için iyi bir yer, WordPress sorguyu yürütmeden hemen önce gerçekleşen pre_get_posts
eylemdir . Daha fazla dikkatle , bu bir request
filtre kullanılarak da gerçekleştirilebilir .
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' );
İzin Verilmeyen Aramalara Yanıt Verme
Bir arama dizesinin Latin olmayan karakterler içerdiği belirlendikten sonra WP_Query::set()
, sorguyu değiştirmek için adlandırılmış sorgu değişkenlerini değiştirerek kullanabilirsiniz - böylece WordPress'in daha sonra oluşturduğu ve yürüttüğü SQL sorgusunu etkiler.
En alakalı sorgu değişkenleri muhtemelen aşağıdaki gibidir:
s
bir arama dizesine karşılık gelen sorgu değişkenidir. Bunu null
veya boş bir dizeyi ( ''
) ayarlamak , WordPress'in sorguyu artık bir arama olarak ele almamasına neden olur - çoğu zaman bu, diğerlerinin değerlerine bağlı olarak tüm yayınları veya sitenin ön sayfasını görüntüleyen bir arşiv şablonuyla sonuçlanır. sorgu değişkenleri. ' '
Ancak, onu tek bir boşluğa ( ) ayarlamak, WordPress'in bir arama olarak tanınmasına ve böylece search.php
şablonu görüntülemeye çalışmasına neden olur .
page_id
kullanıcıyı seçtiğiniz belirli bir sayfaya yönlendirmek için kullanılabilir.
post__in
sorguyu belirli bir yayın seçimiyle kısıtlayabilir. İmkansız bir yazı kimliği olan bir diziye ayarlandığında , sorgunun kesinlikle hiçbir şey döndürmediğinden emin olmak için bir ölçü işlevi görebilir .
Yukarıdakileri göz önünde bulundurarak, search.php
şablonu sonuçsuz olarak yükleyerek kötü bir aramaya yanıt vermek için aşağıdakileri yapabilirsiniz :
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' );
Hata Görüntüleme
Hata mesajını gerçekte görüntüleme şekliniz, uygulamanıza ve temanızın yeteneklerine bağlıdır - bunun yapılabileceği birçok yol vardır. Temanız get_search_form()
arama şablonunu çağırıyorsa , en kolay çözüm muhtemelen hatanızı arama formunun hemen üstünde çıkarmak için bir pre_get_search_form
işlem kancası kullanmaktır :
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>';
}
Hata mesajı görüntülemek için diğer bazı olasılıklar:
- Siteniz "flash" veya "modal" iletileri görüntüleyebilecek JavaScript kullanıyorsa (veya kendi başınıza bu yetenekleri ekliyorsanız), belirli bir değişken ayarlandığında sayfa yükleme sırasında iletileri görüntülemek için mantığı ekleyin, ardından bir
wp_enqueue_script
kanca ekleyin bir ile $priority
büyük daha hangi enqueues JavaScript ve kullanımı o wp_localize_script()
senin hata mesajını da bu değişkeni ayarlamak için.
wp_redirect()
Kullanıcıyı istediğiniz URL'ye göndermek için kullanın (bu yöntem ek sayfa yüklemesi gerektirir).
- Bir PHP değişkeni ayarlayın veya temanızı / eklentinizi hata hakkında uygun bir yerde görüntüleyebilecek şekilde bilgilendirecek bir yöntem çağırın.
- Set
s
sorgu değişkeni ''
yerine ' '
ve kullanım page_id
yerine post__in
sizin seçtiğiniz bir sayfa dönebilmek için.
- Sorgunuzun sonuçlarına hatanızı içeren sahte bir nesneyi enjekte etmek için bir
loop_start
kanca kullanın WP_Post
- bu kesinlikle çirkin bir hack'tir ve özel temanızla doğru görünmeyebilir, ancak "Sonuç Yok" iletisini bastırmanın potansiyel olarak istenen yan etkisi vardır.
template_include
Arama şablonunu temanızdaki veya eklentinizdeki özel bir şablonla değiştirerek hatanızı gösteren bir filtre kancası kullanın .
Söz konusu temayı incelemeden hangi rotayı izlemeniz gerektiğini belirlemek zordur.