管理员:核心元查询导致编辑页面非常慢

时间:2015-05-07 作者:psorensen

我们注意到,在编辑帖子或页面时,加载时间非常长。使用查询监视器,我们发现这个WP核心查询需要15-20秒。

SELECT meta_key 
FROM wp_postmeta 
GROUP BY meta_key 
HAVING meta_key NOT LIKE \'\\\\_%\' 
ORDER BY meta_key 
LIMIT 30

caller: 
meta_form()
post_custom_meta_box()
do_meta_boxes()
我们确实使用了很多Posteta,因为我们的一种帖子类型使用了大约20个自定义字段。我想说,也许我们太依赖Posteta了,但这似乎是一个非常不完善的查询,因为它甚至没有选择帖子的ID。

这是一个常见问题吗?有没有办法通过过滤器禁用此功能?感谢您的任何意见。

3 个回复
SO网友:birgire

如果要测试自定义SQL以查看其对加载时间的影响,可以尝试以下查询交换:

/**
 * Restrict the potential slow query in the meta_form() to the current post ID.
 *
 * @see http://wordpress.stackexchange.com/a/187712/26350
 */

add_action( \'add_meta_boxes_post\', function( $post )
{
    add_filter( \'query\', function( $sql ) use ( $post )
    {
        global $wpdb;
        $find = "SELECT meta_key
                 FROM $wpdb->postmeta
                 GROUP BY meta_key 
                 HAVING meta_key NOT LIKE \'\\\\\\_%\'
                 ORDER BY meta_key 
                 LIMIT 30";
        if(    preg_replace( \'/\\s+/\', \' \', $sql ) === preg_replace( \'/\\s+/\', \' \', $find )
            && $post instanceof WP_Post  
        ) {
            $post_id = (int) $post->ID;
            $sql  = "SELECT meta_key
                     FROM $wpdb->postmeta
                     WHERE post_id = {$post_id}
                     GROUP BY meta_key
                     HAVING meta_key NOT LIKE \'\\\\\\_%\'
                     ORDER BY meta_key
                     LIMIT 30";
        }
        return $sql;
    } );                                                            
} );
这里我们使用add_meta_boxes_{$post_type} 钩子,在哪里$post_type = \'post\'.

这里我们交换了整个查询,但我们也可以调整它以支持动态限制。

希望您可以根据自己的需要进行调整。

更新:

此可能较慢的SQL核心查询现已在WP版本4.3中进行了调整,从

SELECT meta_key 
FROM wp_postmeta 
GROUP BY meta_key 
HAVING meta_key NOT LIKE \'\\\\_%\' 
ORDER BY meta_key 
LIMIT 30
收件人:

SELECT DISTINCT meta_key
FROM wp_postmeta
WHERE meta_key NOT BETWEEN \'_\' AND \'_z\'
HAVING meta_key NOT LIKE \'\\_%\'
ORDER BY meta_key
LIMIT 30;
查看核心票据#24498 了解更多信息。

SO网友:Dan K

如果浏览函数的源代码,您会发现:

$keys = apply_filters( \'postmeta_form_keys\', null, $post );
if ( null === $keys ) {
    ...      
}
使用postmeta_form_keys 钩子您可以手动指定键,以避免完全调用此低效查询:

add_filter(\'postmeta_form_keys\', function(){
    return [\'your_meta_key\'];
});

SO网友:prosti

你能试试这个吗。这不是一个解决方案,而是一个临时解决方案。

// disable big slowdown http://wordpress.stackexchange.com/questions/187612/admin-very-slow-edit-page-caused-by-core-meta-query
function dj_limit_postmeta( $string, $post ) {
    return array(null);
}
add_filter( \'postmeta_form_keys\', \'dj_limit_postmeta\', 10, 3 );

结束

相关推荐

当WordPress URL和站点URL不同时,如何正确请求admin-ajax.php?

当site\\u url()和home\\u url()不同时,请求应如何定向到admin ajax。php(前端和管理)?UsingA公司。admin_url(\'wp-admin/admin-ajax.php\') 球体。home_url(\'wp-admin/admin-ajax.php\')通常使用方法A。然而,对于某些网站,此请求在前端给出错误404。当wordpress位于home\\u url()的某个子目录中时,方法B不起作用。当site_url()和home_url()不同时,有什么方法