Gravatar头像无法访问

从10/10/15开始,wordpress的Gravatar头像便无法访问了,经过了解原来是Gravatar存放头像的域名被墙了。不知道和敏感词诺贝尔神马的有什么的关系。网上找了找有两种方法解决此问题。

一、修改获得头像服务器的地址
可参考
gravatar头像不显示修复方法
http://www.8ab.org/wordpress/780.html

修改方法有两种:

方法一、找到wp-includes文件夹下找到pluggable.php 文件,搜索gravatar.com显示如下代码:

if ( is_ssl() ) {
$host = ‘https://secure.gravatar.com’;
} else {
if ( !empty($email) )
$host = sprintf( “http://%d.gravatar.com”, ( hexdec( $email_hash{0} ) % 2 ) );
else
$host = ‘http://0.gravatar.com’;
}

将上面的代码修改为以下代码:

if ( is_ssl() ) {
$host = ‘https://secure.gravatar.com’;
} else {
if ( !empty($email) )
$host = sprintf( “http://www.gravatar.com”, ( hexdec( $email_hash{0} ) % 2 ) );
else
$host = ‘http://www.gravatar.com’;
}

方法二:将中间部分代码删除,修改为如下所示:

if ( is_ssl() ) {
$host = ‘https://secure.gravatar.com’;
$host = ‘http://www.gravatar.com’;
}

可能是WordPress3.01的关系吧,岸边使用的是方法一,部分朋友可能需要使用方法二。

Ps:修改前请备份此文件。这是一个良好的习惯,也是必不可少的习惯。

二、使用头像缓存插件
可参考
Gravatar 头像缓存解决 Gravatar 无法访问
http://loo2k.com/gravatar-cache-reset/

如果没有记错的话昨天 10/10/15 Gravatar 的四个存放头像的域名被 GFWed 了;跟着英勇就义的还有 MTime 、玩聚;其实我最想不清楚的就是为什么连一个提供头像服务的网站都会敏感到被封掉;算了,那不是我们能理解的;

Gravatar 被墙,可以暂时用 Gravatar 头像缓存的办法解决,仅限国外主机此方法国内外主机都适用;这篇文章里面提及的代码根据 Willin 的 簡易的 Gravatar 頭像緩存 提供的代码进行修改,第一部分讲头像缓存原理,第二部分提供一个根据这个方法制作的一个头像缓存插件,方便懒得理解的同学直接使用;

因为各个博客显示的 Gravatar 的头像不一定都是一个大小,最初 Willin 是用 CSS 控制头像大小,后来我修改代码直接缓存不一样大小的头像,显示的效果可能更好一点;

顺便修改了一下复制缓存文件的地址,从被墙的地址换到了没有墙的地址,这样国内或者国外的主机都能正常的使用 Gravatar 的缓存了;

Gravatar 头像缓存原理篇

话说也没什么很复杂的原理(如果你会 PHP 的话,可以继续将这段代码进行改进),通过国外能访问 Gravatar 的主机预先下载评论者的头像到主机上,访客访问的头像使用你主机上的头像就能间接的访问到 Gravatar 的头像了

你可以修改自己的主题实现头像缓存,编辑主题文件夹里面的 functions.php 文件,添加以下代码:

function cache_gravatar($avatar) {
$tmp = strpos($avatar, 'http'); //76
$g = substr($avatar, $tmp, strpos($avatar, "'", $tmp) - $tmp);//图像地址
$tmp = strpos($g, 'avatar/') + 7;//31
$f = substr($g, $tmp, strpos($g, "?", $tmp) - $tmp);//图像名称
$s = 'size' . substr($avatar,strpos($avatar, "?s=", $tmp) + 3,2);//图像大小 48
$nogfw = 'http://www.gravatar.com/avatar/' . $f . '?size=' . $s . '.png';//替换成没有被墙的地址
$w = get_bloginfo('wpurl').'/wp-content';//博客地址
$e = ABSPATH .'/wp-content/avatar/'. $f . $s .'.png';//主机图像地址
$t = 1209600; //14天 单位秒
if ( !is_file($e) || (time() - filemtime($e)) > $t ) copy($nogfw, $e); //当头像不存在或者图像存在时间超过14天更新
if ( filesize($e) < 500 ) copy($w.'/avatar/default.png', $e);
$avatar = strtr($avatar, array($g => $w.'/avatar/' . $f . $s . '.png'));//将原来的地址替换成本地地址
return $avatar;
}
add_filter('get_avatar', 'cache_gravatar');

然后你需要在你博客的的 FTP 主机博客地址/wp-content/创建一个权限为 755 ,名为 avatar 的文件夹就能使用 Gravatar 的头像缓存了;

Gravatar 头像缓存插件

为了节省大家的时间,我做了一个 Gravatar 的头像缓存插件;上传 – 安装 – 启用,三步就可以了

Gravatar 头像缓存插件下载地址:

Gravatar Cache Plugin (3KB都不到)

对 Gravatar 头像缓存的一些补充

时间仓促,我只在自己的博客上用过,如果你遇到什么问题,欢迎留言讨论;

  • 如果你用的是国内主机,看这条评论
  • 重要更新如果你是国内主机,也可通过本文的方法或插件缓存 Gravatar 头像,10/10/17 下午已对插件进行升级,主要针对国内主机用户无法缓存问题;

《Gravatar头像无法访问》上的一个想法

  1. 其实WordPress博客用户可以将下面代码添加到当前主题的functions.php文件中就可解决Gravatar头像不显示问题。 :wink:

    //=== Gravatar头像缓存 ===//
    function gravatar_cache($avatar){
    $avatar = preg_replace( "/http:\/\/(www|\d).gravatar.com/","http://gravatar.hechaocheng.cn",$avatar );
    $avatar = preg_replace( "/\?s\=/",".png?s=",$avatar );
    return $avatar;}
    add_filter( 'get_avatar', 'gravatar_cache' );

评论已关闭。