WordPress 程序优化:关闭 Google 字体、加速头像与数据库清理指南

WordPress 程序优化封面:Google 字体、Gravatar 与 LazyLoad

前面的文章解决了带宽、服务器和缓存三个层面,这一篇讲性能优化的最后一块拼图:程序优化。带宽再大、服务器再快、缓存再完善,如果程序本身写得臃肿、加载了一堆用不上的资源,前面做的努力都会被拖后腿。程序优化做的事情很纯粹:把 WordPress 运行时多余的请求、多余的数据库查询、多余的代码全部砍掉。这篇文章从关闭 Google 字体、加速 Gravatar 头像讲起,覆盖 PHP 代码、图片、数据库、响应头五个方面,每一处都给出可以直接用的代码或插件方案。

程序优化示意图:小黑把多余插件和外部请求丢进回收站,让 WordPress 轻装上阵

关闭 Google 字体

Google 字体绝对是拖慢国内 WordPress 浏览速度的重要原因之一。WordPress 后台和很多主题默认会从 Google Fonts 加载 Open Sans 字体,而 Google 的服务在国内访问很不稳定,字体文件迟迟加载不出来,页面就一直卡在那等它超时。对国内用户来说,这个字体请求带来的负面影响远大于它本身的价值。

解决办法很简单:在主题的 functions.php 中把 Open Sans 注销掉。将下面的代码添加到主题函数文件里,WordPress 就不会再加载 Google 字体:

function remove_open_sans() {
    wp_deregister_style( 'open-sans' );
    wp_register_style( 'open-sans', false );
    wp_enqueue_style('open-sans','');
}
add_action( 'init', 'remove_open_sans' );

这段代码的原理是先注销默认注册的 open-sans 样式,再注册一个空样式替换掉它,最后入队时加载的就是空资源,浏览器自然就不会去请求 Google 字体了。如果你用的主题还加载了其他 Google 字体(比如 Roboto、Lato),也可以用同样的思路把对应的 handle 注销掉,或者在主题设置里换成系统字体栈。

加速 Gravatar 头像

Gravatar 是 WordPress 评论头像的默认服务,但它的主域名在国内同样被屏蔽,头像加载经常超时,评论区转半天出不来。解决思路有两个方向:一是改用 https 的 Gravatar 域名,二是更彻底的做法,把头像缓存到本地服务器。

将下面的代码加入到主题的 functions.php 中,然后在网站根目录创建一个 avatar 目录,赋予 PHP 可写权限,再上传一张 default.jpg 作为默认头像:

function my_avatar($avatar) {
  $tmp = strpos($avatar, 'http');
  $g = substr($avatar, $tmp, strpos($avatar, "'", $tmp) - $tmp);
  $tmp = strpos($g, 'avatar/') + 7;
  $f = substr($g, $tmp, strpos($g, "?", $tmp) - $tmp);
  $w = get_bloginfo('wpurl');
  $e = ABSPATH .'avatar/'. $f .'.jpg';
  $t = 1209600; //设定时间为14天,单位为秒
  if ( !is_file($e) || (time() - filemtime($e)) > $t ) { //头像不存在或时间超过14天,重新获取
    copy(htmlspecialchars_decode($g), $e);
  } else  $avatar = strtr($avatar, array($g => $w.'/avatar/'.$f.'.jpg'));
  if (filesize($e) < 500) copy($w.'/avatar/default.jpg', $e);
  return $avatar;
}
add_filter('get_avatar', 'my_avatar');

这段代码通过 get_avatar 过滤器拦截头像请求:第一次访问时从 Gravatar 拉取图片存到本地 avatar 目录,之后 14 天内直接读取本地文件,不再请求 Gravatar。如果下载失败或文件过小(小于 500 字节),就回退到默认头像。这样评论区头像秒开,完全不依赖外网服务。

加速 PHP 代码

使用最新版的 PHP

PHP 的版本对性能影响极大。目前线上还在跑的 PHP 版本从 5.4、5.5 到最新的 8.x 都有,而自 PHP 7 开始性能有了大幅度的提升,同样的代码在新版本上执行速度快了不止一倍。如果你还在用旧版 PHP,强烈建议升级到当前主流的新版本。需要注意的是,部分老插件不兼容新版本 PHP,升级前要确认你使用的插件都兼容,避免升级后网站报错。

控制插件、主题的数量

插件数量直接决定程序的臃肿程度。每激活一个插件,WordPress 就要多执行一段代码、多占用一份资源,插件越多运行效率越低。装插件前先问自己三个问题:这个功能真的需要吗?能不能用更轻量的方式实现?有没有评分更高的同类插件可以替换?对于不用的主题和插件,直接删除,而不是只停用。停用只是不加载,文件还占着磁盘,WordPress 对目录的扫描成本并不会减少。

优化主题

主题的选择和优化同样重要。尽量选择框架更小、引用更少的主题,用更少的代码实现更多的功能。对于引用文件特别多的主题,可以砍掉一部分用处不大的引用;实在无法去除的,确保每个 CSS/JS 文件都经过压缩(minify),去掉代码中无用的注释和空格,缩小文件体积。还可以借助 Better WordPress Minify 之类的插件,把多个 CSS/JS 文件合并成一个,减少浏览器发起的请求数量。

另外,主题里的函数也值得留意:能用缓存数据的函数就不要直接用数据库查询。比如获取文章分类时,get_the_terms 的结果会被缓存,而 wp_get_object_terms 每次调用都会发起数据库查询,同样的功能优先用前者。如果一定要直接查数据库,记得把查询结果通过 WordPress Object Cache 函数缓存起来,避免同一页面上重复查询同样的数据。

