详解WordPress中的头像缓存和代理中的缓存更新方法


Posted in PHP onMarch 01, 2016

wordpress评论中的头像是使用Gravatar的头像服务(Gravatar官方注册地址:http://en.gravatar.com),用户的缓存头像一般都是固定不变的,所以我们可以将头像缓存到本地来提高我们网站的访问速度。
我的wordpress avatar目录的头像缓存:

详解WordPress中的头像缓存和代理中的缓存更新方法

wordpress头像缓存功能设置方法
首先是在根目录下建立一个文件夹avatar,权限755。再在里面放一个默认的头像(default.jpg),没头像的童鞋就会用默认的。代码如下:

function my_avatar( $email, $size = '32', $default = '', $alt = '') {
 $f = md5( strtolower( $email ) );
 $a = WP_CONTENT_URL . '/avatar/'. $f . $size . '.png';
 $e = WP_CONTENT_DIR . '/avatar/' . $f . $size . '.png';
 $d = WP_CONTENT_DIR . '/avatar/' . $f . '-d.png';

 if($default=='')
  $default = 'http://www.wpnoob.cn/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);
}

再将以上代码添加到你主题的functions.php文件。
将获取头像地址的 get_avatar 函数替换为 my_avatar 。有个例外,functions.php评论列表函数中:

get_avatar( $comment

需要改成:

my_avatar( $comment->comment_author_email

因为my_avatar函数只能通过Email来调取用户头像,所以以上情况,需要将第一个参数改成email地址。

get_avatar函数介绍:
用上面的方法简单方便啊。 不过还有一步是要注意的。得要确认在调用头像的地方都是用get_avatar函数来完成的。一般都是了,只有以前老的theme才不是。不是的话改过来就行。

如改为:

<?php
 echo get_avatar( $comment->comment_author_email, $size = '48', $default = get_bloginfo('wpurl') . '/avatar/default.jpg' ); 
?>

代理(squid)中更新css/js文件缓存的方法
在wordpress添加css或者js文件,我们一般使用这四个函数来实现:

  •  wp_enqueue_script()
  •  wp_enqueue_style()
  •  wp_register_script()
  •  wp_register_style()

函数中你可以定义css/js的版本号,以便我们在对css/js文件更新时能够清楚浏览器的缓存,默认的版本号是wordpress的版本号。版本号会链接在css/js完整路径的后面,一般在版本号变更后,css/js载入的样式的完整URL也会变更,浏览器发现URL变更会重新请求css/js文件,这样就能达到载入最新的css/js文件。

但是很多代理软件(比如squid)并不支持”?“号形式的cache,我们在使用反向代理来cache我们的网站时,特别在squid3.0以后,已经开始不对带”?”号的url进行缓存了。所以我们如果要使用squid的缓存功能就必须去掉”?”,更新squid代理商的缓存只能通过修改文件名来实现。

以下我们将介绍在wordpress通过对版本号的控制来修改js/css文件名从而能够在代理软件中达到缓存的目的:
1、在我们的主题代码functions.php文件中添加如下代码:

/** 
 * Description: wordpress在代理(squid)中更新css/js文件缓存的方法
 * Author:wordpress教程网
 * Author URI: http://www.wpnoob.cn/
 */
function ds_filename_based_cache_busting( $src ) {
 // 管理员的后台css/js文件无需处理
 if ( is_admin() )
 return $src;
 //将版本号添加到文件名中已”.“号来区分
 return preg_replace(
 '/\.(js|css)\?ver=(.+)$/',
 '.$2.$1',
 $src
 );
}
add_filter( 'script_loader_src', 'ds_filename_based_cache_busting' );
add_filter( 'style_loader_src', 'ds_filename_based_cache_busting' );

如果你使用的是apache服务器,在你的根目录的.htaccess文件下添加:

<IfModule mod_rewrite.c>
   RewriteEngine On
   RewriteBase /
 
   RewriteCond %{REQUEST_FILENAME} !-f
   RewriteCond %{REQUEST_FILENAME} !-d
   RewriteRule ^(.+)\.(.+)\.(js|css)$ $1.$3 [L]
</IfModule>

 
如果你是nginx服务器配置如下:

location ~ ^(.+)\.(.+)\.(js|css)$ {
  alias $1.$3;
}
PHP 相关文章推荐
最省空间的计数器
Oct 09 PHP
PHP5新特性: 更加面向对象化的PHP
Nov 18 PHP
PHP编程中八种常见的文件操作方式
Nov 19 PHP
PHP中的日期及时间
Nov 23 PHP
Smarty Foreach 使用说明
Mar 23 PHP
PHP file_exists问题杂谈
May 07 PHP
php将文本文件转换csv输出的方法
Dec 31 PHP
php使用递归函数实现数字累加的方法
Mar 16 PHP
PHP生成唯一订单号的方法汇总
Apr 16 PHP
浅析iis7.5安装配置php环境
May 10 PHP
详解Grunt插件之LiveReload实现页面自动刷新(两种方案)
Jul 31 PHP
laravel 验证错误信息到 blade模板的方法
Sep 29 PHP
php编程每天必学之表单验证
Mar 01 #PHP
实例讲解PHP设计模式编程中的简单工厂模式
Feb 29 #PHP
PHP Try-catch 语句使用技巧
Feb 28 #PHP
linux下为php添加iconv模块的方法
Feb 28 #PHP
PHP中模拟链表和链表的基本操作示例
Feb 27 #PHP
PHP使用Memcache时模拟命名空间及缓存失效问题的解决
Feb 27 #PHP
简单谈谈PHP中strlen 函数
Feb 27 #PHP
You might like
php面向对象全攻略 (十五) 多态的应用
2009/09/30 PHP
非常好用的两个PHP函数 serialize()和unserialize()
2012/02/04 PHP
解析php多线程下载远程多个文件
2013/06/25 PHP
php实现将Session写入数据库
2015/07/26 PHP
js escape,unescape解决中文乱码问题的方法
2010/05/26 Javascript
基于JQUERY的两个ListBox子项互相调整的实现代码
2011/05/07 Javascript
重构Javascript代码示例(重构前后对比)
2013/01/23 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
javascript避免数字计算精度误差的方法详解
2014/03/05 Javascript
jQuery中insertBefore()方法用法实例
2015/01/08 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
JavaScript时间操作之年月日星期级联操作
2016/01/15 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
Angular实现下拉框模糊查询功能示例
2018/01/03 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
[43:57]Liquid vs Mineski 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/19 DOTA
Python基于PycURL自动处理cookie的方法
2015/07/25 Python
举例讲解Python中的Null模式与桥接模式编程
2016/02/02 Python
python日志记录模块实例及改进
2017/02/12 Python
python 统计数组中元素出现次数并进行排序的实例
2018/07/02 Python
Python数据类型之Set集合实例详解
2019/05/07 Python
Python代理IP爬虫的新手使用教程
2019/09/05 Python
法国在线宠物店:zooplus.fr
2018/02/23 全球购物
迪士尼法国在线商店:shopDisney FR
2020/12/03 全球购物
写一个函数,求一个字符串的长度。在main函数中输入字符串,并输出其长度
2015/11/18 面试题
公司会议策划方案
2014/05/17 职场文书
酒店服务员岗位职责
2015/02/09 职场文书
2015年财政所工作总结
2015/04/25 职场文书
中学感恩教育活动总结
2015/05/05 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
anaconda python3.8安装后降级
2021/06/11 Python
Lombok的详细使用及优缺点总结
2021/07/15 Java/Android
python turtle绘图
2022/05/04 Python
mysql函数之截取字符串的实现
2022/08/14 MySQL