ปัญหาในการตั้งค่าพารามิเตอร์การสืบค้นให้เป็นค่าที่ไม่มีอยู่คือ 2:
- ข้อความค้นหาจะทำงานดังนั้นแม้ว่าคุณจะรู้อยู่แล้วว่าจะไม่มีผลลัพธ์ที่จะต้องจ่ายตามประสิทธิภาพเล็กน้อย
- คำสั่ง WordPress มี 19 แตกต่างกัน
'posts_*'
ตะขอตัวกรอง ( 'posts_where'
, 'post_join'
ฯลฯ .. ) ว่าการกระทำในแบบสอบถามเพื่อให้คุณไม่สามารถมั่นใจได้ว่าแม้กระทั่งการตั้งค่าพารามิเตอร์ unexistent แบบสอบถามกลับไม่มีผลง่ายOR
ประโยคกลับโดยตัวกรองการทำบางสิ่งบางอย่างกลับมา
คุณต้องการรูทีนฮาร์ดคอร์เล็กน้อยเพื่อให้แน่ใจว่าแบบสอบถามไม่ส่งคืนผลลัพธ์และไม่มีปัญหาประสิทธิภาพการทำงาน (หรือขั้นต่ำมาก)
ในการทริกเกอร์รูทีนนั้นคุณสามารถใช้ทุกวิธีโดยทางเทคนิคคุณสามารถส่งอาร์กิวเมนต์ใด ๆ ไปยัง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'
ช้าเท่าที่จะเป็นไปได้ หากอาร์กิวเมนต์ 'force_no_results' มีอยู่ในแบบสอบถามแล้ว:
- ก่อนอื่นให้ลบตัวกรองที่เป็นไปได้ทั้งหมดที่สามารถรบกวนแบบสอบถามและเก็บไว้ในอาร์เรย์ผู้ช่วย
- หลังจากตรวจสอบให้แน่ใจว่ามีการเรียกใช้ตัวกรองแล้วตัวกรอง adda ที่ส่งคืนคำขอประเภทนี้:
SELECT ID FROM wp_posts WHERE 0 = 1
เมื่อตัวกรองทั้งหมดถูกลบออกไปแล้วจะไม่มีความเป็นไปได้ที่แบบสอบถามนี้จะถูกเปลี่ยนและรวดเร็วมากและไม่มีผลลัพธ์ที่แน่นอน
- ทันทีหลังจากเรียกใช้คิวรีนี้ตัวกรองดั้งเดิมทั้งหมด (หากมี) จะถูกกู้คืนและแบบสอบถามที่ตามมาทั้งหมดจะทำงานได้ตามที่คาดไว้
WP_Query()
ไม่มีผลลัพธ์อาจเป็นวิธีที่ดีที่สุดในการตอบคำถามนั้นหรือไม่ก็ได้ นอกจากนี้ยังอาจเป็นประโยชน์หากคุณต้องการอธิบายรูปแบบการค้นหาที่คุณต้องการให้ไม่สามารถค้นหาได้ การรู้รูปแบบการค้นหาอาจช่วยแก้ไขปัญหาได้