缓存 Gravatar 头像到本地服务器

先来说说我们最终要实现的效果,在文章的评论区域和使用 WP-RecentComments 插件实现的侧栏评论区域,这些显示了 Gravatar 头像的地方,把 Gravatar 头像全部缓存到本地服务器。

如果你不清楚如何自定义 WordPress 头像,可以点击这里查看详细教程。

缓存 Gravatar 头像到本地服务器的好处

最大的好处就是加载速度,把头像缓存到本地后,打开网页后不需要再到 gravatar 网站上去查询评论者的头像,因为我们已经把头像全部缓存到本地服务器了,速度当然快。

缓存 Gravatar 头像到本地服务器的方法

更新于2011-02-16,园子发布了缓存 Gravatar 头像到本地最简单的方法,这个方法更简单些,朋友们可以试下。

本文提供的缓存 Gravatar 头像至本地服务器的方法是不用插件来实现的,所以我们得多动手去修改些代码,过程如下:

1.点击这里下载 Generic Gravatar Cache 组件。

2.解压后,在 WordPress 根目录下建立一个名为 gravatar 的文件夹,把解压后文件上传到该文件夹内(解压后的文件包含两个文件夹:cache 和 profile,三个文件:index.php, .htaccess, mysql.sql)。

3.设置 cache 文件夹为 755 权限(一般默认就是这个权限,你可以在FTP软件中右键点击该文件夹选择“属性(CHMOD)”查看权限,如不是更改为755即可)。

4.在本地新建一个 avatar.php 文件,写入下面的代码并以 utf8 格式保存,上传到 profile 文件夹内(注意要将代码中出现的网址改成你自己的)。


5.设计一个默认的头像,命名为 default-gravatar.png,上传到 gravatar 文件夹内,你也可以点击这里下载园子设计的图片。

6.用记事本编辑刚刚上传过的 gravatar 文件夹内 .htaccess 文件,一般只需要更改第五行,原来的代码如下:

RewriteRule . index.php [L]

你需要将它更改为你所设置的实际目录,如园子的是:

RewriteRule . /gravatar/index.php [L]

7.这一步主要是设置评论区域的 Gravatar 头像缓存到本地。打开你使用主题中的 comments.php 文件,查找类似于如下的代码:


将它替换为:


8.这一步目的是要把使用了 WP-RecentComments 侧栏最新评论的头像也缓存到本地。

编辑插件目录下的 Core.php 文件,查找类似如下代码:

		// 当不包含默认头像时
		} else {
			$avatar = '
' . get_avatar($email, $size) . '
'; }

替换成:

		// 当不包含默认头像时
		} else {
			$avatar = '
'; }

请注意更改成你的网址,保存即可看到侧栏最新评论的头像的缓存效果。

Gravatar 头像只缓存一部分的解决方法

如果你发现你在进行上述操作后,Gravatar 头像只缓存一部分,那么请查看自己是否使用了 WordPress thread comment 嵌套评论插件,你需要进入 WordPress thread comment 插件的后台设置中,找到“编辑评论的HTML”选项,找到其中的调用头像部分的代码也替换成如下代码即可解决。


使用 mg12 的 inove 主题的特别说明

这是专门针对使用 inove 主题的朋友们写的,请忽略上述过程的第7步,将第7上变成如下操作:

打开你使用主题中的 functions.php 文件,查找类似于如下的代码:


将它替换为:


请注意将网址替换成自己的哦。

万戈所提供的缓存 Gravatar 头像到本地服务器方法

1.前六步和上面提到的“缓存 Gravatar 头像到本地服务器的方法”一样。

2.打开 WordPress 目录下的 wp-includes/pluggable.php 文件,查找类似于如下的代码,大概是在1587行:

if ( !function_exists( 'get_avatar' ) ) :
function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) {
	if ( ! get_option('show_avatars') )
		return false;

	if ( false === $alt)
		$safe_alt = '';
	else
		$safe_alt = esc_attr( $alt );

	if ( !is_numeric($size) )
		$size = '96';

	$email = '';
	if ( is_numeric($id_or_email) ) {
		$id = (int) $id_or_email;
		$user = get_userdata($id);
		if ( $user )
			$email = $user->user_email;
	} elseif ( is_object($id_or_email) ) {
		// No avatar for pingbacks or trackbacks
		$allowed_comment_types = apply_filters( 'get_avatar_comment_types', array( 'comment' ) );
		if ( ! empty( $id_or_email->comment_type ) && ! in_array( $id_or_email->comment_type, (array) $allowed_comment_types ) )
			return false;

		if ( !empty($id_or_email->user_id) ) {
			$id = (int) $id_or_email->user_id;
			$user = get_userdata($id);
			if ( $user)
				$email = $user->user_email;
		} elseif ( !empty($id_or_email->comment_author_email) ) {
			$email = $id_or_email->comment_author_email;
		}
	} else {
		$email = $id_or_email;
	}

	if ( empty($default) ) {
		$avatar_default = get_option('avatar_default');
		if ( empty($avatar_default) )
			$default = 'mystery';
		else
			$default = $avatar_default;
	}

	if ( !empty($email) )
		$email_hash = md5( strtolower( $email ) );

	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 ( 'mystery' == $default )
		$default = "$host/avatar/ad516503a11cd5ca435acc9bb6523536?s={$size}"; // ad516503a11cd5ca435acc9bb6523536 == md5('unknown@gravatar.com')
	elseif ( 'blank' == $default )
		$default = includes_url('images/blank.gif');
	elseif ( !empty($email) && 'gravatar_default' == $default )
		$default = '';
	elseif ( 'gravatar_default' == $default )
		$default = "$host/avatar/s={$size}";
	elseif ( empty($email) )
		$default = "$host/avatar/?d=$default&s={$size}";
	elseif ( strpos($default, 'http://') === 0 )
		$default = add_query_arg( 's', $size, $default );

	if ( !empty($email) ) {
		$out = "$host/avatar/";
		$out .= $email_hash;
		$out .= '?s='.$size;
		$out .= '&d=' . urlencode( $default );

		$rating = get_option('avatar_rating');
		if ( !empty( $rating ) )
			$out .= "&r={$rating}";

		$avatar = "{$safe_alt}";
	} else {
		$avatar = "{$safe_alt}";
	}

	return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);
}
endif;

