এই সমাধানটি নিয়মিত এক্সপ্রেশন প্রয়োগ করে অনুসন্ধানের স্ট্রিংগুলি ফিল্টার করে যা কেবলমাত্র কমন এবং ল্যাটিন ইউনিকোড স্ক্রিপ্টগুলির অক্ষরগুলির সাথে মেলে।
নিয়মিত অভিব্যক্তিগুলির সাথে ল্যাটিন চরিত্রের মিল
আমি সবেমাত্র স্ট্যাক ওভারফ্লোতে আমার মনকে উড়িয়ে দিয়েছি । যেমনটি দেখা যাচ্ছে, নিয়মিত এক্সপ্রেশনগুলিতে পুরো ইউনিকোড বিভাগগুলিকে মেলানোর জন্য একটি প্রক্রিয়া থাকে , পুরো ইউনিকোড "স্ক্রিপ্ট" নির্দিষ্ট করার মানগুলি সহ , প্রতিটি লিখন পদ্ধতিতে ব্যবহৃত অক্ষরের গ্রুপের সাথে সম্পর্কিত each
এটি \p
মেটা-চরিত্রটি ব্যবহার করে কোঁকড়া ধনুর্বন্ধনীগুলিতে ইউনিকোড বিভাগের শনাক্তকারী দ্বারা ব্যবহৃত হয় - সুতরাং লাতিন বা সাধারণ স্ক্রিপ্টগুলির মধ্যে একটির [\p{Common}\p{Latin}]
একটি চরিত্রের সাথে মেলে - এতে বিরামচিহ্ন, সংখ্যা এবং বিবিধ চিহ্ন রয়েছে।
হিসাবে @Paul 'চড়ুই হক' Biron তুলে ধরে , u
প্যাটার্ন পরিবর্তক পতাকা পিএইচপি এর PCRE কাজকর্মের জন্য অর্ডার বিষয় স্ট্রিং চিকিত্সা হিসাবে রেগুলার এক্সপ্রেশন শেষে নির্ধারণ করা উচিত 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()
কোয়েরিটির নামকরণ করা কোয়েরি ওয়ার্স পরিবর্তন করে কোয়েরিটি পরিবর্তন করতে ব্যবহার করতে পারেন - সুতরাং এসকিউএল কোয়েরি ওয়ার্ডপ্রেসকে পরবর্তীকালে রচনা করে এবং কার্যকর করে।
সর্বাধিক প্রাসঙ্গিক ক্যোয়ারের ভেরিয়েবলগুলি সম্ভবত নিম্নলিখিত:
s
অনুসন্ধানের স্ট্রিংয়ের সাথে সম্পর্কিত ক্যোয়ারী ভেরিয়েবল। এটিতে null
বা একটি খালি স্ট্রিং ( ''
) সেট করার ফলে ওয়ার্ডপ্রেস কোয়েরিটিকে আর অনুসন্ধান হিসাবে বিবেচনা করবে না - প্রায়শই বার বার এই ফলাফলগুলি অন্য মানগুলির উপর নির্ভর করে সমস্ত পোস্ট বা সাইটের প্রথম পৃষ্ঠাগুলি প্রদর্শিত একটি সংরক্ষণাগার টেমপ্লেটে প্রদর্শিত হয় this কোয়েরি ওয়ার্স তবে এটি একটি একক স্থান ( ' '
) এ সেট করার ফলে ওয়ার্ডপ্রেস এটি অনুসন্ধান হিসাবে স্বীকৃতি দেবে এবং এইভাবে 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
যে চেয়ে বড় যা enqueues JavaScript, এবং ব্যবহার এই wp_localize_script()
আপনার ত্রুটি বার্তা অন্তর্ভুক্ত যে পরিবর্তনশীল সেট করতে।
wp_redirect()
ব্যবহারকারীকে আপনার পছন্দের ইউআরএল প্রেরণ করতে ব্যবহার করুন (এই পদ্ধতিতে অতিরিক্ত পৃষ্ঠা লোডের প্রয়োজন হয়)।
- একটি পিএইচপি ভেরিয়েবল সেট করুন বা এমন একটি পদ্ধতির আবেদন করুন যা আপনার থিম / প্লাগইনকে ত্রুটি সম্পর্কে জানাবে যাতে এটি যেখানে উপযুক্ত সেখানে প্রদর্শিত হতে পারে।
- সেট
s
করার জন্য query পরিবর্তনশীল ''
পরিবর্তে ' '
ও ব্যবহার page_id
স্থানে post__in
আপনার পছন্দসই একটি পৃষ্ঠায় ফিরে হবে।
- কোয়েরির ফলাফলগুলিতে আপনার ত্রুটিযুক্ত কোনও জাল বস্তুকে ইনজেক্ট করার জন্য একটি
loop_start
হুক ব্যবহার করুন WP_Post
- এটি অবশ্যই একটি কুৎসিত হ্যাক এবং এটি আপনার নির্দিষ্ট থিমের সাথে সঠিক নাও লাগতে পারে তবে "ফলাফল নয়" বার্তাটি দমন করার এটির সম্ভাব্য পছন্দসই পার্শ্ব প্রতিক্রিয়া রয়েছে।
template_include
আপনার থিম বা প্লাগইনে কোনও কাস্টম দিয়ে অনুসন্ধান টেম্পলেটটি অদলবদল করতে একটি ফিল্টার হুক ব্যবহার করুন যা আপনার ত্রুটি প্রদর্শন করে।
প্রশ্নে থিমটি পরীক্ষা না করেই আপনাকে কোন রুটে চলা উচিত তা নির্ধারণ করা কঠিন।