Old

重新整理: willin简单头像缓存函数my_avatar()

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()) { 方法二的函数代码 }

玩(完)!

zww
or
oooo

声明: 除非注明,ZWWoOoOo文章均为原创,转载请以链接形式标明本文地址
本文地址: http://zww.me/archives/25594

106 comments

  1. 小闇 小闇 Safari 5.1 Safari 5.1 iPod iOS 5.0.1 iPod iOS 5.0.1

    SF我來了

    沙发
  2. airoschou airoschou Google Chrome 17.0.963.79 Google Chrome 17.0.963.79 Windows XP Windows XP

    第一次沙发~我是第二种方法,懒人~

    板凳
  3. 帅哥 帅哥 Google Chrome 17.0.963.79 Google Chrome 17.0.963.79 Windows 8 x64 Edition Windows 8 x64 Edition

    发现插件显示PR6。。。

    地板
  4. ......
  5. JuniorTsui JuniorTsui Firefox 10.0.2 Firefox 10.0.2 Windows XP Windows XP

    我的avatar 是建立在网站的根目录了,但是当用户没有注册avatar时,还是使用的官方头像,并没有使用default.jpg,奇怪$e = preg_replace('/wordpress\//', '', ABSPATH) . 'avatar/' . $f . '.jpg';这句话没看懂,尤其是/wordpress\//

    41楼
    • zwwooooo zwwooooo Firefox 12.0 Firefox 12.0 Windows 7 x64 Edition Windows 7 x64 Edition

      @JuniorTsui
      这些是提高兼容性的,也就是说,你的wp安装在wordpress目录的也能正常使用

    • 常阳时光 常阳时光 Firefox 17.0 Firefox 17.0 Windows XP Windows XP

      @JuniorTsui

      JuniorTsui: 我的avatar 是建立在网站的根目录了,但是当用户没有注册avatar时,还是使用的官方头像,并没有使用default.jpg,奇怪$e = preg_replace('/wordpress\//', '', ABSPATH) . 'avatar/' . $f . '.jpg';这句话没看懂,尤其是/wordpress\//

      我的也是,当用户没有注册avatar时,还是使用的官方头像,并没有使用default.jpg

  6. 五毛党 五毛党 Firefox 10.0.2 Firefox 10.0.2 Windows XP Windows XP

    来看默认头像来的

    42楼
  7. languh languh Google Chrome 21.0.1180.79 Google Chrome 21.0.1180.79 Windows 7 x64 Edition Windows 7 x64 Edition

    请假下楼主,gravatar头像缓存到本地后,如果无头像的匿名用户回复,默认会复制一份default.jpg和邮箱地址合并匹配加密,重新生成产生一个新命名的头像文件,这个文件和default.jpg是一样的,但每次有匿名的就重新生成一个,感觉不太好,能不能改成根据邮箱地址验证,没有gravatar头像的就直接调用default.jpg,不再重新生成

    43楼
    • zwwooooo zwwooooo Firefox 14.0.1 Firefox 14.0.1 Windows 7 x64 Edition Windows 7 x64 Edition

      @languh
      为了统一处理,所以直接生成,你当作对方有头像就不会心里不平衡了。

  8. 七号 七号 Firefox 15.0.1 Firefox 15.0.1 Windows XP Windows XP

    我用了第二种方法,首页OK了,文章页还是不行,怎么回事呢?

    44楼
    • zwwooooo zwwooooo Firefox 15.0.1 Firefox 15.0.1 Windows 7 x64 Edition Windows 7 x64 Edition

      @七号
      首页?不是同样处理么

    • 七号 七号 Firefox 15.0.1 Firefox 15.0.1 Windows XP Windows XP

      @zwwooooo 是啊,首页,文章页都是调用同样的一个边栏,可文章页就是不行。我也不知道怎么回事...

  9. wp-lover wp-lover Firefox 20.0 Firefox 20.0 Windows 7 Windows 7

    hi,我也想重新整理avatar,可是用了方法一,网页直接打不开,用了方法2,网页可以打开,但好像有个人现象:

    1、没有头像的邮箱评论后,在审核状态时,不显示图像,只有alt文字。
    2、然后,随即刷新网页,出来了默认头像(自己上传的默认头像)。
    -----
    3、假设不操作第二部,即立即刷新网页,而是进入后台审核该评论,后台和前台的该AVATAR就显示成系统自带的默认头像了,不是自己上传的默认头像了。

    不知道ZWW大哥有没有这样的状况,很是纠结,方法2可能有bug?

    求解。谢谢谢!

    45楼
    • zwwooooo zwwooooo Firefox 21.0 Firefox 21.0 Windows 7 x64 Edition Windows 7 x64 Edition

      @wp-lover
      你说的情况我这貌似没问题,简单点吧:其实后台不需要缓存了,也就你自己一个人进去,在函数前面(第二种方法)加个判断括住:

      if (!is_admin()){
      第二种方法函数...
      }
  10. hzlzh hzlzh Google Chrome 32.0.1700.76 Google Chrome 32.0.1700.76 Mac OS X  10.9.2 Mac OS X 10.9.2

    嗯,之前一直用好这个缓存头像,很赞。
    不过,我现在转移用多说了。

    46楼
  11. 甜菜 甜菜 Sogou Explorer Sogou Explorer Windows 8.1 Windows 8.1

    我来考古
    PS:咳咳,但是没有头像的用户评论并没有调用default.jpg啊...Z大叔你看看(我用的方法二)

    47楼
    • zwwooooo zwwooooo Firefox 31.0 Firefox 31.0 Windows 8.1 x64 Edition Windows 8.1 x64 Edition

      @甜菜
      要放一个 default.jpg 默认图片到你的网站根目录的 avatar 目录下

Leave a Reply