• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

WordPress中WP_Query vs query_posts() vs get_posts()的区别和联系?

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

wordpress中的2个查询方法query_posts()WP_Query到底有什么区别和联系?分别应该在什么情形下使用?

各种博客教程中2种方法都有涉及,但是没有明确区分,让人比较困惑,这个问题怎么破?

 

主流的理解思路

  • query_posts()过于简单并且存在问题,通过用查询的新实例替换页面的主查询来修改主查询。相对来说这个函数效率较低下(re-runs SQL查询),并在某些情况下可能会彻底失败(特别是在处理帖子分页时)。任何当前的WP代码都应该使用更可靠的方法,例如使用pre_get_posts挂钩。 长话短说尽量不要使用 query_posts();
  • get_posts()在用法上非常相似,并且接受相同的参数(具有一些细微差别,如不同的默认值),但返回帖子数组,不修改全局变量并且可以安全地在任何地方使用;
  • WP_Query类既支持后台默认流程,也可以自己创建和使用它的对象。用法更复杂,限制更少,也可以安全地在任何地方使用。

 

次佳解决思路

query_posts – 您永远不应该使用query_posts。除了上文所说的,query_posts真正的大问题是,它破坏了主查询对象(存储在$wp_query中)。很多插件和自定义代码都依赖于主查询对象,因此打破主查询对象意味着您打破了插件和自定义代码的功能。主函数影响分页功能,所以如果你打破了主要查询,就会破坏分页。

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

var_dump( $wp_query );
query_posts( '&posts_per_page=-1' );
var_dump( $wp_query );

get_postsWP_Query是构建辅助查询(如静态首页上的相关文章,滑块,精选内容)的正确方法。应该注意的是,不应该在主页,单页或任何类型的归档页面上使用两者中的任何一个,因为它会破坏页面功能。如果需要修改主查询,请使用pre_get_posts来完成,而不是自定义查询。 (更新:对于静态首页和真实页面,请参阅Using pre_get_posts on true pages and static front pages *)

实质上,WP_Query由主查询使用,也由get_posts使用,但虽然get_posts()使用WP_Query,但有一些差异

  • get_postsWP_Query更快。区别取决于网站的总帖子数量。原因是,get_posts默认将'no_found_rows' => true传递给WP_QueryWP_Query会跳过/合法地中断分页。使用'no_found_rows' => trueWP_Query获取查询的帖子数量,然后保留,默认情况下,它会进一步搜索与查询匹配的所有帖子以计算分页。因此,get_posts()只能用于非分页查询。分页get_posts真的是一个大混乱。 WP_Query应该用于所有分页查询
  • get_posts()不受被WP_Query影响的posts_*过滤器的影响。原因是get_posts默认将'suppress_filters' => true传递给WP_Query
  • get_posts有几个额外的参数,如includeexcludenumberpostscategory。在传递给WP_Query之前,这些参数会变为WP_Query的有效参数。 include变为post__inexclude变为post__not_incategory变为catnumberposts变为posts_per_page。只需注意,可传递给WP_Query的所有参数均可与get_posts一起使用,可以忽略并不使用get_posts的默认参数
  • get_posts只返回WP_Query$posts属性,而WP_Query返回完整的对象。当涉及条件,分页和其他可用于循环内部的有用信息时,该对象非常有用。
  • get_posts不使用循环,而是使用foreach循环显示帖子。另外,默认情况下,没有模板标签可用。 setup_postdata( $post )必须用于使模板标签可用。 WP_Query使用默认情况下可用的循环和模板标签
  • get_posts'ignore_sticky_posts' => 1传递给WP_Query,因此get_posts默认忽略粘性帖子

基于上述情况,是否使用get_postsWP_Query取决于您,您在查询中实际需要什么。以上应引导您选择

 

第三种解决思路

基本区别在于query_posts()实际上只是用于修改当前循环。一旦你完成了,有必要重新设置循环并将其快速发送。这个方法也比较容易理解,因为你的”query”基本上是一个URL字符串,你传递给函数,如下所示:

query_posts('meta_key=color&meta_value=blue'); 

另一方面,WP_Query更像是一种通用工具,更像是直接编写MySQL查询,而不是query_posts()。你也可以在任何地方使用它(不只是在循环中),它不会干扰任何当前正在运行的后期查询。

 

第四种思路

根本不需要使用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(),如果你需要做的只是一些轻微的操纵。

 

参考资料

  • When should you use WP_Query vs query_posts() vs get_posts()?

 


鲜花

握手

雷人

路过

鸡蛋
专题导读
上一篇:
根据 Pandas 中列的值从DataFrame中选择行发布时间:2022-05-14
下一篇:
使用TensorFlow进行股票价格预测的简单深度学习模型发布时间:2022-05-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap