워드프레스 댓글 기본 아바타 이미지 변경하기(without plugin)

댓글 아바타 이미지가 깨지는 현상이 나타남

몇일전 블로그에 접속했다가 우연히 위와 같은 증상을 봤습니다.

처음에는 제 서버에 무슨 문제가 생긴줄 알았는데 이미지 링크를 보고 기본 이미지가 제 서버가 아닌 gravatar.com에서 가져온다는 사실을 알게 됐습니다.

기본 댓글 아바타 url 확인

위 스샷 처럼 댓글아바타는 gravatar.com 가 원소스입니다. 그래서 이번 사태처럼 또 gravatar.com에 장애가 생기면 내 블로그 댓글 이미지도 또 깨지겠구나 라는 생각에 아예 제 서버에서 이미지를 로딩하도록 수정하는 방법을 검색해 봤습니다.

function linsoo_avatar_defaults ($avatar_defaults) {
    $myavatar = '기본 이미지 주소 https://블로그 주소/이미지.webp';
    $avatar_defaults[$myavatar] = "Linsoo";
    return $avatar_defaults;
}
add_filter( 'avatar_defaults', 'linsoo_avatar_defaults' );

꽤 많은 사이트에서 위와 비슷한 코드가 있었고 저도 그대로 적용해 봤습니다. (코드는 테마의 functions.php 에 적용합니다)

기본 아바타 변경 메뉴

코드를 등록하고 워드프레스 설정->토론->기본 아바타에 보면 코드로 등록된 아바타 이미지와 이름이 보입니다. 선택하고 “변경사항 저장” 을 눌러줍니다.

기본 아바타 이미지 url이 gravatar.com을 경유하게 나옴

하지만 저는 여전히 댓글 아바타 이미지가 깨져서 나왔습니다. (스샷은 본문 작성중에 찍은거라 이미지가 나옵니다)

아바타 url 만드는 코드

이유는 아바타 이미지 url 생성 코드가 항상 gravatar.com에 질의하도록 되어 있고 파라미터로 들어간값(URL)이 gravatar.com에 등록된 것이 아니면 리다이렉트 하도록 되어 있는거죠. 그래서 gravatar.com에 접속 문제가 생기면 댓글 아바타는 여전히 안보이게 되는것입니다.

그래서 아바타 이미지 url 생성에 hook를 걸기로 했습니다.

function linsoo_get_avatar_url( $url, $id_or_email, $args ) {
    
    //-----------------------------------------------------------------
    //get_avatar_data 함수 내부에 있는거 가져다가 씀 (https://core.trac.wordpress.org/browser/tags/6.3/src/wp-includes/link-template.php#L4345)
    $user	= false;
    $email	= false;
    if ( is_numeric( $id_or_email ) ) {
        $user = get_user_by( 'id', absint( $id_or_email ) );
    } elseif ( is_string( $id_or_email ) ) {
        if ( strpos( $id_or_email, '@md5.gravatar.com' ) ) {
            // MD5 hash.
            list( $email_hash ) = explode( '@', $id_or_email );
        } else {
            // Email address.
            $email = $id_or_email;
        }
    } elseif ( $id_or_email instanceof WP_User ) {
        // User object.
        $user = $id_or_email;
    } elseif ( $id_or_email instanceof WP_Post ) {
        // Post object.
        $user = get_user_by( 'id', (int) $id_or_email->post_author );
    } elseif ( $id_or_email instanceof WP_Comment ) {
        if ( ! is_avatar_comment_type( get_comment_type( $id_or_email ) ) ) {
            $args['url'] = false;
            /** This filter is documented in wp-includes/link-template.php */
            return apply_filters( 'get_avatar_data', $args, $id_or_email );
        }

        if ( ! empty( $id_or_email->user_id ) ) {
            $user = get_user_by( 'id', (int) $id_or_email->user_id );
        }
        if ( ( ! $user || is_wp_error( $user ) ) && ! empty( $id_or_email->comment_author_email ) ) {
            $email = $id_or_email->comment_author_email;
        }
    }
    //-----------------------------------------------------------------
    
    //내 블로그엔 유저가 관리자 밖에 없으니 관리자임.
    //만약 멀티 블로그나 유저가 여러면이면 유저id마다 구분지어서 이미지를 바꿔준다.
    if ( $user ) {
        return 'https://블로그주소/관리자이미지URL';
    }
    
    //서버에 유저 정보는 없고 이메일 정보만 있으면 외부인이 이메일 주소를 남겼으니 
    //gravatar로 정보를 넘기고 거기서 받는 이미지를 출력한다.
    if ( $email ) {
        return $url;
    }
    
    //아무 정보 없이 댓글만 달았을때 이미지 주소
    return 'https://블로그주소/출력하고싶은이미지URL';
}
add_filter( 'get_avatar_url', 'linsoo_get_avatar_url', 10, 3 );

(윗부분은 get_avatar_data 함수 내부에서 url 만들때 쓰는 코드를 그대로 복불한거라 불필요한 변수나 연산이 있을 수 있습니다.)

제 블로그에는 유저가 1명만 등록되어 있기 때문에 유저 정보가 있을경우 바로 관리자 계정이라는걸 알 수 있습니다. 멀티 블로그 유저는 추가 구분하는 코드가 필요 합니다.

  • 유저 정보가 있으면 관리자로 간주하고 관리자 이미지를 출력합니다.
  • 유저 정보는 없고 이메일 정보만 있으면 gravatar.com에 그대로 전달해서 이미지를 받아옵니다. 이때 gravatar.com에 등록되지 않은 이메일 경우 위 코드(avatar_defaults)에 등록된 이미지 url이 리다이렉트되서 출력됩니다.
  • 마지막으로 이메일 정보 없이 댓글만 달렸을경우 기본 이미지를 출력합니다.
function linsoo_pre_get_avatar_data( $args, $id_or_email  ) {
    $args['default'] = get_option( 'avatar_default', 'mystery' );
    return $args;
}
add_filter( 'pre_get_avatar_data', 'linsoo_pre_get_avatar_data', 10, 2 );

이 코드는 관리자 페이지에서도 제대로 반영되게 해줍니다. 이 코드가 없으면 포스트 댓글 아바타는 제대로 나오지만 관리자 페이지 댓글에서는 디폴트값인 미스테리로 들어갑니다.

 

아무튼 결과는 아래와 같습니다.

gravatar.com에 등록된 이메일을 적은 댓글의 아바타

gravatar.com에 이미지 등록하고 쓰시는 분이 이메일 댓글을 남기면 해당 이미지를 출력합니다.

gravatar.com에 미등록된 이메일을 적은 댓글 아바타

gravatar.com에 미등록 이메일일 경우 라이언이 출력됩니다.

이메일 주소 없이 달린 댓글의 아바타

이메일 정보 없이 댓글만 달면 춘식이가 출력됩니다.


Comments

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다