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 分页原理详解
Aug 21 PHP
php压缩HTML函数轻松实现压缩html/js/Css及注意事项
Jan 27 PHP
如何利用php array_multisort函数 对数据库结果进行复杂排序
Jun 08 PHP
关于JSON以及JSON在PHP中的应用技巧
Nov 27 PHP
php 启动时报错的简单解决方法
Jan 27 PHP
php根据年月获取季度的方法
Mar 31 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
smarty缓存用法分析
Dec 16 PHP
php下pdo的mysql事务处理用法实例
Dec 27 PHP
PHP实现递归复制整个文件夹的类实例
Aug 03 PHP
PHP实现发送邮件的方法(基于简单邮件发送类)
Dec 17 PHP
CI框架教程之优化验证码机制详解【验证码辅助函数】
Apr 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
CodeIgniter错误mysql_connect(): No such file or directory解决方法
2014/09/06 PHP
Zend Framework教程之Zend_Controller_Plugin插件用法详解
2016/03/07 PHP
PHP 芝麻信用接入的注意事项
2016/12/01 PHP
JavaScript获取GridView选择的行内容
2009/04/14 Javascript
基于jquery的气泡提示效果
2010/05/31 Javascript
基于jQuery的一个扩展form序列化到json对象
2010/12/09 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
javascript firefox 自动加载iframe 自动调整高宽示例
2013/08/27 Javascript
jquery判断密码强度的验证代码
2020/04/22 Javascript
深入理解js promise chain
2016/05/05 Javascript
AngularJS 模块化详解及实例代码
2016/09/14 Javascript
express文件上传中间件Multer详解
2016/10/24 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
微信禁止下拉查看URL的处理方法
2017/09/28 Javascript
详解swipe使用及竖屏页面滚动方法
2018/06/28 Javascript
使用Vue.set()方法实现响应式修改数组数据步骤
2019/11/09 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
wxpython 学习笔记 第一天
2009/03/16 Python
Python全局变量操作详解
2015/04/14 Python
在Python中使用全局日志时需要注意的问题
2015/05/06 Python
在Python中操作字典之update()方法的使用
2015/05/22 Python
Django框架的使用教程路由请求响应的方法
2018/07/03 Python
通过pykafka接收Kafka消息队列的方法
2018/12/27 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
基于python纯函数实现井字棋游戏
2020/05/27 Python
浅谈Keras参数 input_shape、input_dim和input_length用法
2020/06/29 Python
浅谈pandas dataframe对除数是零的处理
2020/07/20 Python
CSS3+js实现简单的时钟特效
2015/03/18 HTML / CSS
娇韵诗法国官网:Clarins法国
2019/01/29 全球购物
优秀辅导员事迹材料
2014/02/16 职场文书
写字楼租赁意向书
2014/07/30 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
幼儿园教师节感谢信
2015/01/23 职场文书
中学教师读书笔记
2015/07/01 职场文书
工作总结之小学教师体育工作范文(3篇)
2019/10/07 职场文书
MySQL 时间类型的选择
2021/06/05 MySQL