加载自定义帖子类型管理页面时出现问题

时间:2014-09-04 作者:paper_robots

我有一个自定义的帖子类型“属性”。我有大约11000个条目,每个属性有大约400个ACF自定义字段。当我转到仪表板属性页编辑它们时。。我得到一个空白屏幕。我想这可能是ACF字段的原因,但为什么需要在列表页上加载这些字段呢?

我分离了用于测试的自定义字段(我没有从数据库中删除自定义字段),它仍然给了我一个空白页。

如果我将CPT中的帖子数量减少到只有几千个。。。它起作用了。那么,当您在仪表板中加载列表页面时,实际加载的是什么?我认为这只是帖子本身,而不是元数据。这是正确的吗?如果是分页,那么有多少帖子又有什么关系呢?我想是因为有太多的帖子包含了太多的Posteta数据,以至于达到了内存限制,但即使是在一个有8GB ram的专用服务器上?

我并没有运行太多的插件,只有不到10个,而且除了ACF之外,没有一个是重载的。有什么想法?这快把我逼疯了。

编辑:我在列表页面上发现,无论出于什么原因,它都会尝试加载所有的Posteta,即使它没有显示在这里。这导致它对那么多属性使用了太多内存。我能阻止吗?

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

WordPress加载当前查询中所有帖子的元数据,以避免每次使用帖子元数据时执行SQL查询。几乎在所有情况下,这都会带来巨大的性能优势。

这个预缓存可以被禁用(我将在一分钟内进行讨论),但不幸的是,对每个帖子存储400个帖子元字段,无论这个缓存是否被禁用,都会导致性能问题。如果启用预缓存,您将看到当前看到的内存问题。如果禁用预缓存,则在使用这些后期元字段(例如,在主题中)时,将看到执行的SQL查询数量增加。

因此,请继续禁用此预缓存。它通过update_post_meta_cache 查询变量,设置为true 默认情况下,用于所有post查询。要禁用它,您需要针对感兴趣的查询并将其设置为false。示例:

function wpse_160203( WP_Query $wp_query ) {
    if ( \'property\' == $wp_query->get( \'post_type\' ) ) {
        $wp_query->set( \'update_post_meta_cache\', false );
    }
}
if ( is_admin() ) {
    add_action( \'pre_get_posts\', \'wpse_160203\' );
}
这将阻止对property 管理区域中的帖子类型。如果要对前端执行相同操作,只需删除is_admin() 有条件的,但请记住,如果您实际开始使用这400个post元字段,您将看到SQL查询的急剧增加,并且内存使用率可能不会有太大的下降。

结束

相关推荐

Limit popular posts by days

我正在使用这个get\\u posts数组按评论检索前15个热门帖子。问题是,它显示了所有那些在博客中添加的评论很高的帖子。因此,列表有时会发生变化,但大部分时间保持不变。如何限制/显示过去7天的帖子?这将显示上周评论最多的帖子。谢谢这是我的代码:global $post; $args = array( \'orderby\' => \'comment_count\', \'order\' => \'DESC\' , \'numberposts\' =