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 相关文章推荐
mysql 字段类型说明
Apr 27 PHP
在命令行下运行PHP脚本[带参数]的方法
Jan 22 PHP
php数组函数序列之array_values() 获取数组元素值的函数与方法
Oct 30 PHP
PHP中图片等比缩放的实例
Mar 24 PHP
解析php防止form重复提交的方法
Jul 01 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
Sep 16 PHP
php获取根域名方法汇总
Oct 28 PHP
php数字每三位加逗号的功能函数
Oct 22 PHP
php设计模式之单例模式代码
Jun 11 PHP
PHP实现的堆排序算法详解
Aug 17 PHP
laravel 中某一字段自增、自减的例子
Oct 11 PHP
用php如何解决大文件分片上传问题
Jul 07 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中防止SQL注入实现代码
2011/02/19 PHP
MySql数据库查询结果用表格输出PHP代码示例
2015/03/20 PHP
php使用gzip压缩传输js和css文件的方法
2015/07/29 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
PHP Ajax实现无刷新附件上传
2016/08/17 PHP
JSON PHP中,Json字符串反序列化成对象/数组的方法
2018/05/31 PHP
Javascript开发包大全整理
2006/12/22 Javascript
JavaScript 拖拉缩放效果
2008/12/10 Javascript
JQuery,Extjs,YUI,Prototype,Dojo 等JS框架的区别和应用场景简述
2010/04/15 Javascript
JavaScript性能优化 创建文档碎片(document.createDocumentFragment)
2010/07/13 Javascript
突发奇想的一个jquery插件
2010/11/19 Javascript
ExtJs默认的字体大小改变的几种方法(自己整理)
2013/04/18 Javascript
jquery禁止回车触发表单提交
2014/12/12 Javascript
理解和运用JavaScript的闭包机制
2015/08/13 Javascript
jQuery蓝色风格滑动导航栏代码分享
2015/08/19 Javascript
JavaScript中字面量与函数的基本使用知识
2015/10/20 Javascript
javascript实现方法调用与方法触发小结
2016/03/26 Javascript
网页爬虫之cookie自动获取及过期自动更新的实现方法
2018/03/06 Javascript
vue写一个组件
2018/04/09 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
浅谈layer弹出层按钮颜色修改方法
2019/09/11 Javascript
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
Python中使用装饰器时需要注意的一些问题
2015/05/11 Python
Python BeautifulSoup [解决方法] TypeError: list indices must be integers or slices, not str
2019/08/07 Python
Python使用扩展库pywin32实现批量文档打印实例
2020/04/09 Python
CSS3制作彩色进度条样式的代码示例分享
2016/06/23 HTML / CSS
台湾流行服饰购物平台:OB严选
2018/01/21 全球购物
嘻哈珠宝品牌:KRKC&CO
2020/10/19 全球购物
学生鉴定评语大全
2014/05/05 职场文书
关于保护环境的建议书
2014/08/26 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
森马旗舰店双十一营销方案
2014/09/29 职场文书
租车协议书范本2014
2014/11/17 职场文书
2019自荐信该如何写呢?
2019/07/05 职场文书
Nginx+Tomcat负载均衡集群的实现示例
2021/10/24 Servers