E-posta ile nasıl giriş yapılır sadece kullanıcı adı yok?


20

Birkaç gün aradıktan ve 2 yaşındaki konuları okuduktan sonra kullanıcıların yalnızca e-posta ile giriş yapma sorununa bir çözüm bulmakta zorluk çekiyorum.

İlk başta, WP_Email_Login'i yalnızca giriş yapmak için kullanıcı adınızı kullanabileceğinizi görmek için çok mutlu oldum. Bunu bir eklenti olarak nasıl yazacağımdan emin değilim. Benim fikrim register_new_user işlevini geçersiz kılmak. Bunu "takılabilir" işlevler listesinde görmedim. Bunu başarmak için filtreleri / eylemleri kullanabilir miyim?

Çekirdek dosyaları düzenlemenin moda olmadığını anlıyorum, bu yüzden bir çözümün orada olmasını umuyorum, ancak bir tane yoksa, şansımı alacağım. Wp-login.php "register_new_user" fonksiyonunun ilk satırına ekleyebilirim:

$nickname_variable(??) = $user_login // set the nickname to the username
$user_login = $user_email; // set the user_login/username to the email address

WordPress insanların kullanıcı adlarını değiştirmelerine izin vermediğinden bu oldukça iyi çalışıyor. Kayıt Ekranında (form) Kullanıcı Adı ve E-posta ister; Kullanıcı adını Takma ad değişkenine ayarlamak istiyorum (eğer biri bana takma ad değişkeninin çağrıldığını veya kayıt sırasında takdir edilecek olan yeri söyleyebilirse).

Alkış,

demirci


Kullanıcı adlarını tamamen ortadan kaldırmaya mı çalışıyorsunuz? E-posta Giriş eklentisi sizin için neden çalışmıyor?
Ryan

Neden WordPress'teki tüm kullanıcı bilgilerinin temelini oluşturduğundan, kullanıcı adlarını neden ortadan kaldırmak istediğinizi gerçekten merak ediyorum. Bu, Mesajları ortadan kaldırmaya çalışmak gibi bir şey - çok fazla ödeme için çok fazla iş ve yolda sorunların garantisi.
SickHippie

1
@ Ryan- Kullanıcı adlarından kurtulabileceğimi sanmıyorum, bunun yerine sadece kullanıcı adını e-posta adresine eşitlemeye zorlarım.
agentmith666

@SickHippie - giriş için e-postanın bir kullanıcı adından daha iyi ve benzersiz olduğunu düşünüyorum. Kullanıcı yayınladığında kullanıcı adını takma ad olarak kullanmayı tercih ederim. Haklısın, değişken "kullanıcı adı" ndan "kurtulmak" bir acı olur, bu yüzden ben değilim. Sadece kayıt olurken kullanıcı için kullanıcı adını seçiyorum (kullanıcı adı e-posta adresi olacak; takma adları kullanıcı adı olarak girecekleri olacaktır). Sonunda hiçbir değişken kaybolmaz her şey bozulmamış.
agentmith666

1
@SickHippie - Wordpress'in varsayılanı, kullanıcının kullanıcı adını değiştirmesine izin vermemek olduğundan haklısınız, iletişim e-posta adreslerini değiştirseler bile kullanıcı adları / e-posta adresleri aynı kalacaktır. Başından beri ve kendi tecrübelerime göre, insanların nadiren bir e-posta adresini "sildiğini" gördüm. Yenilerini alabilirler, ancak tipik olarak hala eski olanlarına sahip olurlar. Ve belki de bu nadir durumlarda, veritabanında manuel olarak değiştireceğiz. Geri bildiriminizi ve içgörünüzü gerçekten takdir ediyorum SickHippie! Şimdi yazıma bir çözüm umuyoruz :)
agentmith666

Yanıtlar:


19

Güncelleme: Giriş, kayıt ve e-posta ile şifre almak için bir eklenti oluşturdum.https://wordpress.org/plugins/smart-wp-login/

