非管理员用户的WP_QUERY较慢

时间:2017-03-17 作者:吉 宁

我开发了一个前端用户中心功能(登录、注册、编辑配置文件、添加帖子等)。一切都很好,很酷,除了管理员以外的其他用户登录时,主页的浏览速度会非常慢。

我不知何故对其进行了调试,找到了罪魁祸首,如下所示:

SELECT SQL_CALC_FOUND_ROWS wiki_posts.ID
FROM wiki_posts
WHERE 1=1
AND wiki_posts.post_type = \'post\'
AND (wiki_posts.post_status = \'publish\'
OR wiki_posts.post_author = 4 //the current user which is not admin
AND wiki_posts.post_status = \'private\')
ORDER BY wiki_posts.post_date DESC
LIMIT 0, 20
这个查询花了大约60秒!它只发生在我的笔记本上,也就是索引。在我的例子中是php,循环了20篇文章。

所以我的问题是:

1) 为什么wordpress每次登录并尝试查看主页时都会对非管理员用户进行此查询?

2) 。这可能是什么原因?我对索引中的循环非常确定。php不会提出这个问题。

1 个回复
SO网友:吉 宁

好的,所以我深入研究了wp-includes/query。php,并在第3180行找到:

if ( is_user_logged_in() ) {
            // Add private states that are limited to viewing by the author of a post or someone who has caps to read private states.
            $private_states = get_post_stati( array(\'private\' => true) );
            foreach ( (array) $private_states as $state )
                $where .= current_user_can( $read_private_cap ) ? " OR $wpdb->posts.post_status = \'$state\'" : " OR $wpdb->posts.post_author = $user_id AND $wpdb->posts.post_status = \'$state\'";
        }
这就是触发器,我可以通过注释foreach来解决性能问题。

但我的问题仍然是:为什么wordpress会这样做,目的是什么?

我们正在谈论一个巨大的网站(有超过4万个帖子)。