什么时候应该使用WP_QUERY VS QUERY_POSTS()VS GET_POSTS()?

时间:2010-09-13 作者:Dan Gayle

看起来Codex 在博客圈中使用query_posts() 和一半使用WP_Query.

它们都做相似的事情,那么我什么时候应该使用其中一个呢?

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

  • query_posts() 通过用查询的新实例替换页面的主查询来修改页面的主查询,这是一种过于简单且有问题的方法。它效率低下(重新运行SQL查询),并且在某些情况下会彻底失败(尤其是在处理POST分页时)。任何现代WP代码都应该使用更可靠的方法,例如pre_get_posts 挂钩,用于此目的。TL;博士don\'t use query_posts() ever.

  • get_posts() 在用法上非常相似,接受相同的参数(有一些细微差别,比如不同的默认值),但返回一个post数组,不修改全局变量,可以在任何地方安全使用。

  • WP_Query 是一个在幕后为这两个对象提供支持的类,但您也可以创建并使用自己的实例。更复杂一点,限制更少,也可以安全地在任何地方使用。

SO网友:Pieter Goosen

query_posts - 永远不要使用query_posts. 除了@Rarst所说的之外query_posts 是,它打断了主查询对象(存储在$wp_query ). 许多插件和自定义代码依赖于主查询对象,因此破坏主查询对象意味着破坏插件和自定义代码的功能。只有一个这样的函数是最重要的分页函数,因此如果中断主查询,则会中断分页。

来证明有多糟糕query_posts 在任何模板上,执行以下操作并比较结果

var_dump( $wp_query );
query_posts( \'&posts_per_page=-1\' );
var_dump( $wp_query );
get_postsWP_Query 是正确的施工方法secondary 查询(,如相关帖子、滑块、特色内容和静态首页上的内容)。需要注意的是,您不应该使用这两种方法中的任何一种来支持主页上的主查询、单个页面或任何类型的存档页面,因为这会破坏页面功能。如果需要修改主查询,请使用pre_get_posts 这样做,而不是自定义查询。(UPDATE:有关静态首页和真实页,请参阅Using pre_get_posts on true pages and static front pages*)

本质上,WP_Query 用于主查询,也用于get_posts, 但尽管如此get_posts() 使用WP_Query, 有一些区别

  • get_posts 快于WP_Query. 保证金取决于网站的总帖子数量。原因是,get_posts 通行证\'no_found_rows\' => true 默认为WP_Query 跳过/合法中断分页。具有\'no_found_rows\' => true, WP_Query 获取查询的帖子数量,然后退出,默认情况下,它会进一步搜索与查询匹配的所有帖子,以计算分页。

    因此,get_posts() 应仅用于未分页的查询。分页get_posts 真是一团糟。WP_Query 应用于所有分页查询

  • get_posts() 不受posts_* 过滤器在哪里WP_Query 受到这些筛选器的影响。原因是get_posts, 默认情况下,通过\'suppress_filters\' => trueWP_Query

  • get_posts 有几个额外的参数,如include, exclude, numberpostscategory. 这些参数确实会更改为的有效参数WP_Query 在传递给之前WP_Query. include 更改为post__in, exclude 进入post__not_in, category 进入catnumberposts 进入posts_per_page. 只是一张便条,all 可以传递给的参数的WP_Query 使用get_posts, 你can 忽略并不使用的默认参数get_posts

  • get_posts 仅返回$posts 财产WP_Query 虽然WP_Query 返回完整的对象。当涉及条件、分页和其他可在循环中使用的有用信息时,此对象非常有用。

  • get_posts 不使用循环,但foreach 循环以显示帖子。此外,默认情况下没有可用的模板标记。setup_postdata( $post ) 必须用于使模板标记可用。WP_Query 使用默认情况下可用的循环和模板标记

  • get_posts 通行证\'ignore_sticky_posts\' => 1WP_Query, 所以get_posts 默认情况下,忽略粘性帖子

基于上述,是否使用get_postsWP_Query 这取决于您以及您从查询中实际需要什么。以上内容将指导您的选择

SO网友:nickmjones

基本区别在于query_posts() 实际上仅用于修改当前循环。完成后,有必要重置循环并以愉快的方式发送。此方法也更容易理解,因为“查询”基本上是传递给函数的URL字符串,如下所示:

query_posts(\'meta_key=color&meta_value=blue\'); 
另一方面,WP_Query 更像是一个通用工具,更像是直接编写MySQL查询,而不是query_posts() 是您还可以在任何地方使用它(不仅仅是在循环中),而且它不会干扰当前正在运行的任何post查询。

我倾向于使用WP_Query 更多的时候,就像它发生的那样。真的,这取决于你的具体情况。

SO网友:RebelPhoenix

根本不需要使用query_posts(). 它所做的只是实例化一个新的WP\\u查询对象,并将该新对象重新分配给global wp_query.

作为参考,以下是实际query_posts() 作用

 function query_posts($query) {
        $GLOBALS[\'wp_query\'] = new WP_Query();
        return $GLOBALS[\'wp_query\']->query($query);
    }
如果要创建深入的自定义查询脚本,请实例化自己的WP\\U查询对象。或使用get_posts() 如果你所需要做的只是在这里和那里进行一些灯光操作。

无论是哪种情况,我强烈建议你帮自己一个忙wp_includes/query.php 阅读WP_Query

SO网友:Bindiya Patoliya

确保您使用wp_reset_query() 使用后query_posts() 因为它也会影响其他查询结果。

SO网友:tw2113

如果我记得读对了,本质上“循环”就是WP_Query 在核心文件中,但以更容易理解的方式。

SO网友:dalveer

  • query_posts():如果需要修改主查询,则可能只在一种情况下使用。它设置了许多全局变量
  • get_posts():它在机制上非常相似,接受相同的参数,但返回一组帖子WP_Query:您可以创建并使用它自己的对象。更复杂一点,限制更少,在任何地方使用都是安全的

结束

相关推荐

QUERY_POST的所有可用参数有哪些?

的WordPress codex页query_posts 声明它没有涵盖query\\u posts采用的所有参数:这还不是一个详尽的列表。这是为了展示设置自己的查询时可能出现的一些更常见的情况我找不到查询帖子所接受的所有参数的参考,即使只是一个简单的列表形式。这些数据是否有备忘单或类似资料