一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

WordPress无法显示Gravatar头像被墙的四种解决方案

时间:2015-06-28 编辑:简简单单 来源:一聚教程网

在当前Gravatar头像服务器被墙的情况下,要想要加快Wordpress显示Gravatar头像的速度,我们可以做那些努力呢?通常的做法大致有以下几种:

1、首先可以做的就是将Gravatar头像图片缓存到自己的虚拟主机或者VPS 上,这样用户访问的就是直接读取自己服务器的图片文件。好处是访问的本地图片,图片的加载非常快!缺点也是显而易见的:运行一段时间后,大量的 Gravatar头像图片会占用非常多的空间,过多的图片导致服务器压力骤增。

2、安装插件:插件有二大类,一类是wordpress评论Gravatar头像缓存插件,原理和弊端同上。另外一类就是替换Gravatar头像服务器及缓存服务器地址,但仍然连接到Gravatar头像服务器及缓存服务器。

3、禁用Gravatar头像。很多的博主因为Gravatar头像现实的不稳定,间断抽风,已经取消了Gravatar头像在博客的显示,一劳永逸。但评论是一种交互方式,没有头像显示的评论,对网站美化来说就是一块硬伤。

4、无插件实现Gravatar头像的显示。网上介绍的这类方法,基本上都需要修改Wordpress的文件,如果遇到Wordpress更新,修改的文件会被替换掉,那么就需要再次进行修改。。伤不起的手工活啊!!

Gravatar头像不显示完美解决方案

有没有一种方案能完美的解决我们的这些烦恼呢?答案是肯定的。提升 Wordpress的Gravatar头像加载速度进阶的方法就是将Gravatar头像的服务器变为国内的,放在国内知名公司的服务器上或者专业的 CDN服务器上。经过测试我们发现多说调用的Gravatar头像可以正常显示。猜测可能多说可能为了用户的体验而架设了一台Gravatar国内的中转 服务器,那么福音来了,只需短短几行代码就可以彻底告别Gravatar被墙的困扰。本篇文章就来介绍此种方法。


 方案一:

1、方法的原理是:官方Gravatar的头像所在的路径一般都是

www.gravatar.com、0.gravatar.com、1.gravatar.com、2.gravatar.com

我们只需要将这些头像默认的URL换成多说的就行了。

2、打开主题下的functions.php 文件,将以下代码复制粘贴保存即可。

//多说官方Gravatar头像调用
function mytheme_get_avatar($avatar) {
    $avatar = str_replace(array("www.gravatar.com","0.gravatar.com","1.gravatar.com","2.gravatar.com"),"gravatar.duoshuo.com",$avatar);
    return $avatar;
}
add_filter( 'get_avatar', 'mytheme_get_avatar', 10, 3 );

3、效果见下图,Gravatar头像的外链地址已经全部到了多说的国内服务器了。

4、更新多说代码。(2014年11月18日更新。这个修改方法来源于朽木!感谢作者的提供!)

加入上面的代码后,前台的用户头像都是正常显示的,但是后台的只显示非默认头像,不显示默认的头像,导致这个问题的原因是Wordpress后台默认头像强制设置成了mystery,并且这个参数似乎没有办法用钩子替换。

打开wp-includes/pluggable.php文件,你可以找到这样一段代码

if ( 'mystery' == $default )
        $default = "$host/avatar/ad516503a11cd5ca435acc9bb6523536?s={$size}"; // ad516503a11cd5ca435acc9bb6523536 == md5('unknown@gravatar.com')

这段代码的意思是如果默认头像是mystery,那么就用unknown@gravatar.com邮箱的头像,我不知道这么奇葩的写法究竟用意何在,而且一路更新下来,这段代码依然健在。

那么我们需要让上面的代码失效,废了它,嘿嘿!以下是更正后的代码!当然这段代码也是添加在主题下的functions.php 文件中。

//多说官方Gravatar头像调用
function get_avatar_deadwood( $avatar ) {
  $avatar = preg_replace( "/http%3A%2F%2F\d.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3Fs%3D\d+/","mm",$avatar );
  $avatar = preg_replace( "/http:\/\/(www|\d).gravatar.com/","http://gravatar.duoshuo.com",$avatar );
  return $avatar;
}
add_filter( 'get_avatar', 'get_avatar_deadwood' );

方案二:

官方Gravatar头像调用ssl头像链接 。

https还是没被墙的,而且速度还不错,直接调用这个最简单了。

如果你的网站启用了ssl则不需要了,否则functions.php 加入如下代码:

//官方Gravatar头像调用ssl头像链接
function get_ssl_avatar($avatar) {
   $avatar = preg_replace('/.*\/avatar\/(.*)\?s=([\d]+)&.*/','',$avatar);
   return $avatar;
}
add_filter('get_avatar', 'get_ssl_avatar');

方案三:使用多说头像库替换(适用于任何主题):

在主题目录中,找到并打开 functions.php 文件,把以下代码复制放到该文件中:

    // HackGravatatr
    function wpyou_get_avatar($avatar) {
    $avatar = str_replace(array("www.gravatar.com","0.gravatar.com","1.gravatar.com","2.gravatar.com"),"gravatar.duoshuo.com",$avatar);
    return $avatar;
    }
    add_filter( 'get_avatar', 'wpyou_get_avatar', 10, 3 );

代码正确添加到主题的 functions.php 文件后即可使用多说提供的国内Gravatar服务了,从而完美解决问题。


方案四:本地缓存头像:

在主题目录中,找到并打开 functions.php 文件,把以下代码复制放到该文件中:

    // HackGravatatr
    function wpyou_localcache_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', 'wpyou_localcache_avatar');

热门栏目