详解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 相关文章推荐
用PHP+java实现自动新闻滚动窗口
Oct 09 PHP
PHP的基本常识小结
Jul 05 PHP
php生成EAN_13标准条形码实例
Nov 13 PHP
php实例分享之mysql数据备份
May 19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十四)
Jun 26 PHP
PHP多进程编程实例
Oct 15 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
php实现修改新闻时删除图片的方法
May 12 PHP
php进行ip地址掩码运算处理的方法
Jul 11 PHP
PHP生成短网址方法汇总
Jul 12 PHP
Yii框架中sphinx索引配置方法解析
Oct 18 PHP
Yii框架ACF(accessController)简单权限控制操作示例
Apr 26 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 文件上传类代码
2011/08/06 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
2014/11/17 PHP
PHP实现算式验证码和汉字验证码实例
2015/03/09 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
Nigma vs AM BO3 第一场2.13
2021/03/10 DOTA
javascript TextArea动态显示剩余字符
2008/10/22 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
javascript之querySelector和querySelectorAll使用介绍
2011/12/20 Javascript
js选取多个或单个元素的实现代码(用class)
2012/08/22 Javascript
jQuery计算textarea中文字数(剩余个数)的小程序
2013/11/28 Javascript
node.js中的buffer.toString方法使用说明
2014/12/14 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
js获取表格的行数和列数的方法
2015/10/23 Javascript
利用JS实现页面删除并重新排序功能
2016/12/09 Javascript
javascript验证香港身份证的格式或真实性
2017/02/07 Javascript
详解js的异步编程技术的方法
2017/02/09 Javascript
Angular如何在应用初始化时运行代码详解
2018/06/11 Javascript
使用vuex解决刷新页面state数据消失的问题记录
2019/05/08 Javascript
js实现上下左右键盘控制div移动
2020/01/16 Javascript
[06:33]DOTA2亚洲邀请赛小组赛第二日 TOP10精彩集锦
2015/01/31 DOTA
[43:03]完美世界DOTA2联赛PWL S2 PXG vs Magma 第二场 11.21
2020/11/24 DOTA
零基础写python爬虫之抓取百度贴吧并存储到本地txt文件改进版
2014/11/06 Python
简单介绍Python中的struct模块
2015/04/28 Python
python字典键值对的添加和遍历方法
2016/09/11 Python
python实现csv格式文件转为asc格式文件的方法
2018/03/23 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
python处理document文档保留原样式
2019/09/23 Python
使用Python制作一盏 3D 花灯喜迎元宵佳节
2021/02/26 Python
CSS3正方体旋转示例代码
2013/08/08 HTML / CSS
Bibloo匈牙利:女装、男装、童装及鞋子和配饰
2019/04/14 全球购物
公司综合部的成员自我评价分享
2013/11/05 职场文书
师范应届毕业生自荐信
2013/11/18 职场文书
12.4全国法制宣传日活动方案
2014/11/02 职场文书
数学教师求职信范文
2015/03/20 职场文书
pytorch损失反向传播后梯度为none的问题
2021/05/12 Python
MySQL GTID复制的具体使用
2022/05/20 MySQL