Answers:
尝试
'post__in' => array(0)
简单明了。
post__in
传递一个空数组时返回帖子…… array(0)
效果很好!这很奇怪,但实际上可以追溯到WP核心中作为一个错误出现的问题,但后来被保留下来,因为有太多主题/插件开发人员围绕它构建了功能-_- core.trac.wordpress.org/票证/ 28099
将查询参数设置为不存在值的问题是:2:
'posts_*'
过滤器钩子('posts_where'
,'post_join'
等),因此您永远无法确保即使设置了不存在的参数查询也不会返回结果,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”,则:
SELECT ID FROM wp_posts WHERE 0 = 1
过滤器:一旦删除所有过滤器,就不可能更改此查询,并且查询速度非常快,并且肯定没有结果
WP_Query()
不返回结果可能是也可能不是回答该问题的最佳方法。如果您要描述想要不可查询的搜索模式,这也可能会有所帮助。了解搜索模式可能有助于找出解决方案。