Programlı olarak kullanıcı oluştururken kullanıcı etkinleştirme e-postası gönder


9

Buradaki birinin yardım edip edemeyeceğini merak ettim.

Temel olarak, doğrulandığında kullanıcı tablosuna kullanıcı ekleyen özel bir kayıt formu oluşturdum.

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

Şimdi, ne yapmam gerekir aşağıdaki kod ile yapabileceğimi biliyorum onay e-posta gönderdi.

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

Bunun yerine bir kullanıcı etkinleştirme e-postası göndermek istiyorum. Birkaç şey denedim ama somut bir şey bulamıyorum. Daha önce birinin bu sorunu yaşamış olabileceğini ummak.

Yanıtlar:


10

Kullanıcı etkinleştirme işlemini gerçekleştirmek için aşağıdaki adımları uygulamanız gerekir:

  1. yeni kullanıcı oluşturduktan sonra, bu kullanıcının hesabını etkinleştirmesi gerektiğini belirten özel bir kullanıcı alanı ekleyin
  2. etkinleştirme koduna sahip bir e-posta gönderin, bu e-postada kullanıcının etkinleştirileceği bir sayfaya bir bağlantı sağlayın
  3. aktivasyon sayfasını uygula
  4. kullanıcı giriş yapmaya çalıştığında, bu özel kullanıcı alanının var olup olmadığını kontrol edin. Varsa, oturum açmayın ve bunun yerine etkinleştirme hata mesajını gösterin.

Özel alan ekleyin ve e-posta gönderin:

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

Girişte kullanıcı aktivasyonunu kontrol edin:

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

Aktivasyon sayfası:

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

Bu sizin başlangıç ​​noktanız, devam edin ve ihtiyaçlarınıza göre ayarlayın.


İyi yazı. Ama bence bir şeyi kaçırdın. Yetkisiz kullanıcıların oturum açmasını engellediğinizde, user_id'i etkinleştirme sayfasındaki get_current_user_id () öğesinden nasıl edinebilirsiniz?
s1lv3r

1
lanet olsun ... :) iyi nokta, bir dakika içinde tamir edecek :)
Eugene Manuilov

Bu harika bilgi için teşekkürler. Yönetici panelinde 'aktivasyonu yeniden gönderebildiğiniz için bir aktivasyon e-postasının gönderilmesini tetikleyen herhangi bir temel çözüm olup olmadığını görüyordum. Bekleyen bir etkinleştirme kodu olarak bir kullanıcı ekleyerek oluşturulan ve veritabanına eklenmiş olduğunu düşündüm, ama daha fazla inceleme üzerine 'Açıkçası' böyle bir şans :) Neyse keşfetti. Her şey mantıklı ve tekrar teşekkürler.
Joe Buckle

@JoeBuckle Bu çok garip. resend activationBir vanilya yüklemesinde hiç bir- linkiniz olmamalıdır . Bunun için zaten bir eklenti yüklü mü? Ayrıca BuddyPress, kutunun dışında bir kullanıcı etkinleştirme işlevselliği ile birlikte gelir.
s1lv3r

@ s1lv3r Theme-My-Login ile bir ilgisi olabilir mi?
Joe Buckle

1

Seçim yapabileceğiniz iki seçenek:

  1. Bir eklenti kullanın, örneğin Kullanıcı etkinleştirme e-postası veya Yeni Kullanıcı Onayı

  2. Bunu kendiniz kodlayın.

Başlamanız gereken bazı işlevler:

  • e-postayı göndermek için wp_mail () ,
  • kullanıcı için bir etkinleştirme anahtarı kaydetmek üzere add_user_meta () ,
  • anahtarı içeren bir bağlantı oluşturun ve e-postaya yerleştirin, wordpress'te anahtar parametrenizi yakalayan bir sayfa oluşturun (örneğin add_shortcode () kullanarak ),
  • db'de saklanan etkinleştirme anahtarını etkinleştirmek için get_user_meta () yöntemini kullanın , bu kullanıcıyı başarılı olursa etkin olarak işaretlemek için başka bir kullanıcı meta anahtarı yerleştirin,
  • etkinleştirilmemiş herhangi bir kullanıcının oturum açmasını önlemek için kimlik doğrulama filtresine bir işlev ekleyin .

0

Kimlik doğrulama sırasında bunu yaparak user_id parametresini alabilirsiniz:

$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...
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.