암호변경링크 수정과 함께 워드프레스 회원가입환영 및 암호초기화 이메일 변경

워드프레스 사이트에 회원가입 후 환영이메일로 제공하는 ‘암호변경링크’가 메일 서비스마다 달라 링크 오류나 하이퍼링크의 편리를 누리지 못하는 때를 다음 포스트에서 살폈습니다.

암호 초기화 링크가 올바르지 않은 것 같습니다 아래에서 새 링크를 요청해주세요

포스트에서는, 이메일로 제공하는 암호변경링크에 <, > 기호가 있을 때 메일 서비스마다 운용 정책을 달리하기에 오류 등이 발생한다고 정리하였습니다.

이 포스트에서는 워드프레스 기본 가입 및 암호변경에 관련한 이미지를 포함하여 안내하지 않기에 앞의 포스트를 둘러본 후 이 포스트를 보는 게 좋습니다.

회원제 워드프레스 사이트라면

혼자 사용하는 워드프레스 사이트라면 이런 문제를 고민하지 않아도 되지만, 회원제 사이트일 때는 이런 내용을 공지 포스트 등으로 안내하는 것도 번거롭고 가입한 회원에게 조금 불편을 줄 수 있어 암호변경을 하지 못하는 회원도 있을 수 있습니다. 그래서, 워드프레스에서 암호변경과 관련한 이메일을 직접 변경하는 것이 더 좋습니다.

암호변경링크 제공 기본 이메일

워드프레스에서 회원의 암호변경 기본 방식은 관리페이지 프로필 페이지를 제외하면 다음 2가지 정도가 떠오릅니다.

  1. 회원가입 후 환영 이메일을 통한 암호변경(등록) 링크 제공
  2. 로그인 전 암호를 잊었을 때 새 암호 요청 버튼

코덱스에서 제공하는 함수와 필터의 예시를 그대로 인용하여 원하는 텍스트 및 일부 정의만 편집하면 쉽게 적용할 수 있습니다.

가입환영 이메일 제목 및 내용 변경

코덱스 다음 링크 페이지에서는 wp_new_user_notification 함수에 관하여 안내하고 있습니다.

wp_new_user_notification()

사이트 가입에 관한 내용과 암호변경링크를 제공하는 함수로 안내하고 있습니다. 이 페이지에 함수 소스코드는 다음과 같은데, 이 포스트에서 변경할 일부만 나열합니다.

function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
    
    //
 
    /* translators: %s: user login */
    $message = sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
    $message .= __('To set your password, visit the following address:') . "\r\n\r\n";
    $message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
 
    $message .= wp_login_url() . "\r\n";
 
    $wp_new_user_notification_email = array(
        'to'      => $user->user_email,
        /* translators: Password change notification email subject. %s: Site title */
        'subject' => __( '[%s] Your username and password info' ),
        'message' => $message,
        'headers' => '',
    );
    
    //
    
}

위 코드 8번 줄은 다음 1번 줄로, <, > 기호가 있습니다. 2번 줄로 변경합니다.

$message .= '<' . network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . ">\r\n\r\n";
$message .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . "\r\n\r\n";

network_site_url 대신 site_url 함수를 사용해도 되지만, 변경하지 않고 그대로 사용합니다.

6번 줄에서 18번 줄은 가입한 회원이 받는 메일 제목과 내용입니다. 다음으로 변경하였습니다. 메일 내용을 쉽게 한글로 입력하였고, 일부 내용을 제거한 것입니다. 원하는 단어나 문장을 적으면 됩니다.

$msg .= sprintf(__('Username: %s'), $user->user_login) . "\r\n\r\n";
$msg .= __('가입 후 암호는 난수로 지정되어 있습니다. 아래 주소를 클릭 또는 복사하여 방문한 후 암호를 원하는 것으로 변경하세요.') . "\r\n\r\n";
$msg .= network_site_url("wp-login.php?action=rp&key=$key&login=" . rawurlencode($user->user_login), 'login') . "\r\n\r\n";

//$message .= wp_login_url() . "\r\n";

$wp_new_user_notification_email = array(
    'to'      => $user->user_email,
    'subject' => __( '[%s] 사용자명과 암호 등록 주소 정보' ),
    'message' => $msg,
    'headers' => '',
);

관리자가 받는 메일도 함께 포함되어 있지만, 이 포스트에서는 그대로 둡니다. 원한다면 찾아 변경하면 됩니다.

Pluggable Functions

wp_new_user_notification 함수로 재정의한 워드프레스 기본 가입환영 이메일 코드는 다음처럼 function_exists 함수를 조건으로 감싸는 것이 좋습니다.

if ( !function_exists('wp_new_user_notification') ) {
    function wp_new_user_notification( $user_id, $deprecated = null, $notify = '' ) {
        //
    }
}

