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 存取 MySQL 数据库的一个例子
Oct 09 PHP
php radio 单选框获取与保持值的实现代码
May 15 PHP
PHP游戏编程25个脚本代码
Feb 08 PHP
PHP删除数组中的特定元素的代码
Jun 28 PHP
基于PHP遍历数组的方法汇总分析
Jun 08 PHP
PHP中使用Imagick操作PSD文件实例
Jan 26 PHP
PHP中的类型约束介绍
May 11 PHP
ThinkPHP中where()使用方法详解
Apr 19 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
May 11 PHP
php和html的区别点详细总结
Sep 24 PHP
php7 图形用户界面GUI 开发示例
Feb 22 PHP
如何用Laravel包含你自己的帮助函数
May 27 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更新mysql后获取影响的行数发生异常解决方法
2013/03/28 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
列表内容的选择
2006/06/30 Javascript
Prototype Array对象 学习
2009/07/19 Javascript
读jQuery之十二 删除事件核心方法
2011/07/31 Javascript
基于jQuery的前端数据通用验证库
2011/08/08 Javascript
jquery.tmpl JQuery模板插件
2011/10/10 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
Jquery加载时从后台读取数据绑定到dropdownList实例
2013/06/09 Javascript
js模拟点击以提交表单为例兼容主流浏览器
2013/11/29 Javascript
javascript实现简单的进度条
2015/07/02 Javascript
jquery ztree异步搜索(搜叶子)实践
2016/02/25 Javascript
JS组件Bootstrap导航条使用方法详解
2016/04/29 Javascript
Bootstrap3 内联单选和多选框
2016/12/29 Javascript
简单实现js无缝滚动效果
2017/02/05 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
webpack里使用jquery.mCustomScrollbar插件的方法
2018/05/30 jQuery
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
[02:52]2017DOTA2国际邀请赛中国区预选赛晋级之路
2017/07/03 DOTA
[59:30]VG vs LGD 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.22
2019/09/05 DOTA
Python基于ThreadingTCPServer创建多线程代理的方法示例
2018/01/11 Python
Django中如何防范CSRF跨站点请求伪造攻击的实现
2019/04/28 Python
python 列表中[ ]中冒号‘:’的作用
2019/04/30 Python
python笔记之mean()函数实现求取均值的功能代码
2019/07/05 Python
django解决订单并发问题【推荐】
2019/07/31 Python
使用python+whoosh实现全文检索
2019/12/09 Python
如何基于线程池提升request模块效率
2020/04/18 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
win10下python3.8的PIL库安装过程
2020/06/08 Python
DNA基因检测和分析:23andMe
2019/05/01 全球购物
戴森英国官网:Dyson英国
2019/05/07 全球购物
党的群众路线教育实践活动个人对照检查材料(公安)
2014/11/05 职场文书
个人年终总结开头
2015/03/06 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
老公出轨后的保证书
2015/05/08 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书