Gửi email kích hoạt người dùng khi lập trình tạo người dùng


9

Tôi tự hỏi nếu ai đó ở đây có thể giúp đỡ.

Về cơ bản, tôi đã tạo một biểu mẫu đăng ký tùy chỉnh mà khi được xác thực, sẽ chèn người dùng vào bảng người dùng.

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);
} 

Bây giờ, những gì tôi cần nó làm là thay vì gửi e-mail xác nhận mà tôi biết tôi có thể làm với mã sau đây.

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

Tôi muốn gửi một email kích hoạt người dùng thay thế. Tôi đã thử một vài thứ nhưng dường như tôi không thể tìm thấy bất cứ thứ gì cụ thể. Hy vọng ai đó có thể đã có vấn đề này trước đây.

Câu trả lời:


10

Để thực hiện quy trình kích hoạt người dùng, bạn cần thực hiện các bước sau:

  1. sau khi tạo người dùng mới, thêm trường người dùng tùy chỉnh cho biết người dùng này phải kích hoạt tài khoản của mình
  2. gửi email với mã kích hoạt, cung cấp một liên kết trong email này đến một trang nơi người dùng sẽ được kích hoạt
  3. thực hiện trang kích hoạt
  4. khi người dùng cố gắng đăng nhập kiểm tra xem trường người dùng tùy chỉnh đó có tồn tại hay không. Nếu nó tồn tại thì không đăng nhập anh ta và thay vào đó hiển thị thông báo lỗi kích hoạt.

Thêm trường tùy chỉnh và gửi email:

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 );
    }
}

Kiểm tra kích hoạt người dùng khi đăng nhập:

// 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;

Trang kích hoạt:

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' );
            }
        }
    }
}

Đây là điểm khởi đầu của bạn, hãy tiếp tục và điều chỉnh nó cho nhu cầu của bạn.


Bài đăng tốt. Nhưng tôi nghĩ bạn đã bỏ lỡ một điều. Khi bạn ngăn người dùng không được ủy quyền đăng nhập, làm thế nào bạn có thể lấy user_id từ get_cien_user_id () trên trang kích hoạt?
s1lv3r

1
chết tiệt ... :) điểm tốt, sẽ sửa nó trong một phút :)
Eugene Manuilov

Cảm ơn thông tin tuyệt vời này. Tôi đang xem liệu có giải pháp cốt lõi nào để kích hoạt việc gửi e-mail kích hoạt hay không vì bạn có thể 'gửi lại kích hoạt' trong bảng quản trị. Tôi nghĩ rằng bằng cách chèn người dùng đang chờ xử lý, mã kích hoạt có thể được tạo và chèn vào cơ sở dữ liệu, nhưng khi kiểm tra thêm tôi phát hiện ra rằng 'rõ ràng' không có may mắn như vậy :) Dù sao đi nữa. Tất cả đều có ý nghĩa và cảm ơn một lần nữa.
Joe Buckle

@JoeBuckle Thật lạ. Bạn hoàn toàn không nên có một liên resend activationkết trên bản cài đặt vanilla. Bạn có tình cờ đã cài đặt một plugin cho việc này không? Ngoài ra BuddyPress đi kèm với chức năng kích hoạt người dùng ra khỏi hộp.
s1lv3r

@ s1lv3r Nó có liên quan gì đến Theme-My-Đăng nhập không?
Joe Buckle

1

Hai tùy chọn để lựa chọn:

  1. Sử dụng một plugin, ví dụ email kích hoạt người dùng hoặc Phê duyệt người dùng mới

  2. Mã này cho mình.

Một số chức năng sẽ giúp bạn bắt đầu:

  • wp_mail () để gửi email,
  • add_user_meta () để lưu khóa kích hoạt cho người dùng,
  • tạo một liên kết chứa khóa và đặt nó vào email, tạo một trang trong wordpress để bắt key-param của bạn (ví dụ: sử dụng add_shortcode () ),
  • sử dụng get_user_meta () để kiểm tra khóa kích hoạt so với khóa được lưu trong db, đặt một khóa meta người dùng khác để đánh dấu người dùng này là kích hoạt nếu thành công,
  • thêm một chức năng vào bộ lọc xác thực để ngăn chặn bất kỳ người dùng nào không được kích hoạt đăng nhập.

0

Bạn có thể lấy user_id bằng cách thực hiện điều này trong khi xác thực:

$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...
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.