频道栏目
首页 > 资讯 > CMS建站 > 正文

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

16-01-06        来源:[db:作者]  
收藏   我要投稿

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

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

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

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

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

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

相关TAG标签
上一篇:wordpress功能集成(四)改变评论框样式
下一篇:wordpress功能集成(二):基础知识-wordpress钩子
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站