因为近期 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 环境。
大功告成!