2010年我写了《让willin简单头像缓存函数my_avatar()真正支持alt》这篇文章,里面只是简单说了一下修改,没有具体写过程,方法过程只是链接到 willin 的原创文章。众所周知,willin 已经关闭了所有 WordPress 相关折腾文章,所以有些朋友在按照我那篇文章折腾时就遇到问题了,所以+所以决定整理一下。
原创:Willin Kan
修改+整理:zwwooooo
方法一:手动替换 get_avatar() 调用函数(适合喜欢折腾的朋友,优点:据 willin 说速度较快,缺点:后台的头像需要修改WP源文件才能缓存)
一、前期工作
1. 在网站(博客)根目录建一个名为 avatar 的文件夹,保证其可写。(一般虚拟主机就755权限即可)
2. 自己制作或者Copy一个名称为 default.jpg 的图片作为默认头像,图片宽高根据自己主题设定,如 50*50,然后上传到第1步里面说的 avatar 文件夹里面。
3. 确定自己的主机支持 php 的 copy() 函数。(注:一般虚拟主机都支持)
4. 保证使用的 WordPress 版本在 v3.0 以上
二、函数
把下面的函数代码放到主题的 functions.php 文件里面(注意要放到 <?php ?> 里)
/* Mini Gavatar Cache by Willin Kan. Modify by zwwooooo */ function my_avatar( $email, $size = '50', $default = '', $alt = false ) { $alt = (false === $alt) ? '' : esc_attr( $alt ); $f = md5( strtolower( $email ) ); $w = home_url(); //$w = get_bloginfo('url'); $a = $w. '/avatar/'. $f . '.jpg'; $e = preg_replace('/wordpress\//', '', ABSPATH) . 'avatar/' . $f . '.jpg'; $t = 604800; //设定7天, 单位:秒 if ( empty($default) ) $default = $w. '/avatar/default.jpg'; if ( !is_file($e) || (time() - filemtime($e)) > $t ){ //当头像不存在或者文件超过7天才更新 $r = get_option('avatar_rating'); $g = sprintf( "http://www.gravatar.com", ( hexdec( $f{0} ) % 2 ) ). '/avatar/'. $f. '?s='. $size. '&d='. $default. '&r='. $r; copy($g, $e); } if (filesize($e) < 500) copy($default, $e); $avatar = "<img title='{$alt}' 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()
例如:<?php echo get_avatar($comment, $size='40', $default='' ); ?>
改为:<?php echo my_avatar($comment, $size='40', $default='' ); ?>
方法二:hook get_avatar() 函数模式(适合新手、懒人,优点:后台也有效)
一、前期工作(同方法一)
二、函数
把下面的函数代码放到主题的 functions.php 文件里面(注意要放到 <?php ?> 里)
function my_avatar_admin($avatar) { $tmp = strpos($avatar, 'http'); $g = substr($avatar, $tmp, strpos($avatar, "'", $tmp) - $tmp); $tmp = strpos($g, 'avatar/') + 7; $f = substr($g, $tmp, strpos($g, "?", $tmp) - $tmp); $w = home_url(); // $w = get_bloginfo('url'); $e = preg_replace('/wordpress\//', '', ABSPATH) .'avatar/'. $f .'.jpg'; $t = 604800; //设定7天, 单位:秒 if ( empty($default) ) $default = $w. '/avatar/default.jpg'; if ( !is_file($e) || (time() - filemtime($e)) > $t ) //当头像不存在或者文件超过7天才更新 copy(htmlspecialchars_decode($g), $e); else $avatar = strtr($avatar, array($g => $w.'/avatar/'.$f.'.jpg')); if (filesize($e) < 500) copy($default, $e); return $avatar; } add_filter('get_avatar', 'my_avatar_admin');
这样就OK了。
附:真正支持头像图片 alt 属性的 my_avatar()函数
折腾方法同“方法一”,下面只贴出函数部分
/* Mini Gavatar Cache by Willin Kan. Modify by zwwooooo */ function my_avatar( $email, $size = '50', $default = '', $alt = '' ) { // $alt = (false === $alt) ? '' : esc_attr( $alt ); $alt = ('' == $alt) ? '' : $alt ; $f = md5( strtolower( $email ) ); $w = home_url(); //$w = get_bloginfo('url'); $a = $w. '/avatar/'. $f . '.jpg'; $e = preg_replace('/wordpress\//', '', ABSPATH) . 'avatar/' . $f . '.jpg'; $t = 604800; //设定7天, 单位:秒 if ( empty($default) ) $default = $w. '/avatar/default.jpg'; if ( !is_file($e) || (time() - filemtime($e)) > $t ){ //当头像不存在或者文件超过7天才更新 $r = get_option('avatar_rating'); $g = sprintf( "http://www.gravatar.com", ( hexdec( $f{0} ) % 2 ) ). '/avatar/'. $f. '?s='. $size. '&d='. $default. '&r='. $r; copy($g, $e); } if (filesize($e) < 500) copy($default, $e); $avatar = "<img title='{$alt}' alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"; return apply_filters('my_avatar', $avatar, $email, $size, $default, $alt); }
注意:调用此函数时需要给参数 $alt 赋值,不然 alt 同样不起作用,$alt 一般赋值为评论作者名。
例如:<?php echo get_avatar($comment, $size='40', $default='' ); ?>
改为:<?php echo my_avatar($comment, $size='40', $default='', $alt=$comment->comment_author ); ?>
PS:我自用方法
我所使用的方法是结合上面说的两个方法,即前台用“附:整正支持 alt 的 my_avatar()函数”,后台用“方法二:hook get_avatar() 函数模式”,只要给方法二中的函数加个‘只在后台有效’的判断即可,如:if(is_admin()) { 方法二的函数代码 }
玩(完)!
- 本文标题:重新整理: willin简单头像缓存函数my_avatar()
- 本文链接:https://zww.me/archives/25594
- 发布时间:2012年03月19日 10:18
- 版权声明:除非注明,文章均为 zwwooooo 原创,转载请以链接形式标明本文地址!
我的avatar 是建立在网站的根目录了,但是当用户没有注册avatar时,还是使用的官方头像,并没有使用default.jpg,奇怪$e = preg_replace('/wordpress\//', '', ABSPATH) . 'avatar/' . $f . '.jpg';这句话没看懂,尤其是/wordpress\//
@JuniorTsui
这些是提高兼容性的,也就是说,你的wp安装在wordpress目录的也能正常使用
@JuniorTsui
我的也是,当用户没有注册avatar时,还是使用的官方头像,并没有使用default.jpg
来看默认头像来的
请假下楼主,gravatar头像缓存到本地后,如果无头像的匿名用户回复,默认会复制一份default.jpg和邮箱地址合并匹配加密,重新生成产生一个新命名的头像文件,这个文件和default.jpg是一样的,但每次有匿名的就重新生成一个,感觉不太好,能不能改成根据邮箱地址验证,没有gravatar头像的就直接调用default.jpg,不再重新生成
@languh
为了统一处理,所以直接生成,你当作对方有头像就不会心里不平衡了。
我用了第二种方法,首页OK了,文章页还是不行,怎么回事呢?
@七号
首页?不是同样处理么
@zwwooooo 是啊,首页,文章页都是调用同样的一个边栏,可文章页就是不行。我也不知道怎么回事...
hi,我也想重新整理avatar,可是用了方法一,网页直接打不开,用了方法2,网页可以打开,但好像有个人现象:
1、没有头像的邮箱评论后,在审核状态时,不显示图像,只有alt文字。
2、然后,随即刷新网页,出来了默认头像(自己上传的默认头像)。
-----
3、假设不操作第二部,即立即刷新网页,而是进入后台审核该评论,后台和前台的该AVATAR就显示成系统自带的默认头像了,不是自己上传的默认头像了。
不知道ZWW大哥有没有这样的状况,很是纠结,方法2可能有bug?
求解。谢谢谢!
@wp-lover
你说的情况我这貌似没问题,简单点吧:其实后台不需要缓存了,也就你自己一个人进去,在函数前面(第二种方法)加个判断括住:
嗯,之前一直用好这个缓存头像,很赞。
不过,我现在转移用多说了。
@hzlzh
我不喜欢用第三方
我来考古
PS:咳咳,但是没有头像的用户评论并没有调用default.jpg啊...Z大叔你看看(我用的方法二)
@甜菜
要放一个 default.jpg 默认图片到你的网站根目录的 avatar 目录下