文档章节

wordpress功能集成(五):无插件实现头像缓存

drewin
 drewin
发布于 2013/05/14 23:40
字数 953
阅读 98
收藏 6

我想尽量将所有wordpress过滤器的应用教程都放在一堆,wordpress的头像都是有第三方网站提供的,这样有有点也有缺点,缺点:有的地方打开gravatar比较慢,还有的人根本打不开这个网站,那样的话,头像都显示不了,所以我们将头像图片保存在网站服务器上,在访客留言中输出头像之前,先检查一下,服务器上是否已经保存了这个头像文件?如果保存了就不用链接到gravatar网站了。

首先我们需要知道wordpress是怎样获取头像的,我们获取评论列表使用的函数为:wp_list_comments(),该函数位于wp-includes/comment-template.php文件,这个函数中的代码知识一些判断代码真正数去评论的是类Walker_Comment,这个类的定义也在comment-template.php文件,这个类中输出头像就是使用的get_avatar()函数,get_avatar函数位于wp-includes/pluggable.php文件中,函数用法为:

  1. <?php   
  2. echo get_avatar( $id_or_email$size$default$alt );   
  3. //$id_or_email为用户ID或E-mail或者一个comment object(评论对象)   
  4. //$size为头像大小,默认为96   
  5. //$default一个头像地址,默认就是那个mystery man(神秘人)   
  6. //$alt头像的alt信息   
  7. ?>   

查看这个函数的源码,看不全懂也没关系,我们只需要找图片代码,直接扫视,找到含所有<img字样的地方就好了。很容易找到是:

  1. $avatar = "<img alt='{$safe_alt}' src='{$out}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";   
  2. //其中$safe_alt / $out/$size分别是图片alt信息,图片url 图片尺寸    

这里的图片src输出之后将是

  1. http://0.gravatar.com/avatar/e8e2f0c1a4427b67567ad3d1b582a3ce?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3  

上面的url中 avatar/到?s之间的字符是根据评论者邮箱计算的md5散列,不过前面两段的介绍无关紧要,知识介绍一个头像获取的方法,我们只需要关心最终的输出,get_avatar函数的最后面提供了一个过滤器get_avatar,我们需要通过这个过滤器来改变头像的url,改变为我们服务器上缓存的图片url。如下

  1. return apply_filters('get_avatar', $avatar$id_or_email$size$default$alt);  

既然它提供了最终的输出过滤器,那么我们只需要在输出之前修改这个url就好了。

首先请在网站根目录(或者其它你认为合适的文件夹下)新建一个文件夹avatar,用来存放头像文件。
修改代码如下代码:

  1. function ashu_avatar($avatar) {      
  2.     //strpos函数计算$avatar中字符“http”的位置      
  3.     $tmp = strpos($avatar, 'http');      
  4.     //获取src=""之间的字符串,即图片的url      
  5.     $len = strpos($avatar"'"$tmp) - $tmp;      
  6.     $g = substr($avatar$tmp$len);      
  7.     //获取url中avatar/ 到第一个?之间的字符串,即图片文件名      
  8.     $tmp = strpos($g, 'avatar/') + 7;      
  9.     $len2 = strpos($g"?"$tmp) - $tmp;      
  10.     $f = substr($g$tmp$len2);      
  11.     //参数wpurl获取wordpress的url地址(后台设置的)      
  12.     $w = get_bloginfo('wpurl');      
  13.     //ABSPATH为WordPress目录的绝对路径在wp-config.php中定义      
  14.     $e = ABSPATH .'avatar/'. $f .'.jpg';      
  15.     //7天=604800秒      
  16.     $t = 604900;       
  17.     //如果头像文件不存在,或者文件存在超过$t=7天      
  18.     if ( !is_file($e) || (time() - filemtime($e)) > $t ) {      
  19.         //更新头像文件..将$e拷贝到为$g      
  20.         copy(htmlspecialchars_decode($g), $e);      
  21.     } else{      
  22.         //如果头像文件存在且时间不超过7天,将原来图片的url替换为服务器上的图片url      
  23.         $avatar = strtr($avatararray($g => $w.'/avatar/'.$f.'.jpg'));      
  24.     }      
  25.     //如果头像文件小于500字节(下面这个我也不知道原作者是什么意思)      
  26.     iffilesize($e) < 500 ){      
  27.         //将$e拷贝为default.jpg      
  28.         copy($w.'/avatar/default.jpg', $e);      
  29.     }      
  30.     //返回$avatar      
  31.     return $avatar;      
  32. }      
  33. //添加过滤器函数ashu_avatar      
  34. add_filter('get_avatar', 'ashu_avatar');    

