似乎是一半的教程 法典 以及在博客圈的使用周围 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_postsWP_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' => trueWP_Query

  • get_posts 有几个额外的参数 include, exclude, numberpostscategory. 。这些参数确实已更改为有效参数 WP_Query 在传递之前 WP_Query. include 变成了 post__in, exclude 进入 post__not_in, category 进入 catnumberposts 进入 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' => 1WP_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, )),并且可能只能在您想快速完成某件事时才在主题中使用。

许可以下: CC-BY-SA归因
scroll top