新版 Gravatar 緩存

這是基於《簡易的 Gravatar 頭像緩存》所作的改進, 想用舊版當然也沒問題, 只是這次寫成 function, 改模板較為簡單.

同樣, 先在你的網站 wp-content 的同級目錄建立資料夾: /avatar 權限:755, 這是準備 Gravatar 緩存的路徑.
準備一張適合你模板尺寸的默認頭像, 名為"default.jpg" 放在此路徑.

將下列代碼 copy 到模板的 functions.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* Mini Gavatar Cache by Willin Kan. */
function my_avatar( $email, $size = '42', $default = '', $alt = false ) {
  $alt = (false === $alt) ? '' : esc_attr( $alt );
  $f = md5( strtolower( $email ) );
  $w = get_bloginfo('wpurl');
  $a = $w. '/avatar/'. $f. '.jpg';
  $e = ABSPATH. 'avatar/'. $f. '.jpg';
  $t = 1209600; //設定14天, 單位:秒
  if ( empty($default) ) $default = $w. '/avatar/default.jpg';
  if ( !is_file($e) || (time() - filemtime($e)) > $t ){ //當頭像不存在或文件超過14天才更新
    $r = get_option('avatar_rating');
    $g = sprintf( "http://%d.gravatar.com", ( hexdec( $f{0} ) % 2 ) ). '/avatar/'. $f. '?s='. $size. '&d='. $default. '&r='. $r;
    copy($g, $e); $a = esc_attr($g); //新頭像 copy 時, 取 gravatar 顯示
  }
  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);
}
// -- END ----------------------------------------

上面第一行的 $size 可先定義好.
然後將所有 get_avatar() 改 my_avatar(), 大概是 functions.php, comments.php, sidebar.php, comments-ajax.php 會有頭像的地方有這 get_avatar() 函數.
 
注意這 my_avatar() 的方法和 get_avatar() 有一點差別.
get_avatar() 可用 id 或 email, 可寫成 get_avatar($comment, $size= ...
而 my_avatar() 只能用 email, 要改成 my_avatar($comment->comment_author_email, $size= ...
使用參數如下:

1
 <?php echo my_avatar( $email, $size, $default, $alt ); ?>

至於 WP 3.0 不用頭像緩存的那說法我要收回 (這要拜賜於偉大的牆), 我又開始用這方法緩存了.
 
後記:
感謝 winy 提醒 "可用 add_filter 直接 hook 到 get_avatar 函数".
如此一來, 就可以不用改模板, 直接使用 get_avatar() 就有緩存.

同樣, 先在你的網站 wp-content 的同級目錄建立資料夾: /avatar 權限:755, 這是準備 gravatar 緩存的路徑.
準備一張適合你模板尺寸的默認頭像, 名為"default.jpg" 放在此路徑.

將下列代碼 copy 到模板的 functions.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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');

你會發現寫法大不相同, 這是因前面一個 my_avatar() 是獨立函數, 不再使用 get_avatar().
而這個是將 my_avatar() 掛勾在 get_avatar() 後面, 將 get_avatar() 的輸出再進行處理.
這個緩存方式不必改模板, 而且連後台都可用緩存頭像, 但有些缺點是: 多了程序會較耗資源和速度, 而且後台的頭像比較小, 緩存的頭像在前台比較難看.
另外, 你也許已發現, 代碼中有兩個可用正則匹配的地方, 故意改用字串函數, 目的是加快執行速度.

注意: 因為這方法是掛在 get_avatar() 後面, 所以必須在 get_avatar() 定義 $default,
例: echo get_avatar( $id_or_email, $size = '42', $default = get_bloginfo('wpurl') . '/avatar/default.jpg' );
其中 $id_or_email 的部份要看你模板怎麼寫, 後面的 $default 所帶的就是默認頭像.

以前的版本在第一次 copy 頭像時不能顯示頭像 (因為緩存沒有頭像), 這新版在第一次沒頭像時, 會直接顯示 gravatar 的頭像.
以上這兩種方法都可正確執行緩存, 要用哪個就隨你挑了~
 

93 篇回應 (訪客:48 篇, 博主:30 篇, 引用:15 篇)

  1. 看见这个:多了程序會較耗資源和速度,就不敢用了!!

留下評論

:?: :razz: :sad: :!: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: :smile: :evil:
貼圖 表情 ( ps. 若要貼代碼, 請將 "<" 改成 "&lt;" 即可, 此方法在所有 WP 網站均適用. )

Trackbacks/Pingbacks

  1. 整合侧边最新评论和评论框中的 Gravatar 缓存 (代码版) - Forece Blog --- 2010年 08月 30日
  2. 新主题Z-Turn上线测试 _ BoKeam's Blog --- 2010年 08月 28日
  3. 异步执行的 Gravatar 缓存 - 光线誌 --- 2010年 08月 23日
  4. Sumvo波之-独立博客-生活.感悟.继续生活 » 折腾博客折腾自己 --- 2010年 08月 18日
  5. WordPress免插件读者墙改进版 | 壹品集 --- 2010年 08月 16日
  6. 日更大概是有瘾的 – 静夜燃香 --- 2010年 08月 13日
  7. WP Gravatar头像缓存代码版 --- 2010年 08月 10日
  8. [WordPress]Willin Kan的新版 Gravatar 緩存 | 第三度 --- 2010年 08月 01日
  9. Gravatar头像缓存 « 小居 --- 2010年 07月 28日
  10. Wordpress Gravatar 头像缓存 | Alan's World --- 2010年 07月 26日
  11. Wordpress「A9」Theme by Willin Kan | 阿邙’S Blog --- 2010年 07月 17日
  12. 免插件读者墙完整精确免修改版 | 阿邙’S Blog --- 2010年 06月 28日
  13. 免插件最新评论代码-纠错篇 | 阿邙’S Blog --- 2010年 06月 23日
  14. 我的Wordpress,这些一个都不能少(一) | 阿邙’S Blog --- 2010年 06月 21日
  15. 新主题Green living上线测试. | 阿邙’S Blog --- 2010年 06月 15日

這篇文章上的評論 RSS feed TrackBack URL