`Query_posts`真的比二次查询慢吗?

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

我知道主查询速度很快,因为它在解析URL和WP_Query 已实例化。我们在OO PHP中。

但事实上query_posts 比模板中发生的一些辅助查询(例如get_posts, 或者你打电话的本地人

// WP_Query arguments
$args = array (
);

// The Query
$query = new WP_Query( $args );

2 个回复
SO网友:Howdy_McGee

你问:

query\\u posts真的比一些辅助查询慢吗。。。

事实是如果你打电话query_posts() 从一个主题开始it already is a secondary query. WordPress已经查询过数据库一次,以获取某个页面,然后它会访问您的query_posts() 函数并再次查询数据库,创建第二次查询并覆盖原始请求/数据。

从速度的角度来看,你不会注意到任何差异。这个query_posts() 函数使用WP_Query() 覆盖某些全局变量需要几微秒的时间。最大的开销将来自您必须规范化数据,并通过分页弥补任何利基问题。

简单地说,这一切都是低效的<点击>所以,虽然可能没有一个“大红色按钮”说“不要按这里!”这几乎意味着它不应该被按下它不是又大又红但是The Codex specifically states:

Note: 此功能不适用于插件或主题。

如果您希望提高效率并需要覆盖主查询-请使用pre_get_posts 它将在从保存整个数据库调用的数据库中调用它之前修改查询参数(因为我们不需要二次查询)。

SO网友:Pieter Goosen

一般来说

主页上执行的查询,

  • query_posts( \'posts_per_page=get_option( \'posts_per_page\' )

  • $q = new WP_Query( \'posts_per_page=get_option( \'posts_per_page\' )

  • 应该具有相同的精确性能,但它们之间的差别很小,甚至没有差别,因为默认情况下,上述所有参数都是完全相同的(,即默认情况下具有相同的查询参数)。这是因为所有这些查询都使用WP_Query 类运行生成并运行db查询以返回查询的帖子。get_posts() 虽然它也使用WP_Query. 最大的区别是get_posts 通行证no_found_rows=trueWP_Query 这在法律上破坏了分页。

    事实上,主查询(主查询)根据加载的确切页面在每次页面加载时运行。删除主循环并将其替换为辅助查询(query_posts(), WP_Queryget_posts())是指使页面变慢。这是因为你做了两次同样的工作。正如我所说的,主查询将不受影响地运行,因此您已经查询了db中的帖子,并用辅助查询替换主循环,再次查询db。

    除了分页和其他糟糕的问题之外,这就是为什么应该never 将主查询中的主循环替换为辅助循环。我在这方面做了大量的文章,你可以阅读here. 要更改主查询,请始终使用pre_get_posts 因为它在WP_Query 类生成并运行SQL查询。中还有其他筛选器(子句后筛选器)WP_Query 您可以使用它直接更改SQL查询

    什么使query_posts 糟糕的是,它改变了许多函数所依赖的主查询对象query_posts 是否执行以下操作

    $wp_query = new WP_Query()
    
    它还改变了条件标记。要得到完整的解释,你可以阅读我的答案here. A正常WP_Query 不会那样做

    相关推荐

    将wp_Query替换为wp_User_Query

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