详解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 相关文章推荐
模拟OICQ的实现思路和核心程序(二)
Oct 09 PHP
劣质的PHP代码简化
Feb 08 PHP
php自动注册登录验证机制实现代码
Dec 20 PHP
php array的学习笔记
May 10 PHP
浅析php插件 Simple HTML DOM 用DOM方式处理HTML
Jul 01 PHP
PHP远程采集图片详细教程
Jul 01 PHP
PHP通过API获取手机号码归属地
May 28 PHP
thinkPHP模板算术运算相关函数用法分析
Jul 12 PHP
PHP入门教程之上传文件实例详解
Sep 11 PHP
PHP ADODB实现分页功能简单示例
May 25 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
Jan 17 PHP
Laravel 微信小程序后端实现用户登录的示例代码
Nov 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文件上传实例详解!!!
2007/01/02 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
PHP读取txt文本文件并分页显示的方法
2015/03/11 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
PHP中如何使用session实现保存用户登录信息
2015/10/20 PHP
php设计模式之观察者模式定义与用法经典示例
2019/09/19 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
关于javascript 回调函数中变量作用域的讨论
2009/09/11 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
JQuery AJAX 中文乱码问题解决
2013/06/05 Javascript
jquery 实现窗口的最大化不论什么情况
2013/09/03 Javascript
node.js中的path.basename方法使用说明
2014/12/09 Javascript
Jquery基础之事件操作详解
2016/06/14 Javascript
jQuery实现查找链接文字替换属性的方法
2016/06/27 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
2016/11/25 Javascript
[原创]SyntaxHighlighter自动识别并加载脚本语言
2017/02/07 Javascript
Javascript中字符串相关常用的使用方法总结
2017/03/13 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
[js高手之路]原型式继承与寄生式继承详解
2017/08/28 Javascript
vue2.0设置proxyTable使用axios进行跨域请求的方法
2017/10/19 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
webpack项目调试以及独立打包配置文件的方法
2018/02/28 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
vue接口请求加密实例
2020/08/11 Javascript
python win32 简单操作方法
2017/05/25 Python
Python查看微信撤回消息代码
2018/06/07 Python
Python3爬虫全国地址信息
2019/01/05 Python
实例讲解使用CSS实现多边框和透明边框的方法
2015/09/08 HTML / CSS
FORZIERI澳大利亚站:全球顶级奢华配饰精品店
2016/12/31 全球购物
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
机械制造专业毕业生求职信
2014/03/02 职场文书
光信息科学与技术专业职业生涯规划
2014/03/13 职场文书
辞职书格式样本
2015/02/26 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
Python中OpenCV实现查找轮廓的实例
2021/06/08 Python
启动Tomcat时出现大量乱码的解决方法
2021/06/21 Java/Android