首页 > Tech, WordPress > 支持社交网络登陆和Gravatar的头像缓存

支持社交网络登陆和Gravatar的头像缓存

2011年8月6日 发表评论 阅读评论 185 Views  

技术贴
GRAVATAR
熟悉WordPress的同志们应该都知道Willin大师,本博客也使用了他开发的一款名为My Visitors的插件。
缓存gravatar的方法也来自于willin大师的新版 Gravatar 缓存
方法如下:

先在你的網站 wp-content 的同級目錄建立資料夾: /avatar 權限: ‘0755’, 這是準備 Gravatar 緩存的路徑. (若權限: ‘0755’ 不行, 試一下 ‘0777’)
準備一張適合你模板尺寸的默認頭像, 名為”default.jpg” 放在此路徑.
將下列代碼 copy 到模板的 functions.php:

function my_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', 'my_avatar');

但此方法对有社交网络登陆插件的WordPress站点不适用,会取不到头像,出现无法写入路径等错误。因为这类插件会用在社交网络的头像代替默认的gravatar头像,而这段代码只针对gravatar头像。

今天研究了一下,对这段代码稍作修改,就能支持社交网络头像了。 Gravatar头像的地址一般是http://0.gravatar.com/avatar/xxxxxx?s=32,大师的代码中$f就是此处的xxxxxx,作为文件名。但一般社交网头像地址不是这样,比如renren为http://hdn.xnimg.cn/photos/somepath/tiny_QmSb_xxxxxxx.jpg。原代码是找最后一个’/’和’?’,这两个符号之间就是头像文件名,对于非gravatar地址这种文件名的获取方法就失效了,会出现无法写入路径等错误,因此修改的思路是支持获取非gravatar头像的文件名。

由于不同的网站具有不同形式的图片链接,我采用了及其暴力但非常通用的方法修改文件名:获取从“http://”后面第一个字符直到结尾的字符串,并替换掉非法字符,将’/”?””.”全部替换成’_’即可。修改后代码如下,修改部分被高亮(SyntaxHighlighter插件效果果然不错):

function my_avatar($avatar) {
  $tmp = strpos($avatar, 'http');
  $g = substr($avatar, $tmp, strpos($avatar, "'", $tmp) - $tmp);
  $tmp = strrpos($g, 'avatar/') + 7;
  $tmp1 = strrpos($g, "?", $tmp);
  if(!$tmp || $tmp1 < $tmp){ //非gavatar头像
  	$tmp = strrpos($g, '://') + 3;
  	$tmp1 =  strlen($g);
  }
  $f = substr($g, $tmp, $tmp1 - $tmp);
  $arr1 = array("?","/",".");
  $arr2 = array("_","_","_");
  $f = str_replace($arr1,$arr2,$f);
  $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', 'my_avatar',20);

copy 到模板的 functions.php,测试头像缓存成功!

本文地址:http://www.pengzhaomeng.net/2011/08/06/104.html