分层分类和update_meta_cache函数

时间:2016-11-22 16:26:49

标签: wordpress

我有自定义的分层分类法,最近我用自定义字段(术语元)导入了一堆(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 );

现在,admin中的分类页面更快 - http://imgur.com/a/7MJSg

只是为了比较 - 平面分类页面更快 - http://imgur.com/a/lcUOM - 但是2秒的时间就足够了。

然而,CTP页面仍然非常慢 - http://imgur.com/a/tFCAr - 即使DB时间很小。什么给出了什么想法?为什么我还有18秒的页面生成时间?我的意思是,有什么不同之处?

1 个答案:

答案 0 :(得分:5)

是的,这是分层分类法的严重性能问题。它是已知的,应该在某个时候修复,但这就是WP如何处理缓存。

问题不在于WP查询所有术语(如你所说的那样是一个单独的分层分类,它只是一个查询),而是需要在一个分层分类中对每个术语进行查询为了得到孩子这个词。在第一种情况下,这种行为很简洁,因为WP不需要在每次get_term次调用时进行查询,但在这种情况下会产生灾难性的后果。

在这种情况下有三种可能的解决方案:

  • 使用缓存插件 - 正确配置的缓存插件(如W3 Total Cache)将有助于不通过拥有“永久”缓存来缓存每个页面加载的分类。这并不完美,但这通常是我采用的解决方案。

  • 使用缓存参数手动禁用每个WP_Query请求的缓存:

    'update_post_meta_cache' => false,
    'update_post_term_cache' => false
    

    这主要有助于前端查询,所以我认为这不是一个很好的解决方案。

  • 不要使用分层分类法:)左,严重。如果您有这么多术语,您应该寻找其他解决方案来处理您的分类。例如,Woocommerce使用一种智能技巧来绕过产品属性的性能问题:所有0级术语都是分类法,它们与特殊类一起放在一起。这要求建立一些工作,但这是一个很好的解决方案。

我找了一些关于这个性能问题的引用in the Wordpress core tracker,但似乎没有开放的票证......也许你可以用你的数据打开一个。