修改为:

if ( !function_exists( 'get_avatar' ) ) :
function get_avatar( $id_or_email, $size = '96', $default = '', $alt = false ) {
    if ( ! get_option('show_avatars') )
        return false;

    if ( false === $alt)
        $safe_alt = '';
    else
        $safe_alt = esc_attr( $alt );

    if ( !is_numeric($size) )
        $size = '96';

    $email = '';
    if ( is_numeric($id_or_email) ) {
        $id = (int) $id_or_email;
        $user = get_userdata($id);
        if ( $user )
            $email = $user->user_email;
    } elseif ( is_object($id_or_email) ) {
        if ( isset($id_or_email->comment_type) && '' != $id_or_email->comment_type && 'comment' != $id_or_email->comment_type )
            return false; // No avatar for pingbacks or trackbacks

        if ( !empty($id_or_email->user_id) ) {
            $id = (int) $id_or_email->user_id;
            $user = get_userdata($id);
            if ( $user)
                $email = $user->user_email;
        } elseif ( !empty($id_or_email->comment_author_email) ) {
            $email = $id_or_email->comment_author_email;
        }
    } else {
        $email = $id_or_email;
    }

  
        $host = 'http://www.yzznl.cn';  //注意这里要修改为你的博客的地址

    if ( !empty($email) ) {
        $out = "$host/gravatar/cache/avatar/";
        $out .= md5( strtolower( $email ) );
      
        $avatar = "{$safe_alt}";
    } else {
        $avatar = "{$safe_alt}";
    }

    return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);
}
endif;

请注意将代码中出现的 http://www.yzznl.cn 替换成你自己的网址即可。

刷新页面即可看到头像已经缓存到本地了。

园子温馨提醒:

进行修改代码的操作时,一定要记得备份源文件,这样一旦出错可以马上恢复。

小知识:关于 Gravatar

Gravatar 的概念首先是在国外的独立 WordPress 博客中兴起的,当你到任何一个支持 Gravatar 的网站留言时,这个网站都就会根据你所提供的 Email 地址为你显示出匹配的头像。当然,这个头像,是需要你事先到Gravatar的网站注册并上传的,否则,在这个网站上,就只会显示成一个由网站管理者所设置的默认头像。

缓存 Gravatar 头像到本地服务器》上有58条评论

  1. sypxue

    不得言 :
    对博主来说确实是个不错的操作。能提升自己的速度了。但对于用户来说,仅仅来一次或两次,你在人家的电脑里留下更多的“临时文件”,多少有点那个。哈哈~

    不是你所认为的那样的,gravatar 插件的功能是 你问它要一个用户头像,它从gravatar 的服务器查询一下,返回图像,但是,有了缓存之后,只在新用户评论时查询一次该用户的头像,而后就可以直接从 博主的博客下载用户头像了。如果真的要说这样有什么不好的话,应该是这样:
    人家只不过是夸(扁)了博主一句,你就把人家的照片给留下来了!
    至于”临时文件”之类,纯属误解。

  2. 不得言

    对博主来说确实是个不错的操作。能提升自己的速度了。但对于用户来说,仅仅来一次或两次,你在人家的电脑里留下更多的“临时文件”,多少有点那个。哈哈~

发表评论