- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个自定义的层次分类法,最近我导入了一堆(15k+)带有自定义字段(术语元)的术语。
从那时起,管理页面,即分类法添加/编辑页面和 CPT(分配了该分类法)页面变得异常缓慢。
我将问题追溯到 update_meta_cache 函数,该函数在每次加载时都会在这些页面上触发。它每次都会从数据库中选择所有术语,这是查询监视器输出的屏幕截图:/image/RDfK5.jpg
不过,“扁平”(非分层)分类法不会发生这种情况。我有另一个包含 22 万多个术语的平面分类法,它不会减慢任何速度。知道为什么 WP 会更新每个页面加载的所有术语的元缓存吗?有没有一种巧妙的方法来控制/禁用这种行为?
更新我知道这是一件可怕的事情,但我继续编辑了/wp-includes/taxonomy.php - 我注释掉了第 1370 行,即:
return update_meta_cache( 'term', $term_ids );
现在管理中的分类页面要快得多 - /image/ggVTW.jpg
只是为了比较 - 平面分类页面要快得多 - /image/3S2AB.jpg - 但 2 秒左右的时间就足够了。
但是,CTP 页面仍然非常慢 - /image/BkwGc.jpg - 尽管数据库时间现在很小。有什么想法吗?为什么我的页面生成时间仍然是 18 秒?我的意思是,差异会导致什么?
最佳答案
是的,这是分层分类法的一个严重的性能问题。它是已知的并且应该在某个时候修复,但这取决于 WP 如何处理缓存。
问题不在于 WP 查询所有术语(正如您所说,在平面分层分类法上,它是单个查询),而是它需要对分层分类法上的每个术语进行查询为了得到“ child ”这个词。在第一种情况下,这种行为很巧妙,因为 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 ,但似乎没有为此开放的票...也许您可以用您的数据打开一张票。
关于wordpress - 分层分类和 update_meta_cache 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40746942/
我有一个自定义的层次分类法,最近我导入了一堆(15k+)带有自定义字段(术语元)的术语。 从那时起,管理页面,即分类法添加/编辑页面和 CPT(分配了该分类法)页面变得异常缓慢。 我将问题追溯到 up
我是一名优秀的程序员,十分优秀!