是否存在可以使用QUERY_POST的场景?

时间:2016-05-20 作者:prosti

我觉得下面有一个红色按钮,上面写着“请勿按下”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 可能很方便

<小时>

Do no

3 个回复
最合适的回答,由SO网友:prosti 整理而成

与普通信仰相反query_posts 如果你知道如何使用它,它是无害的。我试过了here 提供更多参数。

在这里,我将添加一个你永远不应该依赖的简单提纲:$GLOBALS[\'wp_query\'].

你应该相信$GLOBALS[\'wp_the_query\'] 那应该冻结。如果要重置$GLOBALS[\'wp_query\'] 仅使用wp_reset_query.

用例

enter image description here

例如,如果您在主页上需要此功能,在主循环之后,您可以调用query_posts 对于cpt1及更高版本query_posts 同样适用于cpt2。

SO网友:fuxia

query_posts() 在有no main query: 调用到wp-admin/admin-ajax.php, wp-admin/admin-post.phpwp-login.php 例如

是的,你可以在那里获得同样的结果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_Queryget_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

相关推荐

将wp_Query替换为wp_User_Query

我在插件中制作了一些订阅者档案和单曲(个人资料页),其中我还包括了一个“用户单曲”模板,通过template_include. 不过,我正在尝试从插件中删除一些模板,以使其使用主题模板。我用了locate_template( \'single.php\' ) 从活动主题中选择单个模板。我没有使用全局wp_query 在本例中显示我的内容,但页面显示了基于查询默认值的循环(十篇帖子)。我想知道的是,我是否可以完全放弃默认查询,用wp_user_query 我可以将查询到的用户ID输入其中。然后我想筛选the