新版 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() 的輸出再進行處理.
這個緩存方式不必改模板, 而且連後台都可用緩存頭像, 但有些缺點是: 多了程序會較耗資源和速度, 而且後台的頭像比較小, 緩存的頭像在前台比較難看.
另外, 你也許已發現, 代碼中有兩個可用正則匹配的地方, 故意改用字串函數, 目的是加快執行速度.
例: echo get_avatar( $id_or_email, $size = '42', $default = get_bloginfo('wpurl') . '/avatar/default.jpg' );
其中 $id_or_email 的部份要看你模板怎麼寫, 後面的 $default 所帶的就是默認頭像.
以前的版本在第一次 copy 頭像時不能顯示頭像 (因為緩存沒有頭像), 這新版在第一次沒頭像時, 會直接顯示 gravatar 的頭像.
以上這兩種方法都可正確執行緩存, 要用哪個就隨你挑了~

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