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 相关文章推荐
UTF8编码内的繁简转换的PHP类
Jul 09 PHP
PHP导入Excel到MySQL的方法
Apr 23 PHP
PHP 利用AJAX获取网页并输出的实现代码(Zjmainstay)
Aug 31 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
Apr 25 PHP
php多任务程序实例解析
Jul 19 PHP
php中mt_rand()随机数函数用法
Nov 24 PHP
dedecms集成财付通支付接口
Dec 28 PHP
php将字符串全部转换成大写或者小写的方法
Mar 17 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
php构造函数与析构函数
Apr 23 PHP
php自定义时间转换函数示例
Dec 07 PHP
微信公众号实现会员卡领取功能
Jun 08 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
如何使用PHP中的字符串函数
2006/11/24 PHP
php实现递归抓取网页类实例
2015/04/03 PHP
JavaScript 动态改变图片大小
2009/06/11 Javascript
js 中 document.createEvent的用法
2010/08/29 Javascript
js运动应用实例解析
2015/12/28 Javascript
JavaScript过滤字符串中的中文与空格方法汇总
2016/03/07 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
Svg.js实例教程及使用手册详解(一)
2016/05/16 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
详解angularJs中自定义directive的数据交互
2017/01/13 Javascript
详解使用JS如何制作简单的ASCII图与单极图
2017/03/31 Javascript
详解vue-router 路由元信息
2017/09/13 Javascript
vue中当图片地址无效的时候,显示默认图片的方法
2018/09/18 Javascript
JS中验证整数和小数的正则表达式
2018/10/08 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
JS原型对象操作实例分析
2020/06/06 Javascript
JavaScript实现轮播图效果
2020/10/30 Javascript
[14:20]刀塔大凶女神互压各路奇葩屌丝
2014/05/16 DOTA
Python实现发送email的几种常用方法
2014/08/18 Python
Ubuntu 14.04+Django 1.7.1+Nginx+uwsgi部署教程
2014/11/18 Python
详解Python的Flask框架中生成SECRET_KEY密钥的方法
2016/06/07 Python
Python利用递归和walk()遍历目录文件的方法示例
2017/07/14 Python
对Python中9种生成新对象的方法总结
2018/05/23 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Django框架实现的普通登录案例【使用POST方法】
2019/05/15 Python
python网络编程之多线程同时接受和发送
2019/09/03 Python
django orm模块中的 is_delete用法
2020/05/20 Python
记一次Django响应超慢的解决过程
2020/09/17 Python
农村党支部先进事迹
2014/01/14 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
优秀毕业生推荐信范文
2014/03/07 职场文书
信息简报范文
2015/07/21 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
创业计划书之婴幼儿游泳馆
2019/09/11 职场文书
Java8中接口的新特性使用指南
2021/11/01 Java/Android
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis