WordPress中Gravatar头像缓存到本地及相关优化的技巧


Posted in PHP onDecember 19, 2015

将Gravatar全球通用头像缓存的目的在于加快网站的打开速度,因为Gravatar官网的服务器在国外,加上伟大的GFW,国内打开速度经常很慢。方法来自willin,不过貌似他的网站已经打不开了- -
 
将Gravatar全球通用头像缓存到本地
 
缓存方法如下:

1.建立缓存目录
在WordPress根目录建立一个名为 avatar的文件夹,设置该文件夹的权限为 0755 (如果 0755 不行,就试一下 0777)。

2.设置默认头像
准备一张大小适合(32*32即可)的默认头像,命名为"default.jpg" ,放在 avatar 文件夹里面。

3.添加缓存代码
将下面的代码复制到主题的 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');

通过Email判断用户是否有Gravatar头像
很多时候,我们还需要知道用户有没有设置Gravatar,比如如果用户没有设置Gravatar头像则直接显示本地的默认头像,或者提醒没有设置Gravatar的用户设置Gravatar头像,而不打扰已经设置过头像的用户。今天分享的代码可以通过Email地址来验证用户是否有Gravatar头像:

function validate_gravatar($email) {
 $hash = md5(strtolower(trim($email)));
 $uri = 'http://www.gravatar.com/avatar/' . $hash . '?d=404';
 $headers = @get_headers($uri);
 if (!preg_match("|200|", $headers[0])) {
 $has_valid_avatar = FALSE;
 } else {
 $has_valid_avatar = TRUE;
 }
 return $has_valid_avatar;
}

Gravatar全球通用头像缓存优化

优化后的代码可以避免用户没有设置Gravatar头像时,默认头像重复缓存成多个文件造成资源浪费和重复连接的问题。优化后的代码如下

function my_avatar( $email, $size = '32', $default = '', $alt = '') {
 $f = md5( strtolower( $email ) );
 // 以下代码将头像缓存到wp-content目录下
 $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';
 // 如果要将头像缓存到当前主题目录下,请将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 = get_bloginfo('wpurl').'avatar/default.jpg';
 
 $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);
}

使用这个方法需要在主题所有文件中,将 get_avatar 函数替换为 my_avatar 。
而且如果是

get_avatar( $comment,

格式的话,还需要改成

my_avatar( $comment->comment_author_email

因为my_avatar函数只能通过Email来调取用户头像,所以以上情况,需要将第一个参数改成email地址。

PHP 相关文章推荐
如何把PHP转成EXE文件
Oct 09 PHP
MySQL授权问题总结
May 06 PHP
PHP5中的时间相差8小时的解决办法
Mar 28 PHP
队列在编程中的实际应用(php)
Sep 04 PHP
PHP取进制余数函数代码
Jan 19 PHP
php使用imagick模块实现图片缩放、裁剪、压缩示例
Apr 17 PHP
将二维数组转为一维数组的2种方法
May 26 PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 PHP
新浪SAE搭建PHP项目教程
Jan 28 PHP
PHP实现文件上传功能实例代码
May 18 PHP
php微信公众号开发之关键词回复
Oct 20 PHP
PHP实现15位身份证号转18位的方法分析
Oct 16 PHP
CentOS下与Apache连接的PHP多版本共存方案实现详解
Dec 19 #PHP
PHP程序中使用adodb连接不同数据库的代码实例
Dec 19 #PHP
php实现面包屑导航例子分享
Dec 19 #PHP
php实现倒计时效果
Dec 19 #PHP
Thinkphp实现自动验证和自动完成
Dec 19 #PHP
详解WordPress中过滤链接与过滤SQL语句的方法
Dec 18 #PHP
基于ThinkPHP实现批量删除
Dec 18 #PHP
You might like
一个域名查询的程序
2006/10/09 PHP
PHP 超链接 抓取实现代码
2009/06/29 PHP
PHP测试程序运行时间的类
2012/02/05 PHP
PHP修改session_id示例代码
2014/01/08 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
php生成静态html页面的方法(2种方法)
2015/09/14 PHP
js函数的引用, 关于内存的开销
2012/09/17 Javascript
jquery制作漂亮的弹出层提示消息特效
2014/12/23 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
jQuery给元素添加样式的方法详解
2015/12/30 Javascript
通过Tabs方法基于easyUI+bootstrap制作工作站
2016/03/28 Javascript
如何消除inline-block属性带来的标签间间隙
2016/03/31 Javascript
获取input标签的所有属性的方法
2016/06/28 Javascript
微信小程序 实例开发总结
2017/04/26 Javascript
jQuery Collapse1.1.0折叠插件简单使用
2017/08/28 jQuery
实例讲解Vue.js中router传参
2018/04/22 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
2019/05/10 Javascript
vue.js路由mode配置之去掉url上默认的#方法
2019/11/01 Javascript
Vue实现 点击显示再点击隐藏效果(点击页面空白区域也隐藏效果)
2020/01/16 Javascript
vue各种事件监听实例(小结)
2020/06/24 Javascript
详解 javascript对象创建模式
2020/10/30 Javascript
Python3指定路径寻找符合匹配模式文件
2015/05/22 Python
深入学习Python中的上下文管理器与else块
2017/08/27 Python
pyQt4实现俄罗斯方块游戏
2018/06/26 Python
Python 使用type来定义类的实现
2019/11/19 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
html标签之Object和EMBED标签详解
2013/07/04 HTML / CSS
详解HTML5中的元素与元素
2015/08/17 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
高三毕业生自我鉴定
2013/12/20 职场文书
办公室助理岗位职责
2013/12/25 职场文书
初中三好学生事迹材料
2014/01/13 职场文书
采购求职信
2014/03/17 职场文书
学雷锋活动总结范文
2014/04/25 职场文书
2014个人年度工作总结范文
2014/12/24 职场文书