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 相关文章推荐
如何实现给定日期的若干天以后的日期
Oct 09 PHP
apache rewrite_module模块使用教程
Jan 10 PHP
通过PHP CLI实现简单的数据库实时监控调度
Jul 01 PHP
php set_time_limit(0) 设置程序执行时间的函数
May 26 PHP
记录PHP错误日志 display_errors与log_errors的区别
Oct 09 PHP
理解PHP中的stdClass类
Apr 18 PHP
php实现的美国50个州选择列表实例
Apr 20 PHP
yum命令安装php7和相关扩展
Jul 04 PHP
利用switch语句进行多选一判断的实例代码
Nov 14 PHP
PHP实现数据库的增删查改功能及完整代码
Apr 18 PHP
PHP中的访问修饰符简单比较
Feb 02 PHP
thinkphp 框架数据库切换实现方法分析
May 18 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/10/09 PHP
PHP实现文件安全下载
2006/10/09 PHP
PHP日志LOG类定义与用法示例
2018/09/06 PHP
yii 框架实现按天,月,年,自定义时间段统计数据的方法分析
2020/04/04 PHP
javascript页面动态显示时间变化示例代码
2013/12/18 Javascript
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
跟我学Nodejs(二)--- Node.js事件模块
2014/05/21 NodeJs
浅谈javascript属性onresize
2015/04/20 Javascript
jquery+html5时钟特效代码分享(可设置闹钟并且语音提醒)
2020/03/30 Javascript
如何使用jquery修改css中带有!important的样式属性
2016/04/28 Javascript
javascript实现日期三级联动下拉框选择菜单
2020/12/03 Javascript
Three.js基础学习之场景对象
2017/09/27 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
node.js实现为PDF添加水印的示例代码
2018/12/05 Javascript
Vue插槽原理与用法详解
2019/03/05 Javascript
详解在网页上通过JS实现文本的语音朗读
2019/03/28 Javascript
[52:22]EG vs VG Supermajor小组赛B组 BO3 第一场 6.2
2018/06/03 DOTA
Python中实现远程调用(RPC、RMI)简单例子
2014/04/28 Python
简单介绍Python中的struct模块
2015/04/28 Python
python技能之数据导出excel的实例代码
2017/08/11 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
python使用thrift教程的方法示例
2019/03/21 Python
解析python实现Lasso回归
2019/09/11 Python
python读写Excel表格的实例代码(简单实用)
2019/12/19 Python
pycharm全局搜索的具体步骤
2020/07/28 Python
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
请解释在new与override的区别
2012/10/29 面试题
保护地球的标语
2014/06/17 职场文书
捐款活动总结
2014/08/27 职场文书
大学生见习总结报告
2015/06/24 职场文书
创业计划书之川味火锅店
2019/09/02 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
Nginx配置之实现多台服务器负载均衡
2021/08/02 Servers
Go中的条件语句Switch示例详解
2021/08/23 Golang
Javascript 解构赋值详情
2021/11/17 Javascript
mysql5.6主从搭建以及不同步问题详解
2021/12/04 MySQL