Bagaimana cara masuk hanya dengan email tanpa nama pengguna?

20

Setelah mencari selama beberapa hari dan membaca utas berusia 2 tahun, saya mengalami kesulitan menemukan solusi untuk masalah pengguna login hanya melalui email.

Awalnya saya senang melihat WP_Email_Login hanya untuk mengetahui Anda masih dapat menggunakan nama pengguna Anda untuk login. Saya tidak yakin bagaimana cara menulis ini sebagai plugin. Ide saya adalah mengganti fungsi register_new_user. Saya tidak melihat ini pada daftar fungsi "pluggable". Bisakah saya menggunakan filter / tindakan untuk mencapai ini?

Saya menyadari itu tidak modis untuk mengedit file inti jadi saya berharap ada solusi di luar sana namun jika tidak ada saya akan mengambil peluang saya. Di baris pertama fungsi "register_new_user" di wp-login.php saya dapat menambahkan:

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

Ini berfungsi dengan baik karena WordPress tidak memungkinkan orang untuk mengubah nama pengguna mereka. Di Layar Registrasi (formulir) ia meminta Nama Pengguna & Email; Saya ingin mengatur Nama Pengguna ke variabel Nama Panggilan (jika seseorang dapat memberi tahu saya nama variabel nama panggilan atau di mana itu ditetapkan selama pendaftaran yang akan dihargai).

Bersulang,

Smith

agenmith666
sumber
Apakah Anda mencoba menghapus nama pengguna sepenuhnya? Mengapa plugin Email Login tidak berfungsi untuk Anda?
Ryan
Saya benar-benar ingin tahu mengapa Anda ingin menghapus nama pengguna, karena itu adalah dasar dari semua informasi pengguna di WordPress. Ini seperti mencoba menghapus posting - banyak pekerjaan karena tidak banyak hasil, dan jaminan masalah di ujung jalan.
SickHippie
1
@ Ryan- Saya tidak berpikir saya akan bisa menyingkirkan nama pengguna jadi alih-alih saya hanya memaksa nama pengguna untuk menyamai alamat email.
agenmith666
@SickHippie - untuk login saya pikir email lebih baik dan lebih unik daripada nama pengguna. Saya lebih suka menggunakan nama pengguna sebagai nama panggilan saat pengguna memposting. Anda benar akan menyebalkan untuk "menyingkirkan" variabel "nama pengguna" itulah sebabnya saya tidak. Saya hanya memilih nama pengguna untuk pengguna ketika mereka mendaftar (nama pengguna akan menjadi alamat email mereka; nama panggilan mereka akan menjadi apa yang mereka masukkan sebagai nama pengguna mereka). Pada akhirnya tidak ada variabel yang hilang semuanya utuh.
agenmith666
1
@SickHippie - Anda benar karena default Wordpress adalah tidak mengizinkan pengguna untuk mengubah nama pengguna mereka, nama pengguna / alamat email mereka akan tetap sama walaupun mereka harus mengubah alamat email kontak mereka. Saya telah mempertimbangkan itu sejak awal dan dalam pengalaman saya sendiri, saya telah menemukan bahwa orang jarang "menghapus" alamat email. Mereka mungkin mendapatkan yang baru tetapi biasanya mereka masih memiliki yang lama. Dan jika tidak mungkin dalam keadaan langka itu kami akan mengubahnya secara manual dalam database. Saya sangat menghargai umpan balik & wawasan Anda SickHippie! Sekarang saya berharap untuk solusi untuk posting saya :)
agentsmith666

Jawaban:

19

Pembaruan: Saya telah membuat plugin untuk login, registrasi dan mengambil kata sandi dengan email. https://wordpress.org/plugins/smart-wp-login/

Jawaban singkatnya, Anda dapat mengonfigurasi WordPress untuk masuk dengan email.

Tiga langkah:

  • Hapus fungsi otentikasi standar
  • Tambahkan fungsi otentikasi khusus
  • Ubah teks "Nama pengguna" di wp-login.php menjadi "Email"

