公告:123目录网为广大站长提供免费收录网站服务,我们将免费进行到底,如需快审服务(10元/站)请联系站长QQ,可自助充值发布。

点击这里在线咨询客服
新站提交
  • 网站:315
  • 待审:0
  • 小程序:12
  • 文章:35791
  • 会员:69

WordPress 6.0 对性能提升还是做了很多工作的,比如昨天文章介绍的新增了批量添加、设置和删除一组缓存的函数,对分类模式下各种查询也进行提升。

分类查询缓存改进

从 WordPress 4.6 版开始,WP_Term_Query的查询就可以缓存,WordPress 6.0 改进了这些缓存的准备和处理方式。

移除缓存过期事件

WordPress 6.0 之前,如果使用 Memcached 这类外部缓存,分类模式查询的缓存最长24小时,现在这个限制被移除了,所以如果缓存没有失效,那么分类模式查询就会被缓存更长的时间,这样会显著提高站点性能。

查询缓存只缓存 Term ID

分类模式查询的缓存修改成只缓存 Term ID 而不是整个 Term 对象,这样存储在缓存中的对象将会更加的小,如果使用 Memcached 这类外部缓存,可以更省空间。

因为只缓存 Term ID,那么下次从缓存中获取所有 ID 的时候,WordPress 会调用_prime_term_cache函数,检测对应 Term 是不是在缓存中,如果不在,它会一次把所有 Term 加载到缓存中,如果已经在了,则不会重复加载。

这些改进都会对性能的提升有好处,因为 WordPress 很多函数的调用都会多次请求一个 Term 的数据,比如标签页,就会一开始通过 get_term_by 函数准备好 Term 缓存,还有其他的函数比如get_the_terms 也会在内存中准备好 Term 缓存,所以在大多数情况下,这些优化都会减少分类模式相关数据表的查询。

改进查询缓存 key 生成规则

如上所述,现在所有查询只获取 Term ID,所以很多相似的查询,它们缓存的内容都是相同的,比如使用get_terms 去获取所有分类信息,第一次获取 slug 字段,第二次获取名称,两次查询应该会命中相同的缓存。

另外对传递给 WP_Term_Query的查询参数的处理也进行了优化,比如 slug 字段可能是字符串,也可能是数组,现在统一转换成数组,这样无论你传递什么类型的参数,缓存的 keys 相同的可能性更高,缓存命中率也提高了。

提高导航菜单的性能

在获取导航菜单的 wp_get_nav_menu_items 函数中,首先使用简单的 taxonomyquery 代替get_objects_in_term函数,这个替换首先可以把两次数据库查询降低到一次,这样每次获取菜单都能节省一次 SQL 请求,并且还能保持数据的一致性。

此外如果菜单中含有分类和文章的数据,wp_get_nav_menu_items 会改成使用 _prime_term_cache_prime_post_cache 来准备 term 和 post 的缓存,这两个函数的使用会使得获取菜单的数据库请求变得更少,效率更高。

term_exists 使用 get_terms 处理

term_exists函数内部从使用非缓存的数据库查询转换成使用get_terms(WP_Term_Query) 来处理,这个函数是最后一个对terms数据库表执行原始数据库查询的函数,改用 get_terms函数有下面这些好处:

  • 保持和其他核心函数一致,如get_term_by
  • 支持对结果过滤的能力
  • get_terms结果是缓存的

term_exists本来适用于在写入数据库之前的数据重复性检测,然后这个函数被很多插件和主题开发者使用了,这样就造成了站点很多地方有未缓存和未过滤的查询结果。

现在term_exists改用 get_terms处理之后,数据是缓存的,如果你还需要获取未缓存的结果,有两个方法:

1. 使用 term_exists_default_query_args filter

$callback = function ( $args ) {
   $args['cache_domain'] = microtime();
};
add_filter( 'term_exists_default_query_args',  $callback );
$check = term_exists( 123, 'category' );
remove_filter( 'term_exists_default_query_args',  $callback );

2. wp_suspend_cache_invalidation

wp_suspend_cache_invalidation( true );
$check = term_exists( 123, 'category' );
wp_suspend_cache_invalidation( false );

WordPress Taxonomy Cache Fix

但是经过测试,WordPress 6.0 升级还造成了 child_of 参数的失效,我写了一个小插件修复了该问题。

标签:wordpress教学

下一篇:【wordpress教学】WordPress 6.0 扩展了修改内容中图片标签的能力

上一篇:【wordpress教学】WPJAM Basic 6.0 详细更新说明

相关文章

  575

注册时间:

网站:1 个   小程序:3 个  文章:12 篇

  • 315

    网站

  • 12

    小程序

  • 35791

    文章

  • 69

    会员

赶快注册账号,推广您的网站吧!
最新入驻小程序

数独大挑战2018-06-03

数独一种数学游戏,玩家需要根据9

答题星2018-06-03

您可以通过答题星轻松地创建试卷

全阶人生考试2018-06-03

各种考试题,题库,初中,高中,大学四六

运动步数有氧达人2018-06-03

记录运动步数,积累氧气值。还可偷

每日养生app2018-06-03

每日养生,天天健康

体育训练成绩评定2018-06-03

通用课目体育训练成绩评定