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 正则 过滤html 的超链接
Jun 02 PHP
Apache2中实现多网站域名绑定的实现方法
Jun 01 PHP
浅析php中如何在有限的内存中读取大文件
Jul 02 PHP
php用正则表达式匹配URL的简单方法
Nov 12 PHP
PHP mail()函数使用及配置方法
Jan 14 PHP
destoon数据库表说明汇总
Jul 15 PHP
php开发工具有哪五款
Nov 09 PHP
PHP接收App端发送文件流的方法
Sep 23 PHP
php array_map使用自定义的函数处理数组中的每个值
Oct 26 PHP
PHP面向对象多态性实现方法简单示例
Sep 27 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
Oct 25 PHP
Yii框架多语言站点配置方法分析【中文/英文切换站点】
Apr 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函数代码
2013/08/29 PHP
PHP两种快速排序算法实例
2015/02/15 PHP
php实现数组中索引关联数据转换成json对象的方法
2015/07/08 PHP
Add a Table to a Word Document
2007/06/15 Javascript
情人节专属 纯js脚本1k大小的3D玫瑰效果
2012/02/11 Javascript
jquery动画1.加载指示器
2012/08/24 Javascript
Raphael一个用于在网页中绘制矢量图形的Javascript库
2013/01/08 Javascript
JavaScript prototype 使用介绍
2013/08/29 Javascript
JS实用的动画弹出层效果实例
2015/05/05 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
javascript常用函数(2)
2015/11/05 Javascript
jquery ajax分页插件的简单实现
2016/01/27 Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
2016/07/09 Javascript
jQuery实现的简单获取索引功能示例
2018/06/04 jQuery
JavaScript数据结构与算法之基本排序算法定义与效率比较【冒泡、选择、插入排序】
2019/02/21 Javascript
简单说说如何使用vue-router插件的方法
2019/04/08 Javascript
vue实现路由懒加载及组件懒加载的方式
2019/06/11 Javascript
微信小程序图片右边加两行文字的代码
2020/04/23 Javascript
jQuery实现回到顶部效果
2020/10/19 jQuery
在vue中获取wangeditor的html和text的操作
2020/10/23 Javascript
解决nuxt页面中mounted、created、watch执行两遍的问题
2020/11/05 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
用python 制作图片转pdf工具
2015/01/30 Python
Python学习思维导图(必看篇)
2017/06/26 Python
Python3.5.3下配置opencv3.2.0的操作方法
2018/04/02 Python
pygame游戏之旅 如何制作游戏障碍
2018/11/20 Python
10 分钟快速入门 Python3的教程
2019/01/29 Python
seek引发的python文件读写的问题及解决
2019/07/26 Python
使用python代码进行身份证号校验的实现示例
2019/11/21 Python
pytorch 实现cross entropy损失函数计算方式
2020/01/02 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
在线购买廉价折扣书籍和小说:BookOutlet.com
2018/02/19 全球购物
2014端午节活动策划方案
2014/01/27 职场文书
党员创先争优承诺书
2014/03/26 职场文书
2015年教师节主持词
2015/07/03 职场文书
导游词之大雁塔景区
2019/09/17 职场文书