何时应该使用wp_query vs query_posts()vs get_posts()?
-
16-10-2019 - |
题
似乎是一半的教程 法典 以及在博客圈的使用周围 query_posts()
和一半使用 WP_Query
. 。这是怎么回事?
解决方案
query_posts()
是过于简单的方法,可以通过用查询的新实例替换页面来修改页面的主要查询的问题。它效率低下(重新运行SQL查询),在某些情况下会完全失败(尤其是在处理邮政分页时)。任何现代的WP代码都应使用更可靠的方法,例如使用pre_get_posts
钩子,为此目的。 tl; dr 不要使用query_posts().get_posts()
用法非常相似,并且接受相同的参数(有些细微差别,例如不同的默认值),但是返回一系列帖子,不会修改全局变量,并且可以安全地使用任何地方。WP_Query
是在幕后启动的班级,但是您也可以使用自己的实例创建和使用。更复杂,限制更少,在任何地方也可以安全使用。
其他提示
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_posts
和 WP_Query
是构造的正确方法 次要 查询( 喜欢相关帖子,滑块,特色内容 和静态前页面上的内容 ) 和。应该注意的是,您不应在主页,单页或任何类型的存档页面上使用两者中的任何一个,因为它会破坏页面功能。如果您需要修改主查询,请使用 pre_get_posts
这样做,而不是自定义查询。 ((更新: 有关静态前页面和真实页面,请参见 在真实页面和静态前页面上使用pre_get_posts*)
在本质上, 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' => true
至WP_Query
get_posts
有几个额外的参数include
,exclude
,numberposts
和category
. 。这些参数确实已更改为有效参数WP_Query
在传递之前WP_Query
.include
变成了post__in
,exclude
进入post__not_in
,category
进入cat
和numberposts
进入posts_per_page
. 。只是注意, 全部 可以传递给的参数WP_Query
使用get_posts
, , 你 能够 忽略并且不使用默认参数get_posts
get_posts
仅返回$posts
财产的WP_Query
尽管WP_Query
返回完整的对象。当涉及条件性,分页和其他有用的信息时,该对象非常有用。get_posts
不使用循环,而是foreach
循环显示帖子。另外,默认情况下没有任何模板标签。setup_postdata( $post )
必须用于使模板标签可用。WP_Query
默认情况下使用循环和模板标签get_posts
通过'ignore_sticky_posts' => 1
至WP_Query
, , 所以get_posts
默认忽略粘性帖子
基于上述,是否使用 get_posts
或者 WP_Query
取决于您以及您从查询中实际需要什么。以上应该指导您选择
基本区别在于 query_posts()
实际上仅用于修改当前循环。完成后,有必要重置循环并以快乐的方式发送。此方法也更容易理解,仅仅是因为您的“查询”基本上是您传递给该函数的URL字符串,例如:
query_posts('meta_key=color&meta_value=blue');
另一方面, WP_Query
更像是一种通用工具,更像是直接编写mysql查询而不是 query_posts()
是。您也可以在任何地方(不仅在循环中)使用它,并且不会干扰当前运行的查询。
我倾向于使用 WP_Query
经常发生这种情况。确实,这将取决于您的具体情况。
根本不需要使用 query_posts()
. 。它所做的只是实例化一个新的wp_query对象,然后重新分配该新对象 global wp_query
.
作为参考,以下是实际 query_posts()
功能。
function query_posts($query) {
$GLOBALS['wp_query'] = new WP_Query();
return $GLOBALS['wp_query']->query($query);
}
如果要创建一个深度自定义查询脚本,请实例化您自己的WP_QUERY对象。或使用 get_posts()
如果您需要做的就是在这里和那里进行一些轻巧的操作。
无论哪种情况,我都强烈建议您帮自己一个忙,然后去 wp_includes/query.php
并仔细阅读 WP_Query
班级。
确保您使用 wp_reset_query()
使用后 query_posts()
因为它也会影响其他查询结果。
如果我记得正确阅读,本质上是“循环” WP_Query
在核心文件中,但更容易理解。
- query_posts():如果您需要修改主查询,则可能在一个又一件情况下使用。它设置了许多全球变量;
- get_posts():它在机制上非常相似,并且接受相同的论点,但是返回了各种帖子
- wp_query:您可以使用它的对象创建和工作。更复杂,限制较少,可以安全地使用任何地方。
我会说不要使用 get_posts()
在插件中。在某些情况下,它施加了非常限制的过滤器(set的 suppress_filters
, ignore_sticky_posts
, )),并且可能只能在您想快速完成某件事时才在主题中使用。