我觉得下面有一个红色按钮,上面写着“请勿按下”query_posts()
. 老实说,一段时间以来,我一直试图揭开这种现象的神秘面纱,但收效甚微。
例如,不使用此函数的主要原因可能是分页中断。第二,它可能很慢(阅读:打两次电话),或者有更好的方法(pre_get_posts
). 可能还有更多的原因。
对于那些出于本能而否定这个问题的人,我呼吁他们至少坚持一周左右。总有第二次机会这样做。在团队压力面前,我几乎不想看到至少一些答案。
对于未阅读的人this 我想说的是,这个函数没有被弃用,也没有被标记为_doing_it_wrong
, 也没有计划。就连让它成为弃用的门票最近也被关闭了。
有些人可能会说,他们读到这个函数不能在WordPress中使用。我在这里提供了全部功能。
File: /wp-includes/query.php
79: /**
80: * Set up The Loop with query parameters.
81: *
82: * This will override the current WordPress Loop and shouldn\'t be used more than
83: * once. This must not be used within the WordPress Loop.
84: *
85: * @since 1.5.0
86: *
87: * @global WP_Query $wp_query Global WP_Query instance.
88: *
89: * @param string $query
90: * @return array List of posts
91: */
92: function query_posts($query) {
93: $GLOBALS[\'wp_query\'] = new WP_Query();
94: return $GLOBALS[\'wp_query\']->query($query);
95: }
你可以看到
This must not be used within the WordPress Loop.
, 意思是不在WordPress循环内,意味着在WordPress循环之前可能不会被禁止。
我注意到from this post 该函数不比任何辅助查询(具有相同的参数)慢。
底线,说到分页query_posts
是比get_posts
自从get_posts
实际禁用SQL_CALC_FOUND_ROWS
.
关于query_posts
可能是:
查询参数不受限制,您可以随意设置如果不打算使用核心分页函数,甚至可以将参数设置为使用分页;超级简单您可以创建自己的分页,在一个典型的博客中,只有一小部分页面可以使用分页。大多数页面,在大多数常规的简单情况下,甚至不使用分页,以便快速执行某些操作并重用主查询模板(读取循环)query_posts
可能很方便这些只是一些想法,我相信还有更多,但如果你知道你在说什么,你肯定不会错的。
<小时>
SO网友:Pieter Goosen
每当主查询可用时,无论加载的是哪个页面/归档文件,都应使用pre_get_posts
在生成和执行SQL查询之前更改主查询的查询变量。这适用于需要更改主查询的每个页面。这是RECOMMENDED 更改主查询的方法。这样做不会导致进行任何额外的db查询,句号。对于真实页面和静态首页,您始终可以使用PreGetPostsForPages
class 甚至the pre_get_posts
method described by @birgire here.
永远不要用自定义查询替换主查询,也不要使用query_posts
, 的新实例WP_Query
或get_posts
. 这会在每页加载时添加额外的db调用,因为主查询将不受影响地运行。如果将主查询替换为自定义查询,则会运行两倍的db调用,这也会增加页面加载时间。不仅如此,分页成了一场噩梦。你应该慢慢来读this answer I have done on pagination.
您应该只运行滑块、小部件、相关帖子和导航菜单之类的自定义查询,永远不要替换或更改主查询。
query_posts
运行自定义查询仍然是一种非常有问题的方式,因为它会更改存储在中的主查询对象$wp_query
($GLOBALS[\'wp\\u query\'])因为有太多的函数和插件依赖于主查询对象来运行分页、相关帖子和面包屑之类的事情
正如@toscho已经提到的,仅使用query_posts
当没有用于ajax调用的主查询以及管理端的一些页面时。除此之外,你真的应该避免使用它,当你真的需要在前端打破一些东西时接受它。
正如我所说,完全不需要运行任何类型的自定义查询来代替主查询,只需更改或修改页面的输出即可。如果确实需要更好的性能和更快的加载时间,请使用pre_get_posts
更改主查询,并且无论出于什么原因都不要替换它。自定义查询意味着要做额外的事情,如小部件、相关帖子和滑块
最后,请编辑并校对、下载并安装查询监视器插件。这样,当您用任何自定义查询替换主查询时,您可以看到页面加载时间和db调用的急剧增加,并且使用pre_get_posts