前天分享了《通过七牛云存储 缓存加速Gravatar头像,解决被墙问题》,不过这昨天发现通过七牛云存储缓存加速Gravatar 头像,会导致头像图片所在的路径 url 参数失效,通过参数来定义图片宽高大小没戏了。这样七牛加载的头像图片一律是默认的80x80大小,虽然在CSS 定义下看起来没有区别,但无缘无故加载多了1kb 左右的体积实在不爽。苛刻的Jeff 决定解决这个问题。
问题呈现
如果你熟悉get_avatar函数的使用,你可能明白下面我所说的内容。不熟悉的也没关系,可以先阅读一下WordPress 官方文档,Jeff 尽量用简单的文字说明:
在WordPress 中,调用Gravatar 头像后的图片路径及显示效果如下:
注意到上面的路径的一些参数,如 s= 、d=、r=G。这些参数的作用分别是:
?s=(或?size=)表示为图像指定一个 长宽大小,值为整数,设定后便会返回一个指定大小(长宽一样)的图像。
?d= 表示缺省头像——当由于头像分级或未设置头像而无法显示时,可以设置一个缺省头像。
?r= 表示头像分级。注册Gravatar 头像还记得有个分级的选项吧?对于国内来几乎没用,r=G 对应是“ 头像适合在所有网站的所有受众类型”。
对于绝大多数WordPress 站点来说,只有?s=参数有用,其余的都没什么用处。下面是官方路径的Gravatar 头像不同size 的图片,依次是?s=40、60、80、100(你可以审查元素看看):
但是,通过《通过七牛云存储 缓存加速Gravatar头像,解决被墙问题》一文设置后,图片路径url 参数已经失效。
如下面的来自七牛地址:
http://gravatar.qiniudn.com/avatar/e069fb6ca153e3c272bc85beb6f85b49?s=40
但其实际大小是80x80:
七牛缓存了Gravatar 服务器的图片,却复制不了他们的参数调用设置。80x80的大小在实际运用中虽然可以通过CSS 控制宽高,但不免多加载了1~2KB 的体积。作为追求完美的 Jeff ,实在不能忍受。
解决方法:
在Jeff 发现这个问题时候,想到了两个解决思路(以下以调用40x40大小为例子):
一、利用七牛云存储本身带有的图片处理的参数,迎合WordPress 的这个 ?s 参数。但悲催的是,七牛不支持 ?s 参数(如果我要设置,必须分隔符为?,样式名称为 s=40,七牛两个都不支持)。叉掉。
二、通过修改修改get_avatar函数,将参数样式由 ?s 改为七牛支持的分隔符样式(如英文中划线 - )。
查阅WordPress 官方文档,得知 get_avatar
函数在wp-includes/pluggable.php下,打开该文件,从1653 行开始是这么一段代码(Jeff加上了注释):
if ( !empty($email) ) {
$out = "$host/avatar/";
$out .= $email_hash;
$out .= '?s='.$size;// s= 大小
$out .= '&d=' . urlencode( $default );//d= 缺省头像
$rating = get_option('avatar_rating');
if ( !empty( $rating ) )
$out .= "&r={$rating}";// r=分级
注意到 第1656、1657、1661 行(上诉代码则对应第4、5、9行),分别对应 s= 、d=、r=G 参数。
那么,我们只需要注释掉第1657、1661 行(对应上诉代码则对应第5、9行),将第1656(对应上面第4)行修改为
$out .= '-'.$size;
注意是英文中划线 -,你可以使用七牛支持的其他分隔符
完整修改后的代码如下:
if ( !empty($email) ) {
$out = "$host/avatar/";
$out .= $email_hash;
$out .= '-'.$size;// 有修改
//$out .= '&d=' . urlencode( $default );//d= 缺省头像
$rating = get_option('avatar_rating');
if ( !empty( $rating ) )
//$out .= "&r={$rating}";// r=分级
接下来还需要在七牛云存储后台新建图片样式,如Jeff 的设置如下:
然后就解决了!
查看一下,40x40的路径已经是http://gravatar.qiniudn.com/avatar/e069fb6ca153e3c272bc85beb6f85b49-40了,成功!
因为技术有限,只想到修改WordPress 源代码的方法。如果你有通过添加过滤器(filter)的方法,还望不吝赐教!
后记
就为了这1~2KB 的多余体积,Jeff 就去折腾那么久,真是作孽啊~~~谁叫我那么较真呢?
通过这个,进一步认识了Gravatar的运用,也不错!
话说,《通过七牛云存储 缓存加速Gravatar头像,解决被墙问题》该文当时发表在微博时候 @七牛云存储 了一下 ,后来居然被七牛的CEO @许世伟 转发并带来不少流量,Jeff 那个激动啊!咱这破技术也能被大神小小赏识,也不枉这般折腾了!