详解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 MYSQL 数据备份类
Jun 19 PHP
thinkphp3.0 模板中函数的使用
Nov 13 PHP
php生成zip压缩文件的方法详解
Jun 09 PHP
PHP轻量级数据库操作类Medoo增加、删除、修改、查询例子
Jul 04 PHP
PHP实现对文本数据库的常用操作方法实例演示
Jul 04 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
PHP经典面试题之设计模式(经常遇到)
Oct 15 PHP
CentOS下搭建PHP环境与WordPress博客程序的全流程总结
May 07 PHP
PHP数组内存利用率低和弱类型详细解读
Aug 10 PHP
阿里云Win2016安装Apache和PHP环境图文教程
Mar 11 PHP
PHP二维索引数组的遍历实例分析【2种方式】
Jun 24 PHP
深入解析PHP底层机制及相关原理
Dec 11 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
谈一谈收音机的高放电路
2021/03/02 无线电
php下使用curl模拟用户登陆的代码
2010/09/10 PHP
供参考的 php 学习提高路线分享
2011/10/23 PHP
php获取客户端电脑屏幕参数的方法
2015/01/09 PHP
php字符串比较函数用法小结(strcmp,strcasecmp,strnatcmp及strnatcasecmp)
2016/07/18 PHP
js parseInt(&quot;08&quot;)未指定进位制问题
2010/06/19 Javascript
javascript中的缓动效果实现程序
2012/12/29 Javascript
javascript判断两个IP地址是否在同一个网段的实现思路
2013/12/13 Javascript
jQuery三级下拉列表导航菜单代码分享
2020/04/15 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
一种Javascript解释ajax返回的json的好方法(推荐)
2016/06/02 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
vue鼠标移入添加class样式,鼠标移出去除样式(active)实现方法
2018/08/22 Javascript
vue设置导航栏、侧边栏为公共页面的例子
2019/11/01 Javascript
JS实现购物车基本功能
2020/11/08 Javascript
vue 解决mintui弹窗弹起来,底部页面滚动bug问题
2020/11/12 Javascript
Python查询阿里巴巴关键字排名的方法
2015/07/08 Python
Windows中安装使用Virtualenv来创建独立Python环境
2016/05/31 Python
python实现微信自动回复功能
2018/04/11 Python
Python实现的多进程和多线程功能示例
2018/05/29 Python
Flask框架URL管理操作示例【基于@app.route】
2018/07/23 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
mac系统下Redis安装和使用步骤详解
2019/07/09 Python
简单介绍python封装的基本知识
2019/08/10 Python
基于YUV 数据格式详解及python实现方式
2019/12/09 Python
python类中super() 的使用解析
2019/12/19 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
HTML5录音实践总结(Preact)
2020/05/07 HTML / CSS
HTML5超文本标记语言的实现方法
2020/09/24 HTML / CSS
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
优秀中专生推荐信
2013/11/17 职场文书
销售演讲稿范文
2014/01/08 职场文书
我的中国梦演讲稿600字
2014/08/19 职场文书
golang实现浏览器导出excel文件功能
2022/03/25 Golang
Innodb存储引擎中的后台线程详解
2022/04/03 MySQL