wp_new_user_notification 함수는 워드프레스 ‘Pluggable 함수’ 중 하나입니다. Pluggable 함수는 다음처럼 간단하게 정의할 수 있습니다.

코어 함수 중 사용자가 플러그인으로 재정의 할 수 있는 함수. 한 번만 재정의 할당할 수 있으므로 오류를 막으려면 조건으로 감싸야 함.

재정의할 수 있는 코어 함수이므로 혹시 다른 플러그인을 사용할 때 해당 함수를 반복 정의한 때가 있을 수 있어 오류를 막기 위해 조건으로 감싸는 것이 필요하다는 뜻입니다. 또, 훅을 사용하지 않아도 적용할 수 있습니다.

여기까지 변경한 코드를 사용해도 아직 변경한 내용이 적용되지는 않습니다. 나머지 메일도 변경한 후 다시 알아봅니다.

새 암호 요청 버튼에 의한 암호변경링크 메일

워드프레스 기본 로그인 페이지에서 암호를 잊었을 때 요청하면 메일로 암호변경링크를 받을 수 있습니다. 그 메일의 제목과 내용은 다음 2가지 필터를 사용하면 간단하게 변경할 수 있습니다.

retrieve_password_message
retrieve_password_title

해당 필터로 이메일 내용 변경을 위한 코드를 작성하면 다음과 같습니다. 코드와 내용은 원하는 것으로 입력하고 설정하면 됩니다.

/* 암호 초기화 및 재설정 링크 안내 이메일 내용 */
add_filter( 'retrieve_password_message', function ( $message, $key, $user_login, $user_data ) {
    $user_login = stripslashes( $user_data->user_login ); // 로그인 아이디
    $user_email = stripslashes( $user_data->user_email ); // 이메일

    $message = "다음 계정(이메일)의 암호 초기화를 요청하였습니다.\n\n";
    $message .= sprintf( '%s (%s) - 요청시각: %s', $user_login, $user_email, current_time( 'mysql' ) ) . "\n\n";
    $message .= "만약 실수로 요청한 것이라면 이 이메일은 그냥 무시하면 됩니다. 아무일도 일어나지 않아요.\n\n";
    $message .= "암호 초기화를 요청했다면 아래 주소를 클릭 또는 복사하여 암호 등록 페이지로 이동하세요.\n\n";
    $message .= network_site_url( "wp-login.php?action=rp&key=$key&login=" . rawurlencode( $user_login ), 'login' ) . "\n\n";
    $message .= "정말 모르겠다면, 뭔가 문제가 있다면 다음 이메일로 문의하세요.\n\n";
    $message .= get_option('admin_email');

    return $message;

}, 10, 4 );

/* 암호 초기화 및 재설정 링크 안내 이메일 제목 */
add_filter( 'retrieve_password_title', function( $title ) {
    $blogname = wp_specialchars_decode( get_option('blogname'), ENT_QUOTES );
    $title = sprintf( '[%s] 암호 초기화 및 재등록 링크 안내', $blogname );
    return $title;
} );

Plugins, Must Use Plugins

이 포스트의 완성 파일은 다음 링크의 페이지에서 받을 수 있습니다. 흥미롭다면 받아서 파일을 열어보세요. 디렉터리 없는 파일입니다.

이 파일을 받은 후 업로드 방식의 플러그인 설치로 사용하거나 Must Use Plugins(MUP) 방식으로 사용할 수 있습니다. 파일의 헤더 텍스트를 제외하고, 코드만 테마 파일에 사용하면 적용되지 않습니다.

MUP 방식이 조금 더 유리한 때가 있는데, 다른 플러그인에서 같은 함수를 사용할 때 그 플러그인이 이 포스트에서 정의한 플러그인을 제어할 가능성이 있으므로 그것을 막기 위해 MUP로 사용하면 됩니다.

MUP로 사용하는 방식은 다음 링크를 참고하세요.

Must Use Plugins

다른 오류 가능성이 없다는 것을 확신한다면 보통의 플러그인 설치로 사용해도 문제는 없습니다.

결과

그림들은 링크오류가 있는 daum.net 기준이며, 가입 후 메일 제목, 암호변경 요청 후 메일 제목은 다음 그림처럼 변경됩니다. 화살표 방향이 변경 후의 결과입니다.

가입환영 및 암호변경 요청 이메일 제목 변경 결과
가입환영 및 암호변경 요청 이메일 제목 변경 결과

가입환영 이메일 내용 변경 결과는 다음과 같습니다.

가입환영 메일 내용 결과
가입환영 메일 내용 결과

암호변경요청에 의한 이메일 내용 변경 결과는 다음 그림과 같습니다.

암호변경요청에 의한 이메일 내용 변경 결과
암호변경요청에 의한 이메일 내용 변경 결과

원하는 단어와 문장, 출력 요소를 정의해보세요.