将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."/avatar/default.jpg", $e);return $avatar;}add_filter("get_avatar", "my_avatar");通过Email判断用户是否有Gravatar头像很多时候,我们还需要知道用户有没有设置Gravatar,比如如果用户没有设置Gravatar头像则直接显示本地的默认头像,或者提醒没有设置Gravatar的用户设置Gravatar头像,而不打扰已经设置过头像的用户。今天分享的代码可以通过Email地址来验证用户是否有Gravatar头像:
function validate_gravatar($email) { $hash = md5(strtolower(trim($email))); $uri = "http://www.gravatar.com/avatar/" . $hash . "?d=404"; $headers = @get_headers($uri); if (!preg_match("|200|", $headers[0])) { $has_valid_avatar = FALSE; } else { $has_valid_avatar = TRUE; } return $has_valid_avatar;}Gravatar全球通用头像缓存优化
优化后的代码可以避免用户没有设置Gravatar头像时,默认头像重复缓存成多个文件造成资源浪费和重复连接的问题。优化后的代码如下
function my_avatar( $email, $size = "32", $default = "", $alt = "") { $f = md5( strtolower( $email ) ); // 以下代码将头像缓存到wp-content目录下 $a = get_bloginfo("template_url") . "/avatar/". $f . $size . ".png"; $e = get_template_directory() . "/avatar/" . $f . $size . ".png"; $d = get_template_directory() . "/avatar/" . $f . "-d.png"; // 如果要将头像缓存到当前主题目录下,请将3-5行代码改成: // $a = get_bloginfo("template_url") . "/avatar/". $f . $size . ".png"; // $e = get_template_directory() . "/avatar/" . $f . $size . ".png"; // $d = get_template_directory() . "/avatar/" . $f . "-d.png";if($default=="") $default = get_bloginfo("wpurl")."avatar/default.jpg"; $t = 2592000; // 缓存有效期30天, 这里单位:秒 if ( !is_file($e) || (time() - filemtime($e)) > $t ) { if ( !is_file($d) || (time() - filemtime($d)) > $t ) { // 验证是否有头像 $uri = "http://www.gravatar.com/avatar/" . $f . "?d=404"; $headers = @get_headers($uri); if (!preg_match("|200|", $headers[0])) { // 没有头像,则新建一个空白文件作为标记 $handle = fopen($d, "w"); fclose($handle); $a = $default; } else { // 有头像且不存在则更新 $r = get_option("avatar_rating"); $g = "http://www.gravatar.com/avatar/". $f. "?s=". $size. "&r=" . $r; copy($g, $e); } } else { $a = $default; } } $avatar = "<img alt="{$alt}" src="{$a}" class="avatar avatar-{$size} photo" height="{$size}" width="{$size}" />"; 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地址。