You are here: Home » All Categories » » 重新整理: willin简单头像缓存函数my_avatar()

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

Mar 19th, 2012 10:18 | Leave a comment?(100) Go to comments

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

玩(完)!

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

Filed under

| Tags:

, ,

Related Posts

Most Popular

100 Comments.

⊕Leave a comment?
  1. mack mack Google Chrome 18.0.1025.151Windows XP

    第一步“在网站(博客)根目录建一个名为 cache 的文件夹,保证其可写。”应该是建立个 avatar 文件夹吧!

    31楼
  2. 阿贵 阿贵 Maxthon 3.0Windows XP

    还是无效,不知道为什么,修改了网站就打不开了

    32楼
  3. 葱头 葱头 Maxthon 3.3.6.2000Windows XP

    Mark先..慢慢研究

    33楼
  4. mack mack Google Chrome 18.0.1025.162Windows 7 x64 Edition

    方法1,2,3都试了,右键点击头像还是链接的gravatar网站。是那里出问题了呢?主机设置什么的都没问题啊,我functions.php 文件里面替换成comment_author ); ?>也没有写错吧?

    34楼
  5. mack mack Google Chrome 18.0.1025.162Windows 7 x64 Edition

    functions.php 文件echo get_avatar($comment,$size='60',$default=''. get_bloginfo('stylesheet_directory') .'/images/gravatar.png'); 替换成echo my_avatar($comment, $size='60', $default='', $alt=$comment->comment_author );也没有写错吧?

    35楼
  6. 臻 Maxthon 3.3.8.900Windows 7 x64 Edition

    $tmp = strpos($g, 'avatar/') + 7;
    对于这一段不明白,为什么一次只能缓存7个呢?

    36楼
  7. 臻 Maxthon 3.3.8.900Windows 7 x64 Edition

    错了,不是这样,第二个方法,例如我一个页面很多头像,第一次刷新的时候不会显示全部的,貌似只显示6、7个这样,其他还是没缓存的,要再刷新。

    37楼
  8. 臻 Maxthon 3.3.8.900Windows 7 x64 Edition

    又说错了,是已经缓存了,但页面那里只有6、7个是调用了缓存地址,其他还是原来的。

    38楼
    • zwwooooo zwwooooo Firefox 12.0Windows 7 x64 Edition

      @臻
      那个 +7 不是缓存多少,呵呵。
      另外,缓存不是一次性的,一般是评论区有人访问了就会缓存,如果是最新评论哪里可能就不准确。

  9. viem viem TheWorld BrowserWindows 7

    http://dyjzx.net/ 大神帮忙看看侧边栏的读者的头像不显示是什么原因?会不会是被屏蔽了

    39楼
    • zwwooooo zwwooooo Firefox 12.0Windows 7 x64 Edition

      @viem
      你的头像地址已经变成这样 http://dyjzx.net/avatar/e998da98b85342c885ccfd6c01b8d8d7.jpg
      你看路径正常不?另外,确定你的主机可以访问gravatar(国内主机如果遇到gravatar被墙时会无法获取头像)

    • viem viem TheWorld BrowserWindows 7

      @zwwooooo
      现在空间里的avatar文件夹下只有一张default.jpg 文件。另外,用的是ai.feila.me的国外空间

    • zwwooooo zwwooooo Firefox 12.0Windows 7 x64 Edition

      @viem
      是不是copy()函数问题呢,这需要主机支持

    • viem viem TheWorld BrowserWindows 7

      @zwwooooo
      找到原因了,是之前装了“多说”插件,好想和这个冲突,停用插件后头像开始能显示了,但是新的问题又出现了,所有人的头像都变成avatar下的内个默认图片了。。。

    • zwwooooo zwwooooo Firefox 12.0Windows 7 x64 Edition

      @viem
      这类插件冲突就不奇怪了,通常出现问题请先检查是不是插件冲突。

  10. JuniorTsui JuniorTsui Firefox 10.0.2Windows XP

    今天也弄了一个缓存,成功了~哈哈,有点进步了,谢谢z大

    40楼
  11. JuniorTsui JuniorTsui Firefox 10.0.2Windows XP

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

    41楼
    • zwwooooo zwwooooo Firefox 12.0Windows 7 x64 Edition

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

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

      @JuniorTsui

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

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

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

    来看默认头像来的

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

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

    43楼
    • zwwooooo zwwooooo Firefox 14.0.1Windows 7 x64 Edition

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

  14. 七号 七号 Firefox 15.0.1Windows XP

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

    44楼

Leave a Reply


Welcome! o(∩_∩)o
X