অসামঞ্জস্য মানের একটি কোয়েরি প্যারামিটার সেট করতে সমস্যাগুলি হ'ল 2:
- কোয়েরিটি চলবে, সুতরাং আপনার যদি ইতিমধ্যে জানা থাকে যে কোনও ফলাফল না হয় তবে প্রদানের জন্য সামান্য পারফরম্যান্সের মূল্য থাকবে
- ওয়ার্ডপ্রেস ক্যোয়ারিতে 19 টি পৃথক
'posts_*'
ফিল্টার হুক ( 'posts_where'
, 'post_join'
ইত্যাদি।) রয়েছে যা কোয়েরিতে কাজ করে, তাই আপনি কখনই নিশ্চিত হতে পারবেন না যে কোয়েস্টের অসামঞ্জস্য পরম কোনও ফলাফল দেয় না, OR
ফিল্টার দ্বারা ফিরে আসা একটি সহজ ধারাটি কিছু ফেরত দেয়।
আপনি একটি সামান্য বিট প্রয়োজন হার্ডকোর রুটিন হতে নিশ্চিত একটি ক্যোয়ারী কোন ফলাফল আসতে আর কোন (অথবা খুব minimun) কার্য সম্পাদন বিষয়।
সেই রুটিন ট্রিগার করতে, আপনি প্রতিটি পদ্ধতি ব্যবহার করতে পারেন, প্রযুক্তিগতভাবে আপনি কোনও যুক্তি পাস করতে পারেন WP_Query
, ইভেন্ট যুক্তিগুলি অস্তিত্ব
সুতরাং আপনি যদি এর মতো কিছু পছন্দ করেন তবে আপনি 'force_no_results' => true
এটির মতো ব্যবহার করতে পারেন:
$a = new WP_Query( array( 's' => 'foo', 'force_no_results' => true ) );
এবং 'pre_get_posts'
এতে কঠোর পরিশ্রম করে একটি কলব্যাক যোগ করুন :
add_action( 'pre_get_posts', function( $q ) {
if (array_key_exists('force_no_results', $q->query) && $q->query['force_no_results']) {
$q->query = $q->query_vars = array();
$added = array();
$filters = array(
'where', 'where_paged', 'join', 'join_paged', 'groupby', 'orderby', 'distinct',
'limits', 'fields', 'request', 'clauses', 'where_request', 'groupby_request',
'join_request', 'orderby_request', 'distinct_request','fields_request',
'limits_request', 'clauses_request'
);
// remove all possible interfering filter and save for later restore
foreach ( $filters as $f ) {
if ( isset($GLOBALS['wp_filter']["posts_{$f}"]) ) {
$added["posts_{$f}"] = $GLOBALS['wp_filter']["posts_{$f}"];
unset($GLOBALS['wp_filter']["posts_{$f}"]);
}
}
// be sure filters are not suppressed
$q->set( 'suppress_filters', FALSE );
$done = 0;
// use a filter to return a non-sense request
add_filter('posts_request', function( $r ) use( &$done ) {
if ( $done === 0 ) { $done = 1;
$r = "SELECT ID FROM {$GLOBALS['wpdb']->posts} WHERE 0 = 1";
}
return $r;
});
// restore any filter that was added and we removed
add_filter('posts_results', function( $posts ) use( &$done, $added ) {
if ( $done === 1 ) { $done = 2;
foreach ( $added as $hook => $filters ) {
$GLOBALS['wp_filter'][$hook] = $filters;
}
}
return $posts;
});
}
}, PHP_INT_MAX );
এই কোডটি যা করে তা 'pre_get_posts'
যতটা সম্ভব দেরীতে চালিত হয় । যদি 'বল_নো_সাল্টস' যুক্তি কোয়েরিতে উপস্থিত থাকে, তবে:
- প্রথমে সমস্ত সম্ভাব্য ফিল্টারগুলি সরিয়ে ফেলুন যা ক্যোয়ারিতে হস্তক্ষেপ করতে পারে এবং সেগুলি হেল্পারের অ্যারেতে সংরক্ষণ করে
- ফিল্টার ট্রিগার হয়েছে তা নিশ্চিত হওয়ার পরে, অ্যাডা ফিল্টার যা এই ধরণের অনুরোধটি ফিরিয়ে দেয়:
SELECT ID FROM wp_posts WHERE 0 = 1
সমস্ত ফিল্টার সরিয়ে , এই কোয়েরিটি পরিবর্তিত হওয়ার কোনও সম্ভাবনা নেই এবং এটি খুব দ্রুত, এবং নিশ্চিতরূপে কোনও ফলাফল নেই
- এই কোয়েরিটি চালুর সাথে সাথেই সমস্ত মূল ফিল্টার (যদি থাকে তবে) পুনরুদ্ধার করা হয় এবং পরবর্তী সমস্ত ক্যোয়ারী প্রত্যাশার মতো কাজ করবে।
WP_Query()
ফলাফল শূণ্য অথবা সবচেয়ে ভালো উপায় যে প্রশ্নের উত্তর দিতে হতে পারে। আপনি অনুসন্ধানের প্যাটার্নটি যা আপনি জিজ্ঞাসাযোগ্য হতে চান তা বর্ণনা করলেও এটি সহায়ক হতে পারে । অনুসন্ধানের প্যাটার্নটি জানলে কোনও সমাধান বের করাতে পারে।