前一篇文章介绍了如何将Gravatar全球通用头像缓存到本地,但对于SAE这样的云主机来说,由于没有读写权限,我们是无法直接用这种方法来缓存Gravatar头像的。不过我们可以将Gravatar头像缓存到Storage中,从而达到相同的目的。方法也很简单,只需要在主题目录下function.php中最后一个?>前加入以下的代码即可:
function get_avatar_cache($avatar){
if($_SERVER['PHP_SELF'] == '/wp-admin/options-discussion.php')return $avatar;
$s = new SaeStorage();
$tmp = strpos($avatar, 'avatar/') + 7;
$avatar_id = substr($avatar, $tmp, strpos($avatar, '?') - $tmp);
$tmp = strpos($avatar, 'avatar/') + 7;
pattern = "/(<img.* src=\')([^\']*)(\'.*)/";
$avatar_url = preg_replace($pattern, "$2", $avatar);
$avatar_url = str_replace("&", "&", $avatar_url);
$avatar_file = 'avatars/' . $avatar_id . '.png';
//echo '<!--' . $avatar_url . '-->
// <!--' . $s->getUrl('wordpress', $avatar_file) . '-->';
if(!$s->fileExists('wordpress', $avatar_file)){
$content = @file_get_contents($avatar_url);
if(!$content) return $avatar;
$attr = array('expires' => 'now plus 14 day');
$result = $s->write('wordpress', $avatar_file, $content, -1, $attr);
if ($result != true) var_dump($s->errno(), $s->errmsg());
}
$avatar = preg_replace($pattern, "$1" . $s->getUrl('wordpress', $avatar_file) . "$3", $avatar);
return $avatar;
}
add_filter('get_avatar', 'get_avatar_cache');

Storage是不是性能不如KVDB或Memcache啊
是的。