Kısacası, WordPress'i e-posta ile giriş yapacak şekilde yapılandırabilirsiniz.

Üç Adım:

  • Varsayılan kimlik doğrulama işlevini kaldır
  • Özel kimlik doğrulama işlevi ekle
  • Wp-login.php içindeki "Kullanıcı adı" metnini "E-posta" olarak değiştir

Bir not:

  • Çekirdek dosyaları düzenlemeyin.

WordPress varsayılan kimlik doğrulama işlevini kaldırın.

WordPress , kullanıcı girişinde ek doğrulama yapmak için " kimlik doğrulaması " filtresini kullanır .

remove_filter('authenticate', 'wp_authenticate_username_password', 20);

Özel kimlik doğrulama işlevi ekle

add_filter('authenticate', function($user, $email, $password){

    //Check for empty fields
    if(empty($email) || empty ($password)){        
        //create new error object and add errors to it.
        $error = new WP_Error();

        if(empty($email)){ //No email
            $error->add('empty_username', __('<strong>ERROR</strong>: Email field is empty.'));
        }
        else if(!filter_var($email, FILTER_VALIDATE_EMAIL)){ //Invalid Email
            $error->add('invalid_username', __('<strong>ERROR</strong>: Email is invalid.'));
        }

        if(empty($password)){ //No password
            $error->add('empty_password', __('<strong>ERROR</strong>: Password field is empty.'));
        }

        return $error;
    }

    //Check if user exists in WordPress database
    $user = get_user_by('email', $email);

    //bad email
    if(!$user){
        $error = new WP_Error();
        $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
        return $error;
    }
    else{ //check password
        if(!wp_check_password($password, $user->user_pass, $user->ID)){ //bad password
            $error = new WP_Error();
            $error->add('invalid', __('<strong>ERROR</strong>: Either the email or password you entered is invalid.'));
            return $error;
        }else{
            return $user; //passed
        }
    }
}, 20, 3);

Wp-login.php içindeki "Kullanıcı adı" metnini "E-posta" olarak değiştir

Çekirdek dosyaları düzenlemeden "Kullanıcı adı" metnini "E-posta" olarak değiştirmek için gettext filtresini kullanabiliriz .

add_filter('gettext', function($text){
    if(in_array($GLOBALS['pagenow'], array('wp-login.php'))){
        if('Username' == $text){
            return 'Email';
        }
    }
    return $text;
}, 20);

Ayrıca blogumda ayrıntılı bir makale yazdım http://www.thebinary.in/blog/wordpress-login-using-email/


2
Güzel cevap Nishant
Andrew Bartel

işe yarar! Benim durumumda sadece özel karakterleri e-postayla çıkarıyorum ve bir kullanıcı adı yapıyorum. böylece kullanici@example.com kullanici_example_com olur ve çalisir.
wpcoder

6

Mümkün, ad için filtreyi değiştirmeniz gerekir.

// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'fb_authenticate_username_password', 20, 3 );
function fb_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) )
        $user = get_user_by( 'email', $username );

    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
}

Alternatif bir eklentidir, orada eklenti deposunda Google oder aracılığıyla bulabilirsiniz; belki bu eklenti .


Cevabınız için teşekkürler ancak yazımı okuduğunuzdan veya yeterince açık olmadığımdan emin değilim. İkincisi için özür dilerim. Orijinal yazımda WP_Email_Login eklentisinden bahsetmiştim; kodunuzun ve bağlantınızın tam eklentisi. İşte orijinal yazım: "İlk başta, WP_Email_Login'i yalnızca kullanıcı adınızı hala giriş yapmak için kullanabileceğinizi görmek için gördüğüm için çok mutlu oldum." <--- Hala bir kullanıcı adı kullanabileceğim soruna bakın, bu yüzden bu eklenti çalışmaz. Kullanıcı adlarını kaldıramadığım için kullanıcı adını e-posta adresine eşit olmaya zorlayarak kayıt işlevini geçersiz kılmayı düşünüyorum.
agentmith666

