首页 > CMS > Wordpress > 正文

WordPress中Gravatar头像缓存到本地及相关优化的技巧

2024-09-07 00:48:08
字体:
来源:转载
供稿:网友

这篇文章主要介绍了WordPress中Gravatar头像缓存到本地及优化的技巧,需要的朋友可以参考下。

将Gravatar全球通用头像缓存的目的在于加快网站的打开速度,因为Gravatar官网的服务器在国外,加上伟大的GFW,国内打开速度经常很慢。方法来自willin,不过貌似他的网站已经打不开了- -

将Gravatar全球通用头像缓存到本地

缓存方法如下:

1.建立缓存目录

在WordPress根目录建立一个名为 avatar的文件夹,设置该文件夹的权限为 0755 (如果 0755 不行,就试一下 0777)。

2.设置默认头像

准备一张大小适合(32*32即可)的默认头像,命名为"default.jpg" ,放在 avatar 文件夹里面。

3.添加缓存代码

将下面的代码复制到主题的 functions.php 文件中即可

  1. function my_avatar($avatar) { 
  2. $tmp = strpos($avatar'http'); 
  3. $g = substr($avatar$tmpstrpos($avatar"'"$tmp) - $tmp); 
  4. $tmp = strpos($g'avatar/') + 7; 
  5. $f = substr($g$tmpstrpos($g"?"$tmp) - $tmp); 
  6. $w = get_bloginfo('wpurl'); 
  7. $e = ABSPATH .'avatar/'$f .'.jpg'
  8. $t = 1209600; //設定14天, 單位:秒 
  9. if ( !is_file($e) || (time() - filemtime($e)) > $t ) { //當頭像不存在或文件超過14天才更新 
  10. copy(htmlspecialchars_decode($g), $e); 
  11. else $avatar = strtr($avatararray($g => $w.'/avatar/'.$f.'.jpg')); 
  12. if (filesize($e) < 500) copy($w.'/avatar/default.jpg'$e); 
  13. return $avatar
  14. add_filter('get_avatar''my_avatar'); 

通过Email判断用户是否有Gravatar头像

很多时候,我们还需要知道用户有没有设置Gravatar,比如如果用户没有设置Gravatar头像则直接显示本地的默认头像,或者提醒没有设置Gravatar的用户设置Gravatar头像,而不打扰已经设置过头像的用户。今天分享的代码可以通过Email地址来验证用户是否有Gravatar头像:

  1. function validate_gravatar($email) { 
  2.  $hash = md5(strtolower(trim($email))); 
  3.  $uri = 'http://www.gravatar.com/avatar/' . $hash . '?d=404'
  4.  $headers = @get_headers($uri); 
  5.  if (!preg_match("|200|"$headers[0])) { 
  6.  $has_valid_avatar = FALSE; 
  7.  } else { 
  8.  $has_valid_avatar = TRUE; 
  9.  } 
  10.  return $has_valid_avatar

Gravatar全球通用头像缓存优化

优化后的代码可以避免用户没有设置Gravatar头像时,默认头像重复缓存成多个文件造成资源浪费和重复连接的问题,优化后的代码如下:

  1. function my_avatar( $email$size = '32'$default = ''$alt = '') { 
  2.  $f = md5( strtolower$email ) ); 
  3.  // 以下代码将头像缓存到wp-content目录下 
  4.  $a = get_bloginfo('template_url') . '/avatar/'$f . $size . '.png'
  5.  $e = get_template_directory() . '/avatar/' . $f . $size . '.png'
  6.  $d = get_template_directory() . '/avatar/' . $f . '-d.png'
  7.  // 如果要将头像缓存到当前主题目录下,请将3-5行代码改成: 
  8.  // $a = get_bloginfo('template_url') . '/avatar/'. $f . $size . '.png'; 
  9.  // $e = get_template_directory() . '/avatar/' . $f . $size . '.png'; 
  10.  // $d = get_template_directory() . '/avatar/' . $f . '-d.png'; 
  11.  
  12. if($default==''
  13.   $default = get_bloginfo('wpurl').'avatar/default.jpg'
  14.    
  15.  $t = 2592000; // 缓存有效期30天, 这里单位:秒 
  16.  if ( !is_file($e) || (time() - filemtime($e)) > $t ) { 
  17.   if ( !is_file($d) || (time() - filemtime($d)) > $t ) { 
  18.    // 验证是否有头像 
  19.    $uri = 'http://www.gravatar.com/avatar/' . $f . '?d=404'
  20.    $headers = @get_headers($uri); 
  21.    if (!preg_match("|200|"$headers[0])) { 
  22.     // 没有头像,则新建一个空白文件作为标记 
  23.     $handle = fopen($d'w'); 
  24.     fclose($handle); 
  25.     $a = $default
  26.    } 
  27.    else { 
  28.     // 有头像且不存在则更新 
  29.     $r = get_option('avatar_rating'); 
  30.     $g = 'http://www.gravatar.com/avatar/'$f'?s='$size'&r=' . $r
  31.     copy($g$e); 
  32.    } 
  33.   } 
  34.   else { 
  35.    $a = $default
  36.   } 
  37.  } 
  38.    
  39.  $avatar = "<img alt='{$alt}' src='{$a}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />"
  40.  return apply_filters('my_avatar'$avatar$email$size$default$alt); 

使用这个方法需要在主题所有文件中,将 get_avatar 函数替换为 my_avatar 。

而且如果是:

get_avatar( $comment,格式的话,还需要改成

my_avatar( $comment->comment_author_email

因为my_avatar函数只能通过Email来调取用户头像,所以以上情况,需要将第一个参数改成email地址。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表