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的session cookie错误
Aug 09 PHP
php foreach、while性能比较
Oct 15 PHP
PHP 一个比较完善的简单文件上传
Mar 25 PHP
php实现MD5加密16位(不要默认的32位)
Aug 12 PHP
PHP获取文件夹内文件数的方法
Mar 12 PHP
jquery不支持toggle()高(新)版本的问题解决
Sep 24 PHP
PHP标准类(stdclass)用法示例
Sep 28 PHP
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
Dec 14 PHP
php 三元运算符实例详细介绍
Dec 15 PHP
PHP单例模式与工厂模式详解
Aug 29 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
详解php用static方法的原因
Sep 12 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
2020年4月新番动漫目录 官方宣布4月播出的作品一览
2020/03/08 日漫
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
利用PHP实现与ASP Banner组件相似的类
2006/10/09 PHP
php.ini中的php-5.2.0配置指令详解
2008/03/27 PHP
PHP中创建图像并绘制文字的例子
2014/11/19 PHP
php 流程控制switch的简单实例
2016/06/07 PHP
thinkPHP5框架导出Excel文件简单操作示例
2018/08/03 PHP
解决laravel(5.5)访问public报错的问题
2019/10/12 PHP
用javascript操作xml
2006/11/04 Javascript
学习ExtJS(一) 之基础前提
2009/10/07 Javascript
JS request函数 用来获取url参数
2010/05/17 Javascript
ASP.NET jQuery 实例11 通过使用jQuery validation插件简单实现用户登录页面验证功能
2012/02/03 Javascript
js中的前绑定和后绑定详解
2013/08/01 Javascript
jquery 简单应用示例总结
2013/08/09 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
jQuery中$.ajax()方法参数解析
2016/10/22 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
微信小程序多张图片上传功能
2017/06/07 Javascript
JavaScript Date对象应用实例分享
2017/10/30 Javascript
TypeScript中的方法重载详解
2019/04/12 Javascript
laydate只显示时分 不显示秒的功能实现方法
2019/09/28 Javascript
vuex实现数据状态持久化
2019/11/11 Javascript
Python中的Numpy入门教程
2014/04/26 Python
详解python之简单主机批量管理工具
2017/01/27 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
Django开发中的日志输出的方法
2018/07/02 Python
Python实现统计英文文章词频的方法分析
2019/01/28 Python
Pytorch之Variable的用法
2019/12/31 Python
python中四舍五入的正确打开方式
2021/01/18 Python
兰蔻俄罗斯官方网站:Lancome俄罗斯
2019/12/09 全球购物
水污染治理专业毕业生推荐信
2013/11/14 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
关于感恩的演讲稿500字
2014/08/26 职场文书
2014大学校园光棍节活动策划书
2014/09/29 职场文书
2015年仓库管理员工作总结
2015/04/21 职场文书