解决七牛云存储缓存加速Gravatar 头像图片路径url 参数失效的问题

解决七牛云存储缓存加速Gravatar 头像图片路径url 参数失效的问题

前天分享了《通过七牛云存储 缓存加速Gravatar头像,解决被墙问题》,不过这昨天发现通过七牛云存储缓存加速Gravatar 头像,会导致头像图片所在的路径 url 参数失效,通过参数来定义图片宽高大小没戏了。这样七牛加载的头像图片一律是默认的80x80大小,虽然在CSS 定义下看起来没有区别,但无缘无故加载多了1kb 左右的体积实在不爽。苛刻的Jeff 决定解决这个问题。

问题呈现

如果你熟悉get_avatar函数的使用,你可能明白下面我所说的内容。不熟悉的也没关系,可以先阅读一下WordPress 官方文档,Jeff 尽量用简单的文字说明:

在WordPress 中,调用Gravatar 头像后的图片路径及显示效果如下:

http://www.gravatar.com/avatar/e069fb6ca153e3c272bc85beb6f85b49?s=40&d=http%3A%2F%2Fwww.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb652
3536%3Fs%3D40&r=G

注意到上面的路径的一些参数,如 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:   ,无论你如何修改?s 的参数。

七牛缓存了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 那个激动啊!咱这破技术也能被大神小小赏识,也不枉这般折腾了!

评分:
当前平均分 3.83 (78%) - 6 个投票
云左主机 广告
17 条 评论
  1. 最后的代码,在新版 WordPress 里好像已经没有了!没有找到呀! :cry:

    5月前 回复
  2. 头像尺寸不能大于80比较郁闷!

    6月前 回复
  3. 如果头像更换后,镜像地址的头像会更新吗?

    3年前 回复
    • 可以设定七牛云空间客户端缓存时间为7天,7天后回源重新拉取,可以达到你的这个“更新”

      5月前 回复
  4. :lol: 较真…

    3年前 回复
    • good ,你的方法更好

      3年前 回复
      • 不过又发现个BUG,获取不了大于80的头像

        3年前 回复
  5. 刚好要用,多谢了。

    3年前 回复
    • 这里有个教程,参考了你的教程,解决了参数问题,不修改源文件的办法,一起学习。http://www.wpmee.com/cache-qiniu-gravatar/

      3年前 回复
      • good!知道可以用add_filter ,但技术不到家,所以一直没有尝试过。

        3年前 回复
      • 主题到你的网站上投稿宣传宣传,赏脸不? :roll:

        3年前 回复
  6. 如果不用缓存头像的办法的话,那么估计也只有你这一条路了

    3年前 回复
  7. 哈哈,厉害的技术啊。。

    4年前 回复
  8. get_avatar 有 filter 啊

    4年前 回复
发表评论