本文使用「署名 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 FileETag None Header unset ETag Header set Expires "Tue, 08 Dec 2020 20:02:54 GMT" AddOutputFilter DEFLATE png gif jpg RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule .(.*) http:\/\/cache.soulteary.com\/wp3\/avatar\/default.jpg [R,NC,L] ``` 当然你还可以加上判断refer的判断,杜绝简单的盗链..相信我.盗链还是用程序来做吧.至于小的静态资源,由它去吧.. 这样设置之后,错误的访问就会转到你的默认图片上.而且图片们的浏览器缓存也设置完成,可以提高再次访问的速度。 接着是在评论的时候,添加动态展示了。 在[朋朋博客](http://soulteary.com/redirect?url=http%3A%2F%2Fkan.willin.org%2F%3Fp%3D1320&key=a674a3c987dc8c52867cbc1ac3e897ab)看到这个功能后,觉得不错,但是没有添加有效性判断,于是修改之。 放一个简单的HTML结构 ```html 无标题文档
这个是你的头像么? ``` 然后是改进后的js代码,顺便到百度搜索了个在线的yui eval混淆.把后面的md5计算的包裹掉了.不喜欢包裹的可以去朋朋博客找原始的或者百度在线的解密eval. ```js ``` 至此,方案讲述完毕。