我想盡可能將全部wordpress過濾器的應用教程都放在一堆,wordpress的頭像都是有第三方網站提供的,這樣有有點也有缺點,缺點:有的地方打開gravatar比較慢,還有的人根本打不開這個網站,那樣的話,頭像都顯示不了,因此咱們將頭像圖片保存在網站服務器上,在訪客留言中輸出頭像以前,先檢查一下,服務器上是否已經保存了這個頭像文件?若是保存了就不用連接到gravatar網站了。 php
首先咱們須要知道wordpress是怎樣獲取頭像的,咱們獲取評論列表使用的函數爲:wp_list_comments(),該函數位於wp-includes/comment-template.php文件,這個函數中的代碼知識一些判斷代碼真正數去評論的是類Walker_Comment,這個類的定義也在comment-template.php文件,這個類中輸出頭像就是使用的get_avatar()函數,get_avatar函數位於wp-includes/pluggable.php文件中,函數用法爲: html
- <?php
- echo get_avatar( $id_or_email, $size, $default, $alt );
- //$id_or_email爲用戶ID或E-mail或者一個comment object(評論對象)
- //$size爲頭像大小,默認爲96
- //$default一個頭像地址,默認就是那個mystery man(神祕人)
- //$alt頭像的alt信息
- ?>
查看這個函數的源碼,看不全懂也不要緊,咱們只須要找圖片代碼,直接掃視,找到含全部<img字樣的地方就行了。很容易找到是: 緩存
- $avatar = "<img alt='{$safe_alt}' src='{$out}' class='avatar avatar-{$size} photo' height='{$size}' width='{$size}' />";
- //其中$safe_alt / $out/$size分別是圖片alt信息,圖片url 圖片尺寸
這裏的圖片src輸出以後將是 服務器
- http://0.gravatar.com/avatar/e8e2f0c1a4427b67567ad3d1b582a3ce?s=32&d=http%3A%2F%2F0.gravatar.com%2Favatar%2Fad516503a11cd5ca435acc9bb6523536%3
上面的url中 avatar/到?s之間的字符是根據評論者郵箱計算的md5散列,不過前面兩段的介紹可有可無,知識介紹一個頭像獲取的方法,咱們只須要關心最終的輸出,get_avatar函數的最後面提供了一個過濾器get_avatar,咱們須要經過這個過濾器來改變頭像的url,改變爲咱們服務器上緩存的圖片url。以下 app
- return apply_filters('get_avatar', $avatar, $id_or_email, $size, $default, $alt);
既然它提供了最終的輸出過濾器,那麼咱們只須要在輸出以前修改這個url就行了。 wordpress
首先請在網站根目錄(或者其它你認爲合適的文件夾下)新建一個文件夾avatar,用來存放頭像文件。
修改代碼以下代碼: 函數
- function ashu_avatar($avatar) {
- //strpos函數計算$avatar中字符「http」的位置
- $tmp = strpos($avatar, 'http');
- //獲取src=""之間的字符串,即圖片的url
- $len = strpos($avatar, "'", $tmp) - $tmp;
- $g = substr($avatar, $tmp, $len);
- //獲取url中avatar/ 到第一個?之間的字符串,即圖片文件名
- $tmp = strpos($g, 'avatar/') + 7;
- $len2 = strpos($g, "?", $tmp) - $tmp;
- $f = substr($g, $tmp, $len2);
- //參數wpurl獲取wordpress的url地址(後臺設置的)
- $w = get_bloginfo('wpurl');
- //ABSPATH爲WordPress目錄的絕對路徑在wp-config.php中定義
- $e = ABSPATH .'avatar/'. $f .'.jpg';
- //7天=604800秒
- $t = 604900;
- //若是頭像文件不存在,或者文件存在超過$t=7天
- if ( !is_file($e) || (time() - filemtime($e)) > $t ) {
- //更新頭像文件..將$e拷貝到爲$g
- copy(htmlspecialchars_decode($g), $e);
- } else{
- //若是頭像文件存在且時間不超過7天,將原來圖片的url替換爲服務器上的圖片url
- $avatar = strtr($avatar, array($g => $w.'/avatar/'.$f.'.jpg'));
- }
- //若是頭像文件小於500字節(下面這個我也不知道原做者是什麼意思)
- if( filesize($e) < 500 ){
- //將$e拷貝爲default.jpg
- copy($w.'/avatar/default.jpg', $e);
- }
- //返回$avatar
- return $avatar;
- }
- //添加過濾器函數ashu_avatar
- add_filter('get_avatar', 'ashu_avatar');
get_avatar函數不知一個過濾器哦,仍是那句話,盡情的查找,盡情的修改,盡情的折騰吧 網站