यह समाधान एक नियमित अभिव्यक्ति को लागू करके स्ट्रिंग्स को खोजता है जो केवल कॉमन और लैटिन यूनिकोड लिपियों के पात्रों से मेल खाता है।
नियमित अभिव्यक्तियों के साथ लैटिन वर्णों का मिलान
मैंने अभी-अभी अपना दिमाग स्टैक ओवरफ्लो पर उड़ाया था । जैसा कि यह पता चला है, नियमित अभिव्यक्तियों में पूरे यूनिकोड श्रेणियों से मेल खाने के लिए एक तंत्र है, जिसमें पूरे यूनिकोड "स्क्रिप्ट" को निर्दिष्ट करने के लिए मान शामिल हैं , प्रत्येक अलग-अलग लेखन प्रणालियों में उपयोग किए जाने वाले वर्णों के समूहों के अनुरूप है।
यह \p
घुंघराले ब्रेसिज़ में यूनिकोड श्रेणी के पहचानकर्ता द्वारा अनुसरण किए गए मेटा-चरित्र का उपयोग करके किया जाता है - इसलिए लैटिन या सामान्य लिपियों[\p{Common}\p{Latin}]
में किसी एक वर्ण से मेल खाता है - इसमें विराम चिह्न, अंक और विविध चिह्न शामिल हैं।
जैसा कि @Paul 'स्पैरो हॉक' बीरन बताते हैं , विषय के स्ट्रिंग को यूनिकोड के रूप में ट्रीट करने के लिए पीएचपी के पीसीआर फंक्शन के लिए रेग्युलर एक्सप्रेशन के अंत में u
पैटर्न मॉडिफायर फ्लैग सेट किया जाना चाहिए UTF-8
।
सभी एक साथ, पैटर्न
/^[\p{Latin}\p{Common}]+$/u
लैटिन और कॉमन यूनिकोड लिपियों में एक या अधिक वर्णों से बना एक संपूर्ण स्ट्रिंग से मेल खाएगा।
खोज स्ट्रिंग को फ़िल्टर करना
एक अच्छी जगह एक खोज स्ट्रिंग रोकना है कार्रवाई इसे तुरंत आग के रूप में पहले वर्डप्रेस क्वेरी निष्पादित करता है। अधिक देखभाल के साथ , यह एक फिल्टर का उपयोग करके भी पूरा किया जा सकता है ।pre_get_posts
request
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' );
अस्वीकृत खोजों पर प्रतिक्रिया
एक बार जब यह निर्धारित हो जाता है कि खोज स्ट्रिंग में गैर-लैटिन वर्ण हैं, तो आप WP_Query::set()
क्वेरी को संशोधित करने के लिए इसका उपयोग कर सकते हैं इसे क्वेरी संस्करण नाम दिया गया है - इस प्रकार SQL क्वेरी को प्रभावित करना वर्डप्रेस बाद में रचना और निष्पादित करता है।
सबसे प्रासंगिक क्वेरी चर संभवतः निम्नलिखित हैं:
s
खोज स्ट्रिंग के अनुरूप क्वेरी चर है। इसे null
एक रिक्त स्ट्रिंग ( ''
) पर सेट करने से परिणाम होगा कि वर्डप्रेस अब क्वेरी को एक खोज के रूप में नहीं मान रहा है - कई बार इसका परिणाम संग्रह के टेम्पलेट में होता है जो सभी पोस्ट या साइट के फ्रंट-पेज को प्रदर्शित करता है, जो दूसरे के मूल्यों पर निर्भर करता है। क्वेरी vars। ' '
हालाँकि, इसे एक ही स्थान पर सेट करना ( ), इसके परिणामस्वरूप वर्डप्रेस इसे एक खोज के रूप में पहचानता है, और इस प्रकार search.php
टेम्पलेट को प्रदर्शित करने का प्रयास करता है।
page_id
उपयोगकर्ता को आपकी पसंद के एक विशिष्ट पृष्ठ पर निर्देशित करने के लिए इस्तेमाल किया जा सकता है।
post__in
क्वेरी को पदों के एक विशिष्ट चयन के लिए प्रतिबंधित कर सकता है। एक असंभव पोस्ट आईडी के साथ इसे एक सरणी में सेट करके, यह सुनिश्चित करने के लिए एक उपाय के रूप में सेवा कर सकता है कि क्वेरी बिल्कुल कुछ भी नहीं लौटाती है ।
मन में ऊपर, आप search.php
कोई परिणाम नहीं के साथ टेम्पलेट लोड करके एक बुरी खोज का जवाब देने के लिए निम्नलिखित कर सकते हैं :
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' );
त्रुटि प्रदर्शित करना
जिस तरह से आप वास्तव में त्रुटि संदेश प्रदर्शित करते हैं वह आपके आवेदन और आपके विषय की क्षमताओं पर अत्यधिक निर्भर है - ऐसे कई तरीके हैं जो यह किया जा सकता है। यदि आपकी थीम get_search_form()
इसमें खोज टेम्प्लेट कहती है, तो सबसे आसान उपाय यह है कि खोज प्रपत्र के तुरंत बाद अपनी त्रुटि को उत्पन्न करने के लिए एक pre_get_search_form
एक्शन हुक का उपयोग किया जाए:
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>';
}
त्रुटि संदेश प्रदर्शित करने के लिए कुछ अन्य संभावनाओं में शामिल हैं:
- यदि आपकी साइट जावास्क्रिप्ट का उपयोग करती है जो "फ्लैश" या "मोडल" संदेश प्रदर्शित कर सकती है (या आप अपने आप में इस तरह की क्षमता जोड़ते हैं), तो पृष्ठ-लोड पर संदेश प्रदर्शित करने के लिए तर्क जोड़ें जब एक विशिष्ट चर सेट किया जाता है, तो एक
wp_enqueue_script
हुक जोड़ें इससे $priority
भी बड़ा जो कि जावास्क्रिप्ट को संकलित करता है, और wp_localize_script()
आपके त्रुटि संदेश को शामिल करने के लिए उस चर को सेट करने के लिए उपयोग करता है।
wp_redirect()
उपयोगकर्ता को अपनी पसंद के URL पर भेजने के लिए उपयोग करें (इस पद्धति के लिए अतिरिक्त पृष्ठ लोड की आवश्यकता है)।
- एक PHP चर सेट करें या एक विधि लागू करें जो आपके विषय / प्लगइन को त्रुटि के बारे में सूचित करेगा, ताकि वह इसे प्रदर्शित कर सके जहां उपयुक्त हो।
- सेट
s
करने के लिए क्वेरी चर ''
के बजाय ' '
और उपयोग page_id
के स्थान पर post__in
आदेश अपने द्वारा चयनित किसी पेज पर लौटने के लिए में।
- क्वेरी परिणामों में अपनी त्रुटि वाले नकली ऑब्जेक्ट को इंजेक्ट करने के लिए
loop_start
हुक का उपयोग करें WP_Post
- यह निश्चित रूप से एक बदसूरत हैक है और आपके विशेष विषय के साथ सही नहीं लग सकता है, लेकिन इसका "वांछनीय परिणाम" संदेश को दबाने का संभावित वांछनीय दुष्प्रभाव है।
template_include
अपने थीम या प्लगइन में कस्टम टेम्पलेट के साथ खोज टेम्पलेट को स्वैप करने के लिए एक फिल्टर हुक का उपयोग करें जो आपकी त्रुटि प्रदर्शित करता है।
प्रश्न में विषय की जांच के बिना, यह निर्धारित करना मुश्किल है कि आपको कौन सा मार्ग लेना चाहिए।