因为近期 Gravatar 头像加载速度又慢如蜗牛,所以需要缓存一下。百度了一下,没有 BAE 版的,于是参照 SAE 版的,自己写了个。
什么是Gravatar?
Gravatar 是 Globally Recognized Avatar 的缩写,是 Gravatar 推出的一项服务,意为“全球通用头像”。如果在 Gravatar 的服务器上放置了你自己的头像,那么在任何支持 Gravatar 的站点上留言时,只要提供你与这个头像关联的 E-Mail 地址,就能够显示出你的Gravatar头像来。
为什么要缓存Gravatar头像?
因为 Gravatar 的服务器在国外,在国内访问使用该功能的网站或博客,可能因为载入速度过慢而导致页面一直在载入中甚至头像无法显示,这是一个非常糟糕的用户体验。将头像缓存下来,定时更新,而头像图片的文件一般不会很大,不需要暂用很大的服务器空间,因此缓存 Gravatar 头像是一个加快网站访问速度的高性价比选择。
如何在 BAE 中缓存Gravatar头像?
很简单,在你的主题的 Function.php 文件中加入以下代码:
<?php
function nikbobo_get_avatar_cache ( $avatar ) {
if( $_SERVER['PHP_SELF'] == '/wp-admin/options-discussion.php' )
return $avatar;
$bucket = '这里更改为你的Bucket名称';
$cache_dir = '/avatar/';
$baidu_bcs = new BaiduBCS();
$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 = $cache_dir . $avatar_id . '.png';
if( ! $baidu_bcs->is_object_exist( $bucket, $avatar_file ) ) {
$content = @file_get_contents( $avatar_url );
if( ! $content )
return $avatar;
$opt['acl'] = "public-read";
$opt['headers']['Expires'] = 'access plus 15 days';
$opt['headers']['Content-Type'] = 'image/png';
$result = $baidu_bcs->create_object_by_content( $bucket, $avatar_file, $content, $opt );
}
$avatar_cache_url = 'http://bcs.duapp.com/' . $bucket . $avatar_file;
$avatar = preg_replace( $pattern, "$1" . $avatar_cache_url . "$3", $avatar );
return $avatar;
}
add_filter('get_avatar', 'nikbobo_get_avatar_cache');
?>
以上代码在 BAE 环境中测试通过,无法确定能否用于非 BAE 环境。
大功告成!