get_avatar函数不知一个过滤器哦,还是那句话,尽情的查找,尽情的修改,尽情的折腾吧

本文转载自:http://www.ashuwp.com/

共有 人打赏支持
drewin
粉丝 28
博文 121
码字总数 43979
作品 0
海淀
程序员
私信 提问
WordPress头像不显示及拖慢网站解决办法

一、过去解决办法 之前在Gravatar没有被全面和谐时,可以通过修改wordpress调用头像的服务器解决,现在失效。速度慢,可以通过缓存头像,现在也失效。另外就是关闭头像,不过对于网站需要显示...

Surjur
2015/04/30
0
0
Web3.0 高速发展 站长应重视什么?

这是一篇在Web3.0趋势下,与站长们探讨如何维护和升级网站的文章。主要谈到了目前国内外互联网非常流行的社会化网络趋势问题,希 望能有一些普及意义。我们都知道Web2.0注重用户参与,但对于...

oschina
2012/06/25
3K
22
2015 十款必备的免费 WordPress 插件

2015必备wordpress插件列表。为了增强wordpress站点,一些优秀有效的免费wordpress 插件是必不可少的。 WordPress 插件用于提升 wordpress 站点的功能。正如你所知道的,wordpress 是最流行的...

oschina
2015/03/11
10.2K
17
PHP 论坛系统--QDiscuss

QDiscuss 的原型来自于一个 PHP 论坛系统 Flarum,由 ColorVila WordPress Themes 经过二次开发,QDiscuss 已经是一个拥有现代化的设计,架构良好的强大的 WordPress 论坛插件,所有的数据都...

EvenRiver
2015/06/10
1K
0
WordPress 高仿 Flarum 论坛插件 QDiscuss

这是一款由php论坛系统 Flarum 修改而来的 WordPress 插件,完美地移植到 WordPress 上,所有的数据都保存在你的 WordPress 数据库,并且 WordPress 的用户将被默认设置为 QDiscuss 的成员,...

justjavac
2015/06/11
1K
2

没有更多内容

加载失败,请刷新页面

加载更多

关于C++ 容器的swap操作

一、swap操作交换两个相同类型的容器的内容,一般的容器(除array外),交换两个容器内容的操作会保证非常快,因为并没有交换元素本身,而只是交换了两个容器的内部数据结构。 拿vector做个例...

shzwork
24分钟前
1
0
程序员从宏观、微观角度浅析JVM虚拟机!

1.问题 1、JAVA文本文件如何被翻译成CLASS二进制文件? 2、如何理解CLASS文件的组成结构? 3、虚拟机如何加载使用类文件的生命周期? 4、虚拟机系列诊断工具如何使用? 5、虚拟机内存淘汰机制?...

我最喜欢三大框架
25分钟前
2
0
Choerodon猪齿鱼实践之应用生命周期管理

Choerodon平台中的开发和部署都是围绕应用来进行的,那Choerodon平台中的应用有什么样的特性?又是怎样来进行管理的呢?本文旨在深入地介绍Choerodon平台中应用的功能特性及其生命周期的管理...

Choerodon
46分钟前
0
0
Websocket之Jmeter压力测试

最近使用到Websocket进行聊天功能开发,用Jmeter进行压力测试,记录下。 使用的Jmeter版本5.1.1,自行从apache jmeter官网下载。 首先要添加Websocket的插件,网上有很多,我从百度网盘下载的...

克虏伯
46分钟前
1
0
作为Java程序员这些技术都不会,拿什么去涨薪跳槽?

引言 当下,正面临着近几年来的最严重的互联网寒冬,听得最多的一句话便是:相见于江湖~,缩减HC、裁员不绝于耳,大家都是人心惶惶,年前如此,年后想必肯定又是一场更为惨烈的江湖厮杀。但博...

别打我会飞
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部