Satu catatan:

  • Jangan mengedit file inti.

Hapus fungsi otentikasi standar WordPress.

WordPress menggunakan filter " otentikasi " untuk melakukan validasi tambahan saat login pengguna.

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

Tambahkan fungsi otentikasi khusus

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

Ubah teks "Nama pengguna" di wp-login.php menjadi "Email"

Kita dapat menggunakan filter gettext untuk mengubah teks "Nama pengguna" menjadi "Email" tanpa mengedit file inti.

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

Saya juga telah menulis artikel terperinci di blog saya http://www.thebinary.in/blog/wordpress-login-using-email/

Nishant Kumar
sumber
2
Jawaban bagus Nishant
Andrew Bartel
berguna! Dalam kasus saya, saya hanya menghapus karakter khusus email dan menjadikannya nama pengguna. jadi [email protected] menjadi user_example_com dan berhasil.
wpcoder
6

Mungkin saja, Anda harus mengubah filter untuk namanya.

// 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 adalah plugin, di sana Anda temukan melalui Google oder di plugin repo; mungkin plugin ini .

bueltge
sumber
Terima kasih atas jawabannya, tetapi saya tidak yakin apakah Anda membaca posting saya atau jika saya tidak cukup jelas. Saya minta maaf untuk yang terakhir. Dalam posting asli saya, saya menyebutkan plugin WP_Email_Login; plugin persis dari mana kode dan tautan Anda berasal. Inilah postingan asli saya: "Awalnya saya senang melihat WP_Email_Login hanya untuk mengetahui bahwa Anda masih dapat menggunakan nama pengguna Anda untuk login." <--- Lihat masalahnya, saya masih bisa menggunakan nama pengguna jadi itu sebabnya plugin ini tidak akan berfungsi. Karena saya tidak dapat menghapus nama pengguna, saya berpikir untuk mengesampingkan fungsi register dengan memaksa nama pengguna sama dengan alamat email.
agenmith666
Namun saya sedang mencari cara untuk mencapai ini tanpa mengedit file inti. Jika tidak mungkin itu baik-baik saja tetapi saya ingin tahu bagaimana caranya. Terima kasih!
agenmith666
ini adalah cara tanpa mengedit file inti. Salin kode dalam plugin, aktifkan dan siap.
bueltge
4

Menggunakan kode di atas:

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

Yang harus kami lakukan adalah memeriksa apakah nama pengguna yang disediakan setidaknya tampak seperti email dan jika tidak menyabot nama pengguna.

Vigs
sumber
Alih-alih pemeriksaan string primitif untuk '@'nama pengguna, Wordpress memiliki fungsi sanitize_email('email¬!"@business_com'); // Returns nothing
bawaan yang
3

sudah masuk WP-CORE!

sekarang wordpress sudah memungkinkan untuk mendaftarkan EMAIL sebagai nama pengguna. tetapi jika Anda berbicara tentang pengguna yang sudah terdaftar, cobalah jawaban yang terdaftar.

T.Todua
sumber
1

Sedikit modifikasi pada kode di atas harus menjadi semua yang diperlukan untuk menciptakan solusi yang elegan. The dokumentasi untuk hook mengotentikasi menyatakan bahwa baik WP_Userobjek atau WP_Errorobjek harus dikembalikan.

The source code untuk fungsi wp_authenticate_username_password berjalan melalui beberapa pemeriksaan cukup sederhana; kami hanya bisa meniru cara pemeriksaan itu dilakukan, dan membuat WP_Errorobjek baru untuk berurusan dengan alamat email. Sebagai alternatif, kita bahkan dapat mendongkrak wp_authenticate_username_passwordkode dan memodifikasinya jika kita mau, meskipun itu tampaknya tidak perlu kecuali Anda benar-benar ingin menyesuaikan fungsi berfungsi. Kode di bawah ini seharusnya melakukan trik: (Meskipun saya belum mengujinya sendiri ...)

// 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 );
}
Andrew Odri
sumber