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 高手之路(二)
Oct 09 PHP
ADODB的数据库封包程序库
Dec 31 PHP
php学习之数据类型之间的转换介绍
Jun 09 PHP
奇怪的PHP引用效率问题分析
Mar 23 PHP
一个经典的PHP文件上传类分享
Nov 18 PHP
PHP使用PHPexcel导入导出数据的方法
Nov 14 PHP
Symfony2在Nginx下的配置方法图文教程
Feb 04 PHP
php5.2的curl-bug 服务器被php进程卡死问题排查
Sep 19 PHP
CodeIgniter框架验证码类库文件与用法示例
Mar 18 PHP
Thinkphp5+uploadify实现的文件上传功能示例
May 26 PHP
laravel5.5添加echarts实现画图功能的方法
Oct 09 PHP
php+layui数据表格实现数据分页渲染代码
Oct 26 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 转换字符串编码 iconv与mb_convert_encoding的区别说明
2011/11/10 PHP
php代码书写习惯优化小结
2013/06/20 PHP
php采用file_get_contents代替使用curl实例
2014/11/07 PHP
浅谈php7的重大新特性
2015/10/23 PHP
全面了解PHP中的全局变量
2016/06/17 PHP
Yii 2.0如何使用页面缓存方法示例
2017/05/23 PHP
js中cookie的使用详细分析
2008/05/28 Javascript
ExtJS 2.0 实用简明教程之布局概述
2009/04/29 Javascript
利用WebBrowser彻底解决Web打印问题(包括后台打印)
2009/06/22 Javascript
JavaScript中yield实用简洁实现方式
2010/06/12 Javascript
javascript工具库代码
2012/03/29 Javascript
javascript的字符串按引用复制和传递,按值来比较介绍与应用
2012/12/28 Javascript
基于jquery中children()与find()的区别介绍
2013/04/26 Javascript
javascript实现点击后变换按钮显示文字的方法
2015/05/13 Javascript
javascript实现dom元素可拖动
2016/03/21 Javascript
Bootstrap导航条可点击和鼠标悬停显示下拉菜单
2016/11/25 Javascript
微信小程序实现多个按钮toggle功能的实例
2017/06/13 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
如何使用CSS3和JQuery easing 插件制作绚丽菜单
2019/06/18 jQuery
如何通过shell脚本自动生成vue文件详解
2019/09/10 Javascript
vue + elementUI实现省市县三级联动的方法示例
2019/10/29 Javascript
ES6常用小技巧总结【去重、交换、合并、反转、迭代、计算等】
2019/12/21 Javascript
antd日期选择器禁止选择当天之前的时间操作
2020/10/29 Javascript
vant自定义二级菜单操作
2020/11/02 Javascript
javascript实现放大镜功能
2020/12/09 Javascript
python实现模拟器爬取抖音评论数据的示例代码
2021/01/06 Python
html5 学习简单的拾色器
2010/09/03 HTML / CSS
英国豪华家具和经典家居饰品购物网站:OKA
2020/06/05 全球购物
电子商务专业个人的自我评价
2013/11/19 职场文书
园林专业毕业生自荐信
2014/07/04 职场文书
幼儿园大班毕业评语
2014/12/31 职场文书
花木兰观后感
2015/06/10 职场文书
计算机实训心得体会
2016/01/14 职场文书
九年级历史教学反思
2016/02/19 职场文书
Linux系统下MySQL配置主从分离的步骤
2022/03/21 MySQL
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL