Gravatar是Globally Recognized Avatar的缩写,是gravatar推出的一项服务,意为“全球通用头像”。如果在Gravatar的服务器上放置了你自己的头像,那么在任何支持Gravatar的blog或者留言本上留言时,只要提供你与这个头像关联的email地址,就能够显示出你的Gravatar头像来。

——百度百科“Gravatar

引文

Gravatar是一个非常方便的工具,对于一个WordPress博客来说更是尤为重要,同时其在全球各地部署的头像服务器都可以让你快速地访问获取任何你需要的头像。

Gravatar有很多的二级域名供客户选择:

  • gravatar.com
  • secure.gravatar.com
  • cn.gravatar.com
  • 0.gravatar.com
  • 1.gravatar.com
  • ……

除了中国大陆!Gravatar因为某些原因在大陆是无法访问的。但是WordPress(以下简称WP)默认都是调用Gravatar的数据来获取用户的信息,这就导致了在中国大陆的互联网环境中访问WP网站时出现严重的加载缓慢(根据我观察,对Gravatar头像的超市请求会使网页加载时间延长近30s)和页面不完整(头像无法正常显示),这时我们不得不寻求一个方案来解决这个问题。

解决方案(推荐程度分先后)

一、更换Gravatar源

国内访问不了Gravatar自家的源,那就访问第三方的镜像源呗。目前国内有一些无私的腐竹们搭建了一些能够正常访问的Gravatar镜像服务器,可以从他们那里获得头像以在加快访问速度的同时正确显示头像。

在原来很多人都有搭过Gravatar的镜像服务器,但是时过境迁,现在的大环境里似乎Gravatar正在淡出主流网络用户的视线,目前能正常使用的源并不多。

如何换源?在WP后台的主题编辑器中,给正在使用的主题目录下”function.php”中加入如下代码片段中的一个,其中”gravatar.zeruns.tech”字段也可以换成”sdn.geekzu.org”,但实际差别不大,可自行选择。

function get_ssl_avatar($avatar) {
   $avatar = preg_replace('/.*\/avatar\/(.*)\?s=([\d]+)&.*/','<img src="https://gravatar.zeruns.tech/avatar/$1?s=$2" class="avatar avatar-$2" height="$2" width="$2">',$avatar);
   return $avatar;
}
add_filter('get_avatar', 'get_ssl_avatar');
function replace_gravatar($avatar) {
    $avatar = str_replace(array("//gravatar.com/", "//secure.gravatar.com/", "//www.gravatar.com/", "//0.gravatar.com/", "//1.gravatar.com/", "//2.gravatar.com/", "//cn.gravatar.com/"), "//gravatar.zeruns.tech/", $avatar);
    return $avatar;
}
add_filter( 'get_avatar', 'replace_gravatar' );

二、关闭Gravatar头像显示

如果Gravatar加载影响页面访问速度,并且头像的显示并不是那么重要的话可以考虑在WP的设置中关闭头像显示。

设置路径:设置-讨论-头像-头像显示

将“头像显示”取消选择并保存即可。

但是,如果你的网站中安装了Jetpack、wpDiscuz等包含Gravatar头像显示功能的插件,请务必在其设置中也关闭Gravatar头像显示,否则仅在WP设置中关闭是没有用的!!!Jetpack需要关闭“弹出式名片”,wpDiscuz则在Avatar设置中直接关闭。

三、缓存Gravatar头像

将Gravatar的头像直接缓存到服务器上,前提是你的服务器本身可以正常访问Gravatar

  1. 在WP根目录下创建一个”avatar”文件夹,chmod赋予777权限。
  2. 在你使用的WP主题文件夹下新建一个”img”文件夹,放一个默认的”default.png”头像图片。
  3. 在functions.php尾部加入如下代码(注意粘贴位置,在文件最后一行 ?> 结束号上面一行粘贴即可)。
function tongli_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 .'.png';
	$t = 7*24*60*60;//缓存时长,如有需要可适当修改
	if ( !is_file($e) || (time() - filemtime($e)) > $t )
		copy(htmlspecialchars_decode($g), $e);
	else
		$avatar = strtr($avatar, array($g => $w.'/avatar/'.$f.'.png'));
	if ( filesize($e) < 200 ) 
		copy(get_bloginfo('template_directory').'/img/default.png', $e); 
	return $avatar;
}
add_filter('get_avatar', 'tongli_avatar' );

这样操作会缓存大量的Gravatar头像在主机上,请斟酌是否真的有需要这样做以及前两种方案是否更好。

希望本文中提供的方案会对你的网页优化有所帮助!

0 0 votes
文章评分
订阅这个评论
提醒

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

1 评论
最旧
最新 得票最多
Inline Feedbacks
View all comments