详解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实现框架(二)
Oct 09 PHP
mysq GBKl乱码
Nov 28 PHP
php一句话cmdshell新型 (非一句话木马)
Apr 18 PHP
php反射应用示例
Feb 25 PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 PHP
PHP json_encode() 函数详解及中文乱码问题
Nov 05 PHP
php 无限级分类 获取顶级分类ID
Mar 13 PHP
利用PHP如何写APP接口详解
Aug 23 PHP
thinkPHP5 ACL用户权限模块用法详解
May 10 PHP
thinkPHP5框架实现多数据库连接,跨数据连接查询操作示例
May 29 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
Apr 23 PHP
laravel与thinkphp之间的区别与优缺点
Mar 02 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创建PDF中文文档
2006/10/09 PHP
PHP投票系统防刷票判断流程分析
2012/02/04 PHP
PhpMyAdmin出现export.php Missing parameter: what /export_type错误解决方法
2012/08/09 PHP
PHP计数器的实现代码
2013/06/08 PHP
php读取远程gzip压缩网页的方法
2014/12/29 PHP
jQuery学习笔记之jQuery的DOM操作
2010/12/22 Javascript
纯JavaScript实现的兼容各浏览器的添加和移除事件封装
2015/03/28 Javascript
Bootstrap图片轮播组件使用实例解析
2016/06/30 Javascript
Bootstrap编写一个兼容主流浏览器的受众巨幕式风格页面
2016/07/01 Javascript
JavaScript中ES6 Babel正确安装过程
2016/07/18 Javascript
AngularJS 输入验证详解及实例代码
2016/07/28 Javascript
jQuery实现产品对比功能附源码下载
2016/08/09 Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
2016/12/19 Javascript
angular2 ng2-file-upload上传示例代码
2018/08/23 Javascript
Vue中div contenteditable 的光标定位方法
2018/08/25 Javascript
Vue2.0实现组件之间数据交互和通信操作示例
2019/05/16 Javascript
vue实现前台列表数据过滤搜索、分页效果
2019/05/28 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
js实现幻灯片轮播图
2020/08/14 Javascript
[03:11]DOTA2上海特锦赛小组赛第一日recap精彩回顾
2016/02/28 DOTA
[00:59]PWL开团时刻DAY7——我在赶
2020/11/06 DOTA
Python中subprocess模块用法实例详解
2015/05/20 Python
python 批量修改/替换数据的实例
2018/07/25 Python
法国太阳镜店:Sunglasses Shop
2016/08/27 全球购物
英国高街奥特莱斯:Highstreet Outlet
2019/11/21 全球购物
语文教学感言
2014/02/06 职场文书
2014年小学植树节活动方案
2014/03/02 职场文书
企业宣传方案
2014/03/04 职场文书
应聘教师自荐书
2014/06/16 职场文书
关于有小孩的离婚协议书
2014/10/26 职场文书
单位收入证明范本
2015/06/18 职场文书
食堂管理制度范本
2015/08/04 职场文书
大学毕业生自我鉴定范文
2019/06/21 职场文书
MySQL如何构建数据表索引
2021/05/13 MySQL
Spring Cloud 中@FeignClient注解中的contextId属性详解
2021/09/25 Java/Android
教你使用Ubuntu搭建DNS服务器
2022/09/23 Servers