本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 [署名 4.0 国际 (CC BY 4.0)](https://creativecommons.org/licenses/by/4.0/deed.zh)
本文作者: 苏洋
创建时间: 2012年01月21日
统计字数: 1414字
阅读时间: 3分钟阅读
本文链接: https://soulteary.com/2012/01/21/gravatar_fixs.html
-----
# Wordpress 3.X Gravatar 修改方案
[![20120121154641](https://attachment.soulteary.com/2012/01/21/20120121154641.jpg "20120121154641")](https://attachment.soulteary.com/2012/01/21/20120121154641.jpg)
> 首先感谢 [willin](http://soulteary.com/redirect?url=http://kan.willin.org/?p=1320&d=fir),他是Gravatar的原创作者。
PHP 原始函数就不贴了,有兴趣的朋友可以自行去willin那里看下。
既然说到方案,那么如果是简单的修改一下就太噱头了。看完本文你可以实现的东西有:
1. 缓存Gravatar OPEN ID头像到你的网站的目录,以及完善的rewrite输出。
2. 游客使用邮箱评论的时候动态展示游客的Gravatar头像,增加交互.
3. 我可怜的小博客的浏览量+1...(可以无视)
首先实现缓存,free-domain cookies对于每个技术菜鸟来说都不陌生吧,小菜我表示如果静态资源不分离到子域名的话,浏览器加载的时候就不是很舒服..
所以我把Gravatar也缓存到了子目录...这个先按下不表,只是路径的问题.现在我说一下大众的简单修改方法.
首先在你的主题的function.php文件中追加函数和hook如下:
如果不会添加的话,可以参考willin的原文.链接在本文开头。
```php
function my_avatar($avatar) {
if (strpos($avatar,'gravatar.com')){
$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 = WP_CONTENT_URL;//这里修改成你自己的位置
$e = WP_CONTENT_DIR. '/avatar/'. $f. '.jpg';//这里修改成你自己的位置
$t = 8035200; //設定3yue, 單位:秒
if ( !is_file($e) || (time() - filemtime($e)) > $t ) { //當頭像不存在或文件超過14天才更新
copy($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', 'my_avatar');
```
现在你的主题就能自动实现缓存了,第一次浏览的时候,图片的位置还是Gravatar服务器的,再次访问的话,就已经是自己的了.
接着,别太着急,这个方案也不是太完善哦,对于恶意的请求,和程序错误的请求,和其他的不正确的请求,我们也要做个判断.
直接在你的avatar目录中建立htaccess规则.其他服务器软件改写规则类似。
```apache