Heim > Backend-Entwicklung > PHP-Tutorial > WordPress中Gravatar头像缓存到本地及相关优化的技巧

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

PHPz
Freigeben: 2018-10-11 15:27:03
Original
931 Leute haben es durchsucht

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

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

缓存方法如下:

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

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

3.添加缓存代码
将下面的代码复制到主题的 functions.php 文件中即可

function my_avatar($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 = get_bloginfo('wpurl');
$e = ABSPATH .'avatar/'. $f .'.jpg';
$t = 1209600; //設定14天, 單位:秒
if ( !is_file($e) || (time() - filemtime($e)) > $t ) { //當頭像不存在或文件超過14天才更新
copy(htmlspecialchars_decode($g), $e);
} else $avatar = strtr($avatar, array($g => $w.'/avatar/'.$f.'.jpg'));
if (filesize($e) < 500) copy($w.&#39;/avatar/default.jpg&#39;, $e);
return $avatar;
}
add_filter(&#39;get_avatar&#39;, &#39;my_avatar&#39;);
Nach dem Login kopieren

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

function validate_gravatar($email) {
 $hash = md5(strtolower(trim($email)));
 $uri = &#39;http://www.gravatar.com/avatar/&#39; . $hash . &#39;?d=404&#39;;
 $headers = @get_headers($uri);
 if (!preg_match("|200|", $headers[0])) {
 $has_valid_avatar = FALSE;
 } else {
 $has_valid_avatar = TRUE;
 }
 return $has_valid_avatar;
}
Nach dem Login kopieren

Gravatar全球通用头像缓存优化

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

function my_avatar( $email, $size = &#39;32&#39;, $default = &#39;&#39;, $alt = &#39;&#39;) {
 $f = md5( strtolower( $email ) );
 // 以下代码将头像缓存到wp-content目录下
 $a = get_bloginfo(&#39;template_url&#39;) . &#39;/avatar/&#39;. $f . $size . &#39;.png&#39;;
 $e = get_template_directory() . &#39;/avatar/&#39; . $f . $size . &#39;.png&#39;;
 $d = get_template_directory() . &#39;/avatar/&#39; . $f . &#39;-d.png&#39;;
 // 如果要将头像缓存到当前主题目录下,请将3-5行代码改成:
 // $a = get_bloginfo(&#39;template_url&#39;) . &#39;/avatar/&#39;. $f . $size . &#39;.png&#39;;
 // $e = get_template_directory() . &#39;/avatar/&#39; . $f . $size . &#39;.png&#39;;
 // $d = get_template_directory() . &#39;/avatar/&#39; . $f . &#39;-d.png&#39;;

if($default==&#39;&#39;)
  $default = get_bloginfo(&#39;wpurl&#39;).&#39;avatar/default.jpg&#39;;
 
 $t = 2592000; // 缓存有效期30天, 这里单位:秒
 if ( !is_file($e) || (time() - filemtime($e)) > $t ) {
  if ( !is_file($d) || (time() - filemtime($d)) > $t ) {
   // 验证是否有头像
   $uri = &#39;http://www.gravatar.com/avatar/&#39; . $f . &#39;?d=404&#39;;
   $headers = @get_headers($uri);
   if (!preg_match("|200|", $headers[0])) {
    // 没有头像,则新建一个空白文件作为标记
    $handle = fopen($d, &#39;w&#39;);
    fclose($handle);
    $a = $default;
   }
   else {
    // 有头像且不存在则更新
    $r = get_option(&#39;avatar_rating&#39;);
    $g = &#39;http://www.gravatar.com/avatar/&#39;. $f. &#39;?s=&#39;. $size. &#39;&r=&#39; . $r;
    copy($g, $e);
   }
  }
  else {
   $a = $default;
  }
 }
 
 $avatar = "";
 return apply_filters(&#39;my_avatar&#39;, $avatar, $email, $size, $default, $alt);
}
Nach dem Login kopieren

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

get_avatar( $comment,
Nach dem Login kopieren

格式的话,还需要改成

my_avatar( $comment->comment_author_email
Nach dem Login kopieren

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

更多相关教程请访问   php编程从入门到精通全套视频教程

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage