프로그래밍 방식으로 사용자를 만들 때 사용자 활성화 전자 메일 보내기


9

여기 누군가 도울 수 있을지 궁금했습니다.

기본적으로, 유효성을 검사 할 때 사용자를 사용자 테이블에 삽입하는 사용자 지정 등록 양식을 만들었습니다.

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    wp_insert_user($default_newuser);
} 

이제 내가해야 할 일은 다음 코드로 수행 할 수있는 확인 전자 메일을 보내는 것이 아닙니다.

wp_new_user_notification($user_id, $data['user_pass']);

대신 사용자 활성화 전자 메일을 보내려고합니다. 몇 가지를 시도했지만 구체적인 것을 찾을 수없는 것 같습니다. 누군가 전에이 문제가 있었기를 바랐습니다.

답변:


10

사용자 활성화 프로세스를 수행하려면 다음 단계를 수행해야합니다.

  1. 새 사용자를 만든 후이 사용자가 자신의 계정을 활성화해야 함을 나타내는 사용자 정의 사용자 필드를 추가하십시오.
  2. 활성화 코드가 포함 된 이메일을 보내고 사용자가 활성화 될 페이지로이 이메일에 링크를 제공하십시오
  3. 활성화 페이지 구현
  4. 사용자가 로그인을 시도 할 때 해당 사용자 정의 사용자 필드가 존재하는지 여부를 확인하십시오. 존재하는 경우 로그인하지 말고 대신 활성화 오류 메시지를 표시하십시오.

맞춤 입력란을 추가하고 이메일을 보냅니다.

function _new_user($data) {

    // Separate Data
    $default_newuser = array(
        'user_pass' =>  wp_hash_password( $data['user_pass']),
        'user_login' => $data['user_login'],
        'user_email' => $data['user_email'],
        'first_name' => $data['first_name'],
        'last_name' => $data['last_name'],
        'role' => 'pending'
    );

    $user_id = wp_insert_user($default_newuser);
    if ( $user_id && !is_wp_error( $user_id ) ) {
        $code = sha1( $user_id . time() );
        $activation_link = add_query_arg( array( 'key' => $code, 'user' => $user_id ), get_permalink( /* YOUR ACTIVATION PAGE ID HERE */ ));
        add_user_meta( $user_id, 'has_to_be_activated', $code, true );
        wp_mail( $data['user_email'], 'ACTIVATION SUBJECT', 'CONGRATS BLA BLA BLA. HERE IS YOUR ACTIVATION LINK: ' . $activation_link );
    }
}

로그인시 사용자 활성화를 확인하십시오.

// override core function
if ( !function_exists('wp_authenticate') ) :
function wp_authenticate($username, $password) {
    $username = sanitize_user($username);
    $password = trim($password);

    $user = apply_filters('authenticate', null, $username, $password);

    if ( $user == null ) {
        // TODO what should the error message be? (Or would these even happen?)
        // Only needed if all authentication handlers fail to return anything.
        $user = new WP_Error('authentication_failed', __('<strong>ERROR</strong>: Invalid username or incorrect password.'));
    } elseif ( get_user_meta( $user->ID, 'has_to_be_activated', true ) != false ) {
        $user = new WP_Error('activation_failed', __('<strong>ERROR</strong>: User is not activated.'));
    }

    $ignore_codes = array('empty_username', 'empty_password');

    if (is_wp_error($user) && !in_array($user->get_error_code(), $ignore_codes) ) {
        do_action('wp_login_failed', $username);
    }

    return $user;
}
endif;

활성화 페이지 :

add_action( 'template_redirect', 'wpse8170_activate_user' );
function wpse8170_activate_user() {
    if ( is_page() && get_the_ID() == /* YOUR ACTIVATION PAGE ID HERE */ ) {
        $user_id = filter_input( INPUT_GET, 'user', FILTER_VALIDATE_INT, array( 'options' => array( 'min_range' => 1 ) ) );
        if ( $user_id ) {
            // get user meta activation hash field
            $code = get_user_meta( $user_id, 'has_to_be_activated', true );
            if ( $code == filter_input( INPUT_GET, 'key' ) ) {
                delete_user_meta( $user_id, 'has_to_be_activated' );
            }
        }
    }
}

이것이 출발점입니다. 필요에 따라 조정하십시오.


좋은 소식입니다. 하지만 한 가지보고 싶었다고 생각합니다. 권한이없는 사용자가 로그인하지 못하게 할 경우 활성화 페이지의 get_current_user_id ()에서 user_id를 어떻게 얻을 수 있습니까?
s1lv3r

1
빌어 먹을 ... :) 좋은 점은 :) 분에 해결됩니다
유진 Manuilov

이 환상적인 정보에 감사드립니다. 관리자 패널에서 '활성화 재전송'이 가능하기 때문에 활성화 전자 메일 전송을 트리거하는 핵심 솔루션이 있는지 알고있었습니다. 보류 코드로 사용자를 삽입하면 활성화 코드가 생성되어 데이터베이스에 삽입 될 수 있다고 생각했지만 추가 검사를 통해 그런 운이 없다는 것을 분명히 알았습니다. :) 어쨌든. 모든 것이 의미가 있고 다시 감사합니다.
Joe Buckle

@JoeBuckle 이상하다. resend activation바닐라 설치시 -link 가 없어야합니다 . 이미 플러그인이 설치되어 있습니까? 또한 BuddyPress는 사용자 활성화 기능을 기본적으로 제공합니다.
s1lv3r

@ s1lv3r Theme-My-Login과 관련이있을 수 있습니까?
Joe Buckle

1

선택할 수있는 두 가지 옵션 :

  1. 플러그인 (예 : 사용자 활성화 이메일 또는 새 사용자 승인)을 사용하십시오.

  2. 이것을 직접 코딩하십시오.

시작해야 할 몇 가지 기능 :

  • 이메일을 보내려면 wp_mail ()
  • add_user_meta () 는 사용자의 활성화 키를 저장합니다.
  • 키가 포함 된 링크를 생성하여 이메일에 배치하고 키 매개 변수를 포착하는 워드 프레스 페이지를 작성하십시오 (예 : add_shortcode () 사용 ).
  • get_user_meta () 를 사용 하여 db에 저장된 것과 비교하여 활성화 키를 확인하고 다른 사용자 메타 키를 배치하여 성공한 경우이 사용자를 활성화 된 것으로 표시하십시오.
  • 인증 되지 않은 사용자가 로그인하지 못하도록 인증 필터에 기능을 추가하십시오 .

0

인증하는 동안 이것을 수행하여 user_id를 얻을 수 있습니다.

$username='user email provided by the user at login panel.';
$results = $wpdb->get_row( "SELECT ID FROM wp_users WHERE user_email='".$username."'");
   $activation_id = $results->ID;
   $activation_key =  get_user_meta( $activation_id, 'has_to_be_activated', true );
 if($activation_key != false )
 {
  echo '<h4 class="error">Your account has not been activated yet.<br /> To activate it check your email and clik on the activation link.</h4>';
 }
else{
//authenticate your user login here...
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.