TypeCodes

再议Gravatar头像缓存至本地服务器

《WordPress中Gravatar头像缓存至本地服务器——暨博客的优化实录》一文中,vfhky谈到了Gravatar头像本地服务器缓存技术。遗憾的是,由于当时考虑得不够周到,使用这里面的代码造成了一个比较严重的问题:那就是从default文件夹随机取出的头像在超过5天的时间后,也会随着拥有gravatar真实头像的用户的头像一起更新。

但是gravatar用户的头像在更新时,由于$default的值是空的,那么更新时$g的值就是类似于

http://www.gravatar.com/avatar/eefdd735a45efc514936a0d0ca7e2511?s=40?d=?r=G

然而没有gravatar头像的“default用户”,他们的头像更新的时候,$g的值就是类似于

http://www.gravatar.com/avatar/eefdd735a45efc514936a0d0ca7e2511?s=30&d=/home4/jinrongi/public_html/hky/wp-content/themes/weisaysimple/avatar/default/default10.jpg&r=G

这个是无法访问的,从而造成了应该显示头像的地方无法正常显示。

gravatar头像缓存错误

—————————————解决方案—————————————

把原文中的代码改成下面的代码。需要说明的是filesize($e) == 2637是通过 http://www.gravatar.com/avatar/ 访问得到的头像的size值,用它来判断是否是gravatar用户。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//gravatar cache by vfhky 1
function vfhky_avatar( $email, $size, $default , $alt) {
  // $alt = (false === $alt) ? '' : esc_attr( $alt );
  $alt = ('' == $alt) ? '' :  $alt ;//用于设置当鼠标移到头像上显示提示文字
  $f = md5( strtolower( $email ) );//根据email的值来生成一个md5变量值,作为本地.jpg头像的名字
  $a = get_bloginfo('wpurl') . '/avatar/' . $f. '.jpg';//需要在根目录下面新建一个avatar文件夹
  $e = ABSPATH .'avatar/'. $f. '.jpg';//缓存的头像的绝对路径
  $default_random_abs = ABSPATH .'wp-content/themes/vfhky/avatardefault/';//在avatar文件夹下新建一个default文件夹,用于保存博客预先自定义的头像
  $default_random = array('default1.jpg', 'default2.jpg','default3.jpg','default4.jpg','default5.jpg','default6.jpg','default7.jpg','default8.jpg','default9.jpg','default10.jpg'); //在default文件夹下添加18个自己喜欢的头像,作为没有gravatar头像的人使用
  $default_random_num = array_rand($default_random, 1);  //随机从上面18张头像中选出一张
  $t = 1296000; //单位s,设置更新时间为15天
  if ( empty($default) ) $default = $default_random_abs.$default_random[$default_random_num];//设置默认头像
  if ( (time() - filemtime($e)) > $t ){ //不是第一次留言留言且留言时间超过5天就更新头像
    //$g = sprintf( "http://%d.gravatar.com", ( hexdec( $f{0} ) % 2 ) ). '/avatar/'. $f
    // wp 3.0 的服务器
    $g = 'http://www.gravatar.com/avatar/'. $f; // 旧服务器 (哪个快就开哪个)
    copy($g, $e); //将$g代表的网络图片复制到$e代表的本地服务器中
    if (filesize($e) == 2637 ){
      copy($default_random_abs.$default_random[$default_random_num], $a);
    }
    //如果该E-mail未在gravatar官网设置头像,则把官网默认的头像$e改成default中的随机一张图片
    else {$a = esc_attr($g);}
  }
  //如果是第一次留言并且没有官网头像,则直接用default中的随机一张图片替代
  if (!is_file($e) || filesize($e) == 2637  ){
    copy($default_random_abs.$default_random[$default_random_num], $e);
  }
  echo "<img title='{$alt}' alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
}
打赏支持

Comments »