重新整理: 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

“重新整理: willin简单头像缓存函数my_avatar()”有106条评论

  1. wmtimes says:

    先记录下了。有时间再来改下。

    1. zwwooooo says:

      @wmtimes
      慢慢玩。

  2. that5 says:

    比较好奇你是怎么实现Gavatar头像单独使用子域名呢?

    1. zwwooooo says:

      @that5
      解决路径就行了,当然要同主机。

    2. that5 says:

      @zwwooooo
      修改这个

      $w = home_url()

      吗?
      php不懂 :cry:

    3. that5 says:

      @zwwooooo
      发现第二种方法有点问题:当邮箱没有注册Gavatar头像时,缓存并没有启用默认的default.jpg

    4. zwwooooo says:

      @that5
      还要修改用绝对路径$e

    5. zwwooooo says:

      @that5
      可以的,我后台就行。

    6. that5 says:

      @zwwooooo

      $e和$w

      修改的就是上面2个,也缓存成功了。
      我想到一个问题,如果想缓存到upyun空间,不知道能实现不?

    7. zwwooooo says:

      支持php和copy权限的空间是可以的,以前就有这类代码,自己搜一下。

    8. that5 says:

      @zwwooooo
      嗯,我看了下upyun的相关信息是可以的,但没真正动手 :mrgreen: ,有空余时间再弄吧

    9. zwwooooo says:

      @that5
      慢慢折腾,我记得前几年就有代码了,我也好像用过。

    10. root says:

      @zwwooooo
      :!: 不懂怎么改路径,麻烦朋友方便的放发个回复到我的EMAIL里,谢谢,--“还要修改用绝对路径$e”--希望能够解决上面朋友得到的那个问题

    11. zwwooooo says:

      @root
      每个主机绝对路径不同,自己先弄清楚自己主机

    12. zwwooooo says:

      @root
      一般情况下不用特意去了解主机的绝对路径,代码中已经有获取绝对路径的函数,所以你只要把avatar文件建立到正确位置即可,如果还是不懂,建议用插件,简单。

  3. 影酷网 says:

    :razz: 学到好多啊,谢谢分享啊

  4. 都忘了以前在哪里改的.换主题的时候再搞吧...

    1. zwwooooo says:

      @yesureadmin
      以前正常的就无需再折腾了。

  5. 咚门 says:

    诶,评论怎么跑到右边了,差点没找到。
    头像缓存经常都发现自己那的头像和别人那的不一样,等过一段时间更新了别人又该了。。
    还有,如果第一次用的话,打开文章要花好长时间。

    1. zwwooooo says:

      @咚门
      第一次慢为了以后快。评论框是跟随的,如果你直接滚到底部评论框就会回到底部。

  6. lss53 says:

    研究中,谢谢老大哥

    1. zwwooooo says:

      @lss53
      慢慢玩。

  7. yixin says:

    redhat独立服务器,发现php没有支持copy()功能,不知道怎样开启copy功能,囧~

    1. zwwooooo says:

      @yixin
      默认安装都行吧。

  8. 黄小蚊 says:

    有个问题,邮箱没有Gavatar头像的时候,代码给每个邮箱都创建了一个头像。搞的头像好多唉。

    没有Gavatar头像就直接用default.jpg不行么

    1. Dick_Wu says:

      @黄小蚊
      那是WordPress原生的功能吧。要在后台/wp-admin/options-discussion.php设置成神秘人~

    2. 黄小蚊 says:

      @Dick_Wu
      不是,上面的代码给每个邮件账号都创建了一个头像。但没有Gavatar头像直接使用default.jpg不就可以了。

    3. zwwooooo says:

      @黄小蚊
      换个想法你就不纠结了:你当作他们都有头像。当然,你也更改代码实现直接调用。

  9. 还不错啊 will走了 自然还有人出来

    1. zwwooooo says:

      @安卓游戏下载
      好吧,我好像不是后来者。

  10. sbnb says:

    就是wp 越来越臃肿了 :twisted:

    1. zwwooooo says:

      @sbnb
      看你怎么定位wp了

  11. mack says:

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

    1. zwwooooo says:

      @mack
      谢谢指正,已更正,再次感谢!

  12. 阿贵 says:

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

    1. zwwooooo says:

      @阿贵
      只能说你没改对或者不太会修改,不能照搬。

  13. 葱头 says:

    Mark先..慢慢研究

  14. mack says:

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

    1. zwwooooo says:

      @mack
      再认真检查下,一般木有问题

    2. Mack says:

      @zwwooooo
      在问一下,代码改完后一般需要多久可以生效?

    3. zwwooooo says:

      @Mack
      立即生效的,如果你改正确的话

  15. mack says:

    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 );也没有写错吧?

  16. says:

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

  17. says:

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

  18. says:

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

    1. zwwooooo says:

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

  19. viem says:

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

    1. zwwooooo says:

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

    2. viem says:

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

    3. zwwooooo says:

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

    4. viem says:

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

    5. zwwooooo says:

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

  20. JuniorTsui says:

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

发表评论

昵称 *

网址

B em del U Link Code Quote