Kirim email aktivasi pengguna saat membuat program secara pengguna

9

Saya bertanya-tanya apakah seseorang di sini mungkin dapat membantu.

Pada dasarnya, saya telah membuat formulir pendaftaran khusus yang ketika divalidasi, memasukkan pengguna ke tabel pengguna.

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

Sekarang, yang perlu saya lakukan adalah daripada mengirim email konfirmasi yang saya tahu bisa saya lakukan dengan kode berikut.

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

Saya ingin mengirim e-mail aktivasi pengguna. Saya sudah mencoba beberapa hal tetapi sepertinya saya tidak dapat menemukan sesuatu yang konkret. Berharap seseorang mungkin memiliki masalah ini sebelumnya.

Joe Buckle
sumber

Jawaban:

10

Untuk menyelesaikan proses aktivasi pengguna, Anda perlu melakukan langkah-langkah berikut:

  1. setelah membuat pengguna baru tambahkan bidang pengguna khusus yang menunjukkan bahwa pengguna ini harus mengaktifkan akunnya
  2. mengirim email dengan kode aktivasi, berikan tautan dalam email ini ke halaman di mana pengguna akan diaktifkan
  3. mengimplementasikan halaman aktivasi
  4. ketika pengguna mencoba masuk memeriksa apakah bidang pengguna kustom itu ada atau tidak. Jika ada maka jangan login dia dan tunjukkan pesan kesalahan aktivasi sebagai gantinya.

Tambahkan bidang khusus dan kirim 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 );
    }
}

Periksa aktivasi pengguna saat login:

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

Halaman aktivasi:

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

Ini adalah titik awal Anda, maju dan sesuaikan untuk kebutuhan Anda.

Eugene Manuilov
sumber
Pos yang bagus. Tapi saya pikir Anda melewatkan satu hal. Saat Anda mencegah pengguna yang tidak diotorisasi masuk, bagaimana Anda bisa mendapatkan user_id dari get_current_user_id () di halaman aktivasi?
s1lv3r
1
sial ... :) poin bagus, akan memperbaikinya sebentar lagi :)
Eugene Manuilov
Terima kasih atas informasi yang fantastis ini. Saya melihat apakah ada solusi inti untuk memicu pengiriman email aktivasi karena Anda dapat 'mengirim ulang aktivasi' di panel admin. Saya berpikir bahwa dengan memasukkan pengguna sebagai pending kode aktivasi mungkin dihasilkan dan dimasukkan ke dalam database, tetapi setelah pemeriksaan lebih lanjut saya menemukan bahwa 'jelas' tidak ada keberuntungan :) Pokoknya. Semuanya masuk akal dan terima kasih lagi.
Joe Buckle
@ JoBuckle Itu aneh. Anda seharusnya tidak memiliki resend activation-link sama sekali pada instalasi vanilla. Apakah Anda sudah menginstal plugin untuk ini? BuddyPress juga dilengkapi dengan fungsi aktivasi pengguna di luar kotak.
s1lv3r
@ s1lv3r Mungkinkah ada hubungannya dengan Theme-My-Login?
Joe Buckle
1

Dua opsi untuk dipilih:

  1. Gunakan plugin, misalnya Email aktivasi pengguna atau Setuju Pengguna Baru

  2. Kode sendiri ini.

Beberapa fungsi yang harus Anda mulai:

  • wp_mail () untuk mengirim email,
  • add_user_meta () untuk menyimpan kunci aktivasi untuk pengguna,
  • buat tautan yang berisi kunci dan letakkan di email, buat halaman di wordpress yang menangkap param kunci Anda (misalnya menggunakan add_shortcode () ),
  • gunakan get_user_meta () untuk memeriksa kunci aktivasi terhadap yang tersimpan di db, letakkan kunci meta pengguna lain untuk menandai pengguna ini sebagai diaktifkan jika berhasil,
  • tambahkan fungsi ke filter otentikasi untuk mencegah pengguna mana pun yang tidak diaktifkan untuk masuk.
s1lv3r
sumber
0

Anda bisa mendapatkan user_id dengan melakukan ini saat otentikasi:

$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...
}
Dasbairgaya
sumber