Gravatar의 글로벌 아바타를 캐싱하는 목적은 웹사이트 오픈 속도를 높이는 것입니다. Gravatar 공식 웹사이트의 서버가 해외에 있고, 엄청난 GFW로 인해 국내 오픈 속도가 매우 느린 경우가 많습니다. 방법은 willin에서 왔는데, 그의 웹사이트를 더 이상 열 수 없는 것 같습니다
Gravata 전역 아바타를 로컬에 캐시
캐싱 방법
1. 캐시 디렉토리를 생성합니다
워드프레스 루트 디렉토리에 아바타라는 폴더를 생성하고 해당 폴더의 권한을 0755로 설정합니다(0755가 안되면 0777을 시도해보세요).
2. 기본 아바타 설정
적당한 크기(32*32이면 충분)의 기본 아바타를 준비하고 이름을 "default.jpg"로 지정하여 아바타 폴더에 넣습니다.
3. 캐시 코드 추가
다음 코드를 테마의 function.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');
이메일을 통해 Gravatar 아바타가 있습니다
사용자가 Gravatar를 설정했는지 여부도 알아야 하는 경우가 많습니다. 예를 들어 사용자가 Gravatar 아바타를 설정하지 않으면 로컬 기본 아바타가 직접 표시됩니다. 또는 이미 아바타를 설정한 사용자를 방해하지 않고 사용자가 Gravatar 아바타를 설정하지 않았다는 알림을 받게 됩니다. 오늘 공유된 코드는 이메일 주소를 통해 사용자가 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 = ""; 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 함수는 이메일을 통해서만 보낼 수 있으므로 사용자의 아바타를 검색하려면 위의 경우 첫 번째 매개변수를 이메일 주소로 변경해야 합니다.
더 많은 관련 튜토리얼을 보려면 PHP 프로그래밍 입문부터 숙달까지 전체 비디오 튜토리얼을 확인하세요.