重新整理: 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. 小闇 says:

    SF我來了

  2. airoschou says:

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

    1. zwwooooo says:

      @airoschou
      你的是板凳……第二种方法简单。

    2. airoschou says:

      @zwwooooo
      延时了,我们同时回复的。。。

  3. 帅哥 says:

    发现插件显示PR6。。。

    1. zwwooooo says:

      @帅哥
      神马插件?

  4. axiu says:

    貌似也这么折腾alt的

  5. 缓存这东西真不好弄

    1. zwwooooo says:

      @软件盒子
      注意路径到时简单。

  6. 不能吧 says:

    嘿嘿,我是适合第二种的懒人做法 :mrgreen:

  7. 不能吧 says:

    哦,第二种方法应该是avatar文件夹,不是cache文件夹了吧 :idea:

    1. zwwooooo says:

      @不能吧
      统一用 avatar 文件夹来缓存。

  8. 我直接关了显示头像,不过你说放到php里面提醒了我,我去看看我加的代码对不对,头像就还是不显示了,

    1. zwwooooo says:

      @平板电脑推荐
      注意路径就ok了

  9. 浩子 says:

    全国网速都提了,就没多必要折腾本地缓存了。哈哈 :mrgreen:

    1. shadowma says:

      @浩子
      主要是預防gravatar網站被牆才緩存到本地的吧

    2. zwwooooo says:

      @浩子
      你不知道gravatar时不时会被弓虽女干么?

  10. 八方SEO says:

    我暂时还不用管

  11. 公子 says:

    我内主机好像就不支持copy~ :cry:

    1. zwwooooo says:

      @公子
      有些主机商限制了。

  12. 郑永 says:

    果然是技术的尖端子。

    1. zwwooooo says:

      @郑永
      有人要,整理一下。

  13. 郑永 says:

    评论框在侧边滑行,又回到下面,真的不错,代码复杂吗?嘿嘿

    1. zwwooooo says:

      @郑永
      不复杂,但写成通用就有点难,起码对于我来说是。

  14. 郑永 says:

    不知道有没有这篇教程啊? 评论在旁边飞的。

    1. zwwooooo says:

      @郑永
      应该有吧,我的稍微有点不同。

    2. 郑永 says:

      @zwwooooo
      我是说你写的关于你的旁边飞的那个评论框,呵呵。

    3. zwwooooo says:

      @郑永
      不想写,因为代码有点乱,不适合大众化,以后看看。

  15. EIIE says:

    不知道一个头像能快多少时间 :evil: ……

    1. zwwooooo says:

      @EIIE
      不是为了这个,是因为有时gravatar服务器会被弓虽女干。

  16. 不能吧 says:

    评论框在边栏的时候,那个广告框会移位,见图:

    1. zwwooooo says:

      @不能吧
      我这评论不能贴图的……在边栏时广告我缩小了,只是为了不要重复加载……

  17. Dick_Wu says:

    内牛满面解决问题!

  18. ChalW says:

    好方法,我还是慢慢折腾吧。

  19. says:

    再次证明 绝对收藏的没错 养分很高 HOHO

    1. zwwooooo says:

      @沫
      好东西无需因为自己不折腾而删除。

  20. 集趣 says:

    还在继续折腾呐

    1. zwwooooo says:

      @集趣
      不折腾看电视啊?

发表评论

昵称 *

网址

B em del U Link Code Quote