我正在一个具有搜索功能的网站上,该功能允许用户搜索大量的帖子元。有一种特定的搜索模式,我想强制不返回任何结果。从技术上讲WP_Query会在数据库中找到结果,但是我想以某种方式覆盖它,以强制它不返回结果以触发if( $example->have_posts() )失败。像'force_no_results' => true这样的WP_Query会强制其不返回任何结果?

评论

IT似乎是在要求已经确定的实现,而不是在问如何解决根本问题。阅读这句话,我认为您真正应该问的是:如何使特定的搜索模式不可查询?导致WP_Query()不返回结果的方法可能是,也可能不是回答该问题的最佳方法。如果您要描述想要不可查询的搜索模式,这也可能会有所帮助。了解搜索模式可能有助于找出解决方案。

#1 楼

尝试

'post__in' => array(0)


简单明了。

评论


我的第一个想法是–一定在某处出错,但是从略读相关代码后,这实际上应该可以很好地工作。 :)

–稀有
2014年4月9日在14:48

零非常重要,因为只有一个空数组会返回最近的帖子。

–马克·卡普伦
17年2月7日在15:01

谢谢!这为我解决了一个错误,因为post__in在传递空数组时返回帖子... array(0)很棒!这很奇怪,但实际上可以追溯到WP核心中作为一个错误出现的问题,但后来被保留下来,因为有太多主题/插件开发人员围绕它构建了功能-_- core.trac.wordpress.org/机票/ 28099

–EranSch
17 Mar 29 '17 at 15:19

#2 楼

奇怪的是,没有干净/明确的方法可以使WP_Query短路。
但是对于WP->parse_request()本身来说,通常是肮脏的骇客,例如通过通过do_parse_request过滤器添加WP_Query来短路SQL查询等。

评论


谢谢(你的)信息。顺便说一句,这是一个次要循环。我最终做了一个肮脏的hack,例如“ post_type” =>“ break_loop”,这是一个不存在的帖子类型。

–某处某人
2014年4月9日下午0:59

#3 楼

将查询参数设置为不存在的值时遇到的问题是2:


查询将运行,因此即使您已经知道没有结果,也要付出一点性能代价。
WordPress查询具有对查询起作用的19个不同的'posts_*'过滤器挂钩('posts_where''post_join'等),因此您永远无法确定即使设置了不存在的参数查询也不返回结果,过滤器返回的简单OR子句返回某些内容。

您需要一些硬性例程来确保查询不返回任何结果,并且不会(或非常小)性能问题。

触发该例程,您可以使用每种方法,从技术上讲,您可以将任何参数传递给WP_Query,即不存在的事件参数。 >
$a = new WP_Query( array( 's' => 'foo', 'force_no_results' => true ) );


并添加在'force_no_results' => true上运行的回调以完成艰苦的工作:在'pre_get_posts'上尽可能晚。如果查询中存在参数'force_no_results',则:


首先删除所有可能干扰查询的过滤器,然后将其存储在帮助器数组中
确保触发了过滤器,添加一个返回此类请求的过滤器:'pre_get_posts'一旦删除所有过滤器,此查询就不可能更改并且非常快速,并且肯定没有结果。查询已运行,​​所有原始筛选器(如果有的话)将还原,所有后续查询将按预期工作。