减少WP_QUERY循环中的SQL查询数以获取作者数据

时间:2013-05-15 作者:John

这个问题适用于scale,与典型的blog实现无关。我正在开发一个web应用程序,运行标准WP\\U查询来获取一些自定义帖子类型。这通常会导致运行大约10个SQL查询。在循环中,我需要访问这两个post meta 对于岗位和user meta 这篇文章的作者。使用get_post_meta 在回路内部。WordPress缓存WP\\U查询的结果,因此每次“不进行”其他查询get_post_meta 在循环中调用。

然而,在为文章作者检索用户数据时,情况变得很糟糕。通常我需要打电话get_user_by 在循环中获取用户数据。问题来了。如果我使用WP_Query 获取50个帖子each by a different author, 使命感get_user_by 循环内会产生100个SQL查询(每个用户有两个用于从中提取数据的查询users 表和usermeta 表)。这是我前面提到的10个SQL查询的补充。110 SQL查询!-这太疯狂了。

接下来,我想使用WP_User_Query 在循环运行之前获取用户数据。

    $custom_query = new WP_Query($args);
    foreach($custom_query->posts as $post) {
        $post_authors[] = (int)$post->post_author;
    }
    $user_query = new WP_User_Query( array(\'include\' => $post_authors) );
我以为WP_User_Query 像这样聪明WP_Query 并减少查询数量。这确实将查询数量从之前的100个减少到了51个。一个查询命中users 桌子for all users 50个查询命中usermeta 桌子one for each user. 更好,但不是我所期望的。

如何减少场景的查询?

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

经过多次尝试和错误,我了解到WP\\u User\\u Query需要一个参数fields 可设置为\'all_with_meta\'. 这将在一次访问中获取的任意数量的用户的查询数量减少到两个,并且还提供了缓存的好处。用法如下所示:

$user_query = new WP_User_Query( array(\'include\' => $post_authors, \'fields\' => \'all_with_meta\') );

结束

相关推荐

按自定义顺序对Get_Users()中的用户进行排序

<?php $blogusers = get_users(\'include=5,6,2,7,12,8\'); foreach ($blogusers as $user) { ... } ?> 现在,这些用户将按名字排序。如何按数字的顺序排序include=...? 示例:用户5第一、用户6第二、用户2第三等。