我有一个自定义的分层分类法,我最近导入了一组(15k +)的自定义字段(术语元).
从那以后,管理页面,即分类法添加/编辑页面和CPT(分配了该分类法)页面变得异常缓慢.
我将问题跟踪到update_meta_cache函数,该函数在每次加载时都会在这些页面上触发.它每次都从数据库中选择所有术语,这里是Query Monitor输出的屏幕截图:http://imgur.com/a/FX188
但是,"平面"(非分层)分类法不会发生这种情况.我有另一个平面分类标准,有220k +条款,并没有减慢任何速度.知道为什么WP会在每个页面加载时更新所有术语的元缓存吗?是否有一种巧妙的方法来控制/禁用此行为?
更新我知道这是一件非常糟糕的事情,但我继续编辑/wp-includes/taxonomy.php - 我注释掉第1370行:
return update_meta_cache( 'term', $term_ids );
Run Code Online (Sandbox Code Playgroud)
现在,admin中的分类页面更快 - http://imgur.com/a/7MJSg
只是为了比较 - 平面分类页面更快 - http://imgur.com/a/lcUOM - 但是2秒的时间就足够了.
但是,CTP页面仍然非常慢 - http://imgur.com/a/tFCAr - 即使DB时间很小.什么给出了什么想法?为什么我还有18秒的页面生成时间?我的意思是,有什么不同之处?
是的,这是分层分类法的严重性能问题.它是已知的,应该在某些时候修复,但这是WP处理缓存的方式.
问题不在于WP查询所有术语(在你所说的平面分层分类中,它只是一个查询),而是需要对一个分类分类法中的每个术语进行查询以获得术语子项.在第一种情况下,这种行为很简洁,因为WP不需要在每次get_term调用时查询,但在这种情况下会产生灾难性的后果.
在这种情况下有三种可能的解决方案:
使用缓存插件 - 正确配置的缓存插件(如W3 Total Cache)将有助于不通过"永久"缓存来缓存每个页面加载的分类.这并不完美,但这通常是我采用的解决方案.
WP_Query使用缓存参数手动禁用每个请求的缓存:
'update_post_meta_cache' => false,
'update_post_term_cache' => false
Run Code Online (Sandbox Code Playgroud)
这将主要用于前端查询,所以我认为这不是一个很好的解决方案.
不要使用分层分类法:)
不,严重.如果您有这么多术语,您应该寻找其他解决方案来处理您的分类.例如,Woocommerce使用一种智能技巧来绕过产品属性的性能问题:所有0级术语都是分类法,它们与特殊类一起放在一起.这需要一些工作来建立,但它是一个很好的解决方案.
我在Wordpress核心跟踪器中寻找了一些关于这个性能问题的参考,但似乎没有开放的票据......也许你可以用你的数据打开一个.
| 归档时间: |
|
| 查看次数: |
809 次 |
| 最近记录: |