由于 gravatar头像被墙,导致头像加载很慢,因此在网上搜索“wordpress 头像缓存优化”的方法,结果搜到的基本都是不有效,甚至是不可用的,偶然在露兜博客看到了一个方法,试用后,感觉非常完美,在此就分享出来供大家借鉴一二。
优化后的缓存代码
废话不多说,直接上代码:
/**
* WordPress 头像本地化缓存最有效方法 - 龙笑天下
* https://www.ilxtx.com/wordpress-gravatar-local-cache.html
*/
function my_avatar( $email = 'gravatarcache@ilxtx.com', $size = '32', $default = '', $alt = '') {
// 设置$email 默认值为一个不存在的邮箱,如:gravatarcache@ilxtx.com
// 防止空的$email 导致出错
$f = md5( strtolower( $email ) );
// 以下代码将头像缓存到 wp-content 目录下
$a = WP_CONTENT_URL . '/avatar/'. $f . $size . '.png';
$e = WP_CONTENT_DIR . '/avatar/' . $f . $size . '.png';
$d = WP_CONTENT_DIR . '/avatar/' . $f . '-d.png';
// 如果要将头像缓存到当前主题目录下,请将 3-5 行代码改成:
// $a = get_bloginfo('template_url') . '/avatar/'. $f . $size . '.png';
// $e = get_template_directory() . '/avatar/' . $f . $size . '.png';
// $d = get_template_directory() . '/avatar/' . $f . '-d.png';
if($default=='')
$default = 'https://www.ilxtx.com/wp-content/themes/lxtx/images/gravatar.png';
$t = 2592000; // 缓存有效期 30 天, 这里单位:秒
if ( !is_file($e) || (time() - filemtime($e)) > $t ) {
if ( !is_file($d) || (time() - filemtime($d)) > $t ) {
// 验证是否有头像
$uri = 'http://www.gravatar.com/avatar/' . $f . '?d=404';
$headers = @get_headers($uri);
if (!preg_match("|200|", $headers[0])) {
// 没有头像,则新建一个空白文件作为标记
$handle = fopen($d, 'w');
fclose($handle);
$a = $default;
}
else {
// 有头像且不存在则更新
$r = get_option('avatar_rating');
$g = 'http://www.gravatar.com/avatar/'. $f. '?s='. $size. '&r=' . $r;
copy($g, $e);
}
}
else {
$a = $default;
}
}
$avatar = "<img alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
return apply_filters('my_avatar', $avatar, $email, $size, $default, $alt);
}
使用方法
- 重要:在 wp-content 目录下新建一个目录,命名为 avatar,权限设为 755;如果选择头像缓存到当前主题下,请在当前主题目录下,请在当前主题目录下新建一个目录,命名为 avatar,权限设为 755;
- 将以上代码放到当前主题 functions.php 的最后一个 ?> 的前面;
- 以上代码第 20 行换成你本地的默认头像地址;
- 这里默认头像大小是 32*32,可在以上代码第 1 行更改;
- 在需要使用 Gavatar 头像的地方调用 my_avatar 函数即可。一般在主题所有文件中,将 get_avatar 函数替换为 my_avatar 。有个例外,functions.php 评论列表函数中:
get_avatar( $comment
需要改为my_avatar( $comment->comment_author_email
。
因为 my_avatar 函数只能通过 Email 来调取用户头像,所以以上情况,需要将第一个参数改成 email 地址。
友情提示
这个新的头像调用函数 my_avatar 可以传递 alt 参数,因此可以不必使用下文中这个给 gravatar 头像加 alt 标签的代码了:

另外,本站Dragon 主题已经自带集成了此功能,更加强大,欢迎购买体验:
还没有人赞赏,快来当第一个赞赏的人吧!
本文为原创文章,版权归龙笑天下所有,欢迎分享本文,转载请保留出处!
我也想搞个本地缓存了。
@Koolight[惊讶] 貌似贵站已经是本地缓存了
不错, Typecho 的路过!
@明月学习笔记Blog欢迎欢迎~
走的官方 ssl 链接,存在本地影响本地资源吧!
@微凉嗯,存在本地的话对服务器是有一定压力的~
我记得张戈博客貌似有相关文章,很久之前我使用的就是缓存,但是后来想想还是算了,就没有用了
@BanYuner
你现在的头像显示用的是什么方法?
@龙笑天啊哈哈 直接 SSL 获取
@BanYuner有相关教程吗,不知为啥网上找了好多都不管用~![[可怜] [可怜]](https://www.ilxtx.com/wp-content/themes/lxtx/assets/images/smilies/kel.gif)
@BanYuner哈哈哈,终于被我搞出来了,我也直接使用直链了,还兼容字母头像~
折腾这个,其实有时候很崩溃。因为有些文件的代码写法要改一下才能显示。。。
@橘子书我去,你这突然“活”过来了啊~
Typecho 的我都用的七牛缓存的头像!呵呵 1
我已经习惯了七牛缓存头像了!还顺便给头像都 CDN 加速了!呵呵!
@明月登楼还是缓存到本地放心点~~
我现在就是用这种方法换成本地头像,感觉还不错,个人建议直接存放在主题文件夹内,这样感觉比较好。
@boke112导航为啥会说放到主题文件夹内比较好呢~![[疑问] [疑问]](https://www.ilxtx.com/wp-content/themes/lxtx/assets/images/smilies/yiw.gif)
@龙笑天
因为方便别人,想我们是集成在主题里面的,只要有人用我们的主题,那么就不用另外设置就可以直接使用缓存头像了。不过对于后期自己加上去的功能,那么放在哪里都无所谓的
@boke112导航原来如此~![[赞] [赞]](https://www.ilxtx.com/wp-content/themes/lxtx/assets/images/smilies/zan.gif)
@龙笑天
明天就发布你这篇文章,我刚才搜索了 boke112 导航,竟然没有一篇文章是介绍这个本地缓存头像的,失策。
@boke112导航贵站教程太齐了,膜拜啊~