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编写大型网站问题集
Mar 06 PHP
Win2003服务器安全加固设置--进一步提高服务器安全性
May 23 PHP
隐性调用php程序的方法
Mar 09 PHP
PHP中将数组转成XML格式的实现代码
Aug 08 PHP
php多个文件及图片上传实例详解
Nov 10 PHP
php生成静态html页面的方法(2种方法)
Sep 14 PHP
PHP弹出对话框技巧详细解读
Sep 26 PHP
浅谈PHP的反射API
Feb 26 PHP
yii2中LinkPager增加总页数和总记录数的实例
Aug 28 PHP
thinkphp5 migrate数据库迁移工具
Feb 20 PHP
php中访问修饰符的知识点总结
Jan 27 PHP
PHP 扩展Memcached命令用法实例总结
Jun 04 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动态生成虚拟现实VRML网页
2006/10/09 PHP
PHP 字符串编码截取函数(兼容utf-8和gb2312)
2009/05/02 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
php计算两个日期相差天数的方法
2015/03/14 PHP
精心挑选的12款优秀的基于jQuery的手风琴效果插件和教程
2012/08/22 Javascript
JavaScript执行效率与性能提升方案
2012/12/21 Javascript
无闪烁更新网页内容JS实现
2013/12/19 Javascript
使用text方法获取Html元素文本信息示例
2014/09/01 Javascript
node.js使用npm 安装插件时提示install Error: ENOENT报错的解决方法
2014/11/20 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
使用Angular和Nodejs、socket.io搭建聊天室及多人聊天室
2015/08/21 NodeJs
js实现继承的5种方式
2015/12/01 Javascript
React简单介绍
2017/05/24 Javascript
Nodejs模块载入运行原理
2018/02/23 NodeJs
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
Angular PWA使用的Demo示例
2019/01/31 Javascript
vuejs+element UI table表格中实现禁用部分复选框的方法
2019/09/20 Javascript
使用vscode快速建立vue模板过程详解
2019/10/10 Javascript
浅谈element中InfiniteScroll按需引入的一点注意事项
2020/06/05 Javascript
python Crypto模块的安装与使用方法
2017/12/21 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
如何获取Python简单for循环索引
2019/11/21 Python
Python 如何对文件目录操作
2020/07/10 Python
matplotlib bar()实现百分比堆积柱状图
2021/02/24 Python
Foot Locker英国官网:美国知名运动产品零售商
2019/02/21 全球购物
Tom Dixon官网:英国照明及家具设计和制造公司
2019/03/01 全球购物
个性化皮包、小袋、生活配件:Mon Purse
2019/03/26 全球购物
农行实习自我鉴定
2013/09/22 职场文书
创伤外科专业推荐信范文
2013/11/19 职场文书
农民入党思想汇报
2014/01/03 职场文书
2014年情人节活动方案
2014/02/16 职场文书
质检员岗位职责范本
2015/04/07 职场文书
汽车销售员工作总结
2015/08/12 职场文书
JS监听Esc 键触发事键
2021/04/14 Javascript
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android