Ancak çekirdek dosyaları düzenlemeden bunu başarmanın bir yolunu arıyorum. Mümkün değilse bu iyi ama her iki şekilde de bilmek istiyorum. Teşekkürler!
agentmith666

bu, çekirdek dosyaları düzenlemeden bir yoldur. Kodu bir eklentiye kopyalayın, etkinleştirin ve hazır olun.
bueltge

4

Yukarıdaki kodu kullanarak:

// Change login credentials
// remove the default filter
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );
// add custom filter
add_filter( 'authenticate', 'my_authenticate_username_password', 20, 3 );
function my_authenticate_username_password( $user, $username, $password ) {

    // If an email address is entered in the username box, 
    // then look up the matching username and authenticate as per normal, using that.
    if ( ! empty( $username ) ) {
        //if the username doesn't contain a @ set username to blank string
        //causes authenticate to fail
        if(strpos($username, '@') == FALSE){
                $username = '';
            }
        $user = get_user_by( 'email', $username );
        }
    if ( isset( $user->user_login, $user ) )
        $username = $user->user_login;

    // using the username found when looking up via email
    return wp_authenticate_username_password( NULL, $username, $password );
} 

Tek yapmamız gereken, sağlanan kullanıcı adının en azından bir e-postaya benzediğini ve değilse kullanıcı adını sabote etmek olduğunu kontrol etmekti.


'@'Kullanıcı adında ilkel dize denetimi yerine , Wordpress kullanışlı bir yerleşik işleve sahiptir: sanitize_email geçerli bir e-posta adresi biçimi veya hiçbir şey sanitize_email('email¬!"@business_com'); // Returns nothing
döndürmez

3

zaten var WP-CORE!

Şimdi wordpress zaten EMAIL'in kullanıcı adı olarak kaydedilmesine izin veriyor. ancak kayıtlı kullanıcılar hakkında konuşuyorsanız, listelenen cevapları deneyin.


1

Zarif bir çözüm oluşturmak için yukarıdaki kodda yapılacak küçük değişiklikler yeterli olmalıdır. Kimlik doğrulaması kanca belgelerine bir ya durumları WP_Usernesne veya WP_Errornesnenin döndürülmelidir.

Wp_authenticate_username_password fonksiyonu için kaynak kodu bazı oldukça basit kontroller sayesinde çalışır; bu kontrollerin yapılma şeklini çoğaltabilir WP_Errorve e-posta adresiyle ilgilenmek için yeni bir nesne oluşturabiliriz . Alternatif olarak, wp_authenticate_username_passwordkodu nasıl çalıştırabiliriz ve istersek değiştirebiliriz, ancak işlerin nasıl çalıştığını gerçekten özelleştirmek istemediğiniz sürece bu gereksiz görünüyor. Aşağıdaki kod hile yapmalıdır: (Ben kendim test etmedi rağmen ...)

// Remove the default authentication function
remove_filter( 'authenticate', 'wp_authenticate_username_password', 20, 3 );

// Add the custom authentication function
add_filter( 'authenticate', 'custom_authenticate_username_password', 20, 3 );

function custom_authenticate_username_password( $user, $username, $password ) {

    // Get the WP_User object based on the email address
    if ( ! empty( $username ) ) {
        $user = get_user_by( 'email', $username );
    }

    // Return a customized WP_Error object if a WP_User object was not be returned (i.e. The email doesn't exist or a regular username was provided)
    if ( ! $user ) {
        return new WP_Error( 'invalid_username_email', sprintf( __( '<strong>ERROR</strong>: Invalid username. Please log in with your email address. <a href="%s" title="Password Lost and Found">Lost your password</a>?' ), wp_lostpassword_url() ) );
    }

    // Hand authentication back over to the default handler now that we a have a valid WP_User object based on the email address
    return wp_authenticate_username_password( null, $username, $password );
}

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.