最后,精简主题的结构本身也有帮助:去掉一些无用的 HTML 标签,减少页面代码量,加载速度自然会提升。站内关于移除未使用 CSS 的文章提供了更系统的清理思路,可以对照着做一轮主题瘦身。

优化图片:LazyLoad 懒加载

这一节的图片优化和前面讲过的压缩不同,重点在加载时机。为博客加入 LazyLoad(懒加载)后,页面不会在一开始就加载所有图片,而是等用户滚动到图片位置时才加载,把图片的请求压力分散到整个浏览过程中。用户没浏览到的图片根本不加载,既节省了服务器带宽和流量,也减少了初始请求数量,首屏加载速度明显提升。

最省事的做法是使用 ROCKET LAZYLOAD 插件。到插件目录下载并启用后,可以分别设置图片、iFrame 和 YouTube 视频的懒加载:

ROCKET LAZYLOAD 插件设置图片和视频懒加载

开启后页面里的图片会先显示占位,滚动到可视区域时才真正加载,文章配图多的站点收益尤其明显。

优化数据库

WordPress 有修订版本的功能:每次保存文章都会生成一个修订版本,长期积累下来数据库里全是冗余数据,拖慢查询速度。清理这些垃圾数据,是数据库优化最直接的一步。

推荐使用 WP-Optimize 插件。到插件目录下载、安装、启用后,打开插件页面,勾选要优化的项目,点击 Run All Selected Optimizations 按钮即可一键清理:

WP-Optimize 插件勾选优化项并一键执行

除了清理修订版本,插件还能清理垃圾评论、过期 transient 等数据库垃圾,优化数据表结构。数据库瘦身之后,WordPress 的查询速度会跟着变快。如果网站已经出现数据库相关的问题,站内的数据库连接错误排查指南也可以参考。

开启 ETag 与响应头

开启 ETag 后,浏览器会通过 ETag 值自动判断内容是否更新:如果内容没变,就继续使用本地缓存,不再重新下载;只有内容真正变化时才重新获取。这样可以有效减少网页的重复传输,提升加载速度。

在 WordPress 中,可以通过安装 Smart WP 插件来开启 ETag。插件安装完成后进入设置页面,勾选开启 ETag 的选项即可:

Smart WP 插件设置页开启 ETag

这个插件除了控制 ETag,还可以设置 Last-Modified 响应头,告诉浏览器内容最后修改的时间:

Smart WP 插件设置 Last-Modified 响应头

以及 Cache-Control 响应头,控制浏览器和 CDN 对页面的缓存策略,两者配合使用效果最佳:

Smart WP 插件设置 Cache-Control 响应头

通过这三个响应头的组合设置,浏览器对博客缓存的利用率会大幅提升:内容没变就不重新请求,变了才拉取新数据,配合前面的 expires 头信息和缓存插件,加载体验会更顺滑。

加速浏览:引导用户用好浏览器

最后一个容易被忽略的点:浏览器本身。鼓励和提醒你的用户使用最新版的高性能浏览器,比如 Chrome、Firefox、Opera。这些浏览器的高性能渲染引擎比老旧的 IE 有更好的表现,同样的网页在新浏览器上加载和渲染都快得多,算是间接实现了对 WordPress 的加速。在网站里放一句"建议使用最新版 Chrome 或 Firefox 浏览"的提示,成本几乎为零,对部分访客的体验提升却很实在。

总结

程序优化是把前面所有提速手段的成果保住的最后一层:关掉 Google 字体和 Gravatar 的外部依赖,国内访问不再被卡;升级 PHP、精简插件主题、用缓存函数替代直接查询,让程序本身跑得更轻;LazyLoad 把图片请求分散到浏览过程中;WP-Optimize 清掉数据库垃圾;ETag 和响应头让浏览器缓存利用率最大化。程序层的每一项都不复杂,组合起来的效果却很可观。做完这轮优化,WordPress 提速的完整链路——带宽、服务器、缓存、程序——就全部打通了。如果还想从整体上规划提速路线,站内的 WordPress 速度优化 7 个实用技巧给了全局视角,WordPress 维护检查清单则适合把优化成果固化到日常维护里,配合 移除未使用 CSS 的方法给主题再做一次瘦身,整套提速方案就完整了。

常见问题解答(FAQ)

关闭 Google 字体后网站会变丑吗?

不会。关闭的是 Open Sans 等 Google 字体,页面会回退到浏览器默认字体栈渲染,对国内用户来说反而更快。如果主题本身对字体有要求,可以在主题设置里替换为本地字体。

Gravatar 本地缓存代码需要手动创建目录吗?

需要。代码里假设根目录存在可写的 avatar 目录,目录不存在或没有写权限时头像缓存会失败。创建目录后记得把权限设为 PHP 可写,再放一张 default.jpg 作回退头像。

升级 PHP 前要注意什么?

先确认所有插件和主题兼容新版 PHP,最好在测试环境先升级验证一遍。升级后逐个页面检查,重点看表单提交、文件上传这类功能是否正常。

停用的插件可以直接删吗?

可以,但先确认停用后网站一切正常,且插件里没有你需要保留的设置。删除插件会同时删掉它的设置数据,想找回就麻烦了。

LazyLoad 会影响 SEO 吗?

主流懒加载插件都使用符合规范的占位和加载方式,搜索引擎可以正常抓取图片。开启后记得检查图片的 alt 文本完整,对 SEO 没有负面影响。

ETag 和 Cache-Control 都要开吗?

建议一起开。ETag 负责判断内容是否变化,Cache-Control 控制缓存策略,两者配合能最大化浏览器缓存利用率。Smart WP 插件里三个选项可以同时勾选。

从一个具体问题开始

浏览 213 篇中文 WordPress 指南,找到可以立刻执行的答案。

浏览全部教程 →