分享几个WordPress本地缓存gravatar评论头像的方案

由于 GFW 的关系,使用 gravatar 的博客评论头像经常会出现“图裂特效”,这肯定是很多站长小伙伴都遇到过的困扰。网络上也很多教程,通过更换 avatar 的来源,来解决图裂的问题。确实可以解决图裂困扰,但是这头像的加载速度确实还有待提高,下面本文就分享 3 种将头像缓存到本地的方法。

分享几个WordPress本地缓存gravatar评论头像的方案

一、代码方案

代码缓存方案来自 Willin Kan 大师,内容摘自 WP 大学,以下是具体做法:

①、建立缓存目录

在 wp-content 的同級目录建立一个文件夹,命名为 avatar ,设置该文件夹的权限为 0755 (如果 0755 不行,就试一下 0777)。

②、设置默认头像

准备一张大小适合的默认头像,命名为”default.jpg” ,放在 avatar 文件夹里面。

③、添加缓存代码

将下面的代码复制到模板的 functions.php 文件中即可:

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');

二、插件方案

前不久,知更鸟博主鸟哥在 begin 群里分享了一款将 gavatar 头像缓存到本地的插件,个人试用了下,发现还不错,这款插件的名字就叫:nix-gravatar-cache。貌似原版插件有点问题,鸟哥还 DIY 了一把。

如果,发现装了原版的有问题,那么就下载鸟哥改过的版本吧!

地址一点击下载

本站提供的下载内容版权归本站所有。转载 必须 注明出处!

* 标有 “转载” 字样的文章,内容版权归原作者所有。


三、Nginx 方案

我在测试这个插件的过程中,看了下生效后的头像路径,突然灵感一现:这缓存完全可以通过 Nginx 的 proxy 反向代理来缓存到本地啊!就类似于方向代理谷歌,解决被墙问题。

说干就干,经过折腾测试,发现果然好用!下面分享一下具体做法。

①、编译 Nginx

如果你之前已经实操了过张戈博客分享的 Nginx 缓存教程,相信这一步就可以忽略。

Nginx 反向代理缓存需要集成 ngx_cache_purge 模块,如果没有,则需要重新编译 Nginx,具体做法请参考张戈博客之前分享的文章:

为网站开启 Nginx 缓存加速,支持 html 伪静态页面》之代理模式,新增该缓存模块,并在 http 上下文模块中添加 proxy 缓存规则,比如:

proxy_connect_timeout 5;
proxy_read_timeout 60;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 64k;
proxy_busy_buffers_size 128k;
proxy_temp_file_write_size 128k;
proxy_cache_path /tmp/cache/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=30d max_size=5g;
proxy_temp_path /tmp/cache/proxy_cache/temp;

②、Nginx 配置

在网站现有规则中加入如下规则,反向代理 gavatar 并缓存到本地:

location /avatar {
    proxy_pass http://cn.gravatar.com;
    proxy_redirect off;
    proxy_set_header Host cn.gravatar.com;
    proxy_cache cache_one;
    proxy_cache_valid 200 302 304 365d;
    proxy_cache_valid 301 1d;
    proxy_cache_valid any 1m;
    add_header Images-Cache "$upstream_cache_status from $host";
    add_header Pragma public;
    add_header Cache-Control "public, must-revalidate, proxy-revalidate";
    access_log off; log_not_found off; expires max;
}

③、PHP 代码

在主题目录下的 functions.php 中插入如下代码:

//更改 gavatar 来源
function mytheme_get_avatar($avatar) {
    $avatar = str_replace(array("www.gravatar.com","0.gravatar.com","1.gravatar.com","2.gravatar.com"),"zhang.ge",$avatar); //请修改为自己的首页域名
    return $avatar;
}
add_filter( 'get_avatar', 'mytheme_get_avatar', 10, 3 );

即可将 WordPress 头像地址更改成自己的域名,因为头像地址二级目录字段是/avatar/,所以会匹配到我们在上一步 Nginx 新增的反向代理规则,从而从 cn.gravatar.com 拉取头像并缓存到服务器本地。

很明显这个方法支持各种建站程序(需要修改网站代码),比 PHP 代码或插件的逼格、效率都更高!而且还不会出现外部 url 地址了!

四、折腾拓展

上一篇文章,张戈博客分享了目前在用的优化方案,里面有一条是建议静态资源使用二级域名,并拒绝 cookies 的写入。所以本文还能继续拓展折腾一下:将头像地址改成二级域名。比如右键查看张戈博客评论头像,可以发现已经变成 res.zgboke.com 了。其实就是新增一个 res.zgboke.com 的 server 模块而已,非常简单,感兴趣的朋友可以自己折腾一下,本文就不多做说明了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