วิธีเข้าสู่ระบบด้วยอีเมลเพียงไม่มีชื่อผู้ใช้?


20

หลังจากค้นหาสองสามวันและอ่านเธรดอายุ 2 ปีฉันมีปัญหาในการค้นหาวิธีแก้ไขปัญหาของการมีผู้ใช้ที่ล็อกอินด้วยอีเมลเท่านั้น

ตอนแรกฉันดีใจที่ได้เห็น WP_Email_Login เพียงเพื่อดูว่าคุณยังสามารถใช้ชื่อผู้ใช้ของคุณเพื่อเข้าสู่ระบบ ฉันไม่แน่ใจว่าจะเขียนสิ่งนี้เป็นปลั๊กอินได้อย่างไร ความคิดของฉันคือแทนที่ฟังก์ชัน register_new_user ฉันไม่เห็นสิ่งนี้ในรายการฟังก์ชั่น "เสียบได้" ฉันสามารถใช้ตัวกรอง / การกระทำเพื่อทำสิ่งนี้ได้หรือไม่

ฉันรู้ว่ามันไม่ทันสมัยที่จะแก้ไขไฟล์หลักดังนั้นฉันหวังว่าจะมีทางออก แต่ถ้าไม่มีอยู่ฉันจะใช้โอกาสของฉัน ในบรรทัดแรกของฟังก์ชัน "register_new_user" ใน wp-login.php ฉันสามารถเพิ่ม:

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

มันใช้งานได้ดีมากเนื่องจาก WordPress ไม่อนุญาตให้ผู้ใช้เปลี่ยนชื่อผู้ใช้ ในหน้าจอลงทะเบียน (ฟอร์ม) มันจะถามชื่อผู้ใช้ & อีเมล; ฉันต้องการตั้งค่าชื่อผู้ใช้เป็นตัวแปรชื่อเล่น (หากมีคนสามารถบอกฉันได้ว่าชื่อเล่นตัวแปรนั้นถูกเรียกหรือที่ที่ตั้งค่าระหว่างการลงทะเบียนที่จะได้รับการชื่นชม)

ไชโย

ช่างเหล็ก


คุณพยายามจะลบชื่อผู้ใช้ทั้งหมดหรือไม่? เหตุใดปลั๊กอินการเข้าสู่ระบบอีเมลจึงไม่ทำงานสำหรับคุณ
Ryan

ฉันอยากรู้จริงๆว่าทำไมคุณถึงต้องการลบชื่อผู้ใช้ออกเพราะสิ่งเหล่านี้เป็นพื้นฐานของข้อมูลผู้ใช้ทั้งหมดใน WordPress มันค่อนข้างเหมือนกับพยายามทำโพสต์ - ทำงานเป็นจำนวนมากไม่จ่ายเงินมากและรับประกันปัญหาที่เกิดขึ้น
SickHippie

1
@ Ryan- ฉันไม่คิดว่าฉันจะสามารถกำจัดชื่อผู้ใช้ดังนั้นฉันแค่บังคับให้ชื่อผู้ใช้เท่ากับที่อยู่อีเมล
agentsmith666

@SickHippie - สำหรับการเข้าสู่ระบบฉันคิดว่าอีเมลดีกว่าและมีเอกลักษณ์กว่าชื่อผู้ใช้ ฉันควรใช้ชื่อผู้ใช้เป็นชื่อเล่นเมื่อผู้ใช้โพสต์ คุณพูดถูกมันคงเป็นความเจ็บปวดที่จะ "กำจัด" ตัวแปร "ชื่อผู้ใช้" ซึ่งเป็นสาเหตุที่ฉันไม่ ฉันแค่เลือกชื่อผู้ใช้สำหรับผู้ใช้เมื่อพวกเขาลงทะเบียน (ชื่อผู้ใช้จะเป็นที่อยู่อีเมลของพวกเขาชื่อเล่นของพวกเขาจะเป็นสิ่งที่พวกเขาป้อนเป็นชื่อผู้ใช้ของพวกเขา) ในที่สุดไม่มีตัวแปรใดหายไปทุกอย่างไม่บุบสลาย
agentsmith666

1
@SickHippie - คุณถูกต้องเนื่องจากค่าเริ่มต้นของ Wordpress ไม่อนุญาตให้ผู้ใช้เปลี่ยนชื่อผู้ใช้ชื่อผู้ใช้ / ที่อยู่อีเมลของพวกเขาจะยังคงเหมือนเดิมแม้ว่าพวกเขาจะเปลี่ยนที่อยู่อีเมลติดต่อของพวกเขา ฉันคิดว่าตั้งแต่ต้นและจากประสบการณ์ของตัวเองฉันพบว่าคนไม่ค่อย "ลบ" ที่อยู่อีเมล พวกเขาอาจได้รับใหม่ แต่โดยทั่วไปแล้วพวกเขาจะยังคงมีคนเก่า และถ้าไม่ใช่ในสถานการณ์ที่หายากเหล่านั้นเราจะเปลี่ยนมันด้วยตนเองในฐานข้อมูล ฉันขอขอบคุณข้อเสนอแนะและข้อมูลเชิงลึกของคุณ SickHippie! ตอนนี้ฉันหวังว่าจะมีวิธีแก้ปัญหาสำหรับโพสต์ของฉัน :)
agentsmith666

คำตอบ:


19

อัปเดต: ฉันได้สร้างปลั๊กอินสำหรับการเข้าสู่ระบบการลงทะเบียนและรับรหัสผ่านด้วยอีเมล https://wordpress.org/plugins/smart-wp-login/

ตอบสั้น ๆ คุณสามารถกำหนดค่า WordPress ให้เข้าสู่ระบบด้วยอีเมล

สามขั้นตอน:

  • ลบฟังก์ชั่นการตรวจสอบเริ่มต้น
  • เพิ่มฟังก์ชั่นการพิสูจน์ตัวตนที่กำหนดเอง
  • เปลี่ยนข้อความ "ชื่อผู้ใช้" ใน wp-login.php เป็น "อีเมล"

One Note:

  • อย่าแก้ไขไฟล์หลัก

ลบฟังก์ชั่นการพิสูจน์ตัวตนเริ่มต้นของ WordPress

WordPress ใช้ตัวกรอง " รับรองความถูกต้อง " เพื่อทำการตรวจสอบเพิ่มเติมในการเข้าสู่ระบบของผู้ใช้

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

เพิ่มฟังก์ชั่นการพิสูจน์ตัวตนที่กำหนดเอง

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 เป็น "อีเมล"

เราสามารถใช้ตัวกรองgettextเพื่อเปลี่ยนข้อความ "ชื่อผู้ใช้" เป็น "อีเมล" โดยไม่ต้องแก้ไขไฟล์หลัก

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

ฉันได้เขียนบทความโดยละเอียดที่บล็อกของฉันที่http://www.thebinary.in/blog/wordpress-login-using-email/


2
คำตอบที่ดี Nishant
Andrew Bartel

! ประโยชน์ ในกรณีของฉันฉันเพียงแค่ดึงอีเมลอักขระพิเศษและทำให้เป็นชื่อผู้ใช้ ดังนั้น user@example.com จะกลายเป็น user_example_com และทำงานได้
wpcoder

6

เป็นไปได้คุณต้องเปลี่ยนตัวกรองสำหรับชื่อ

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

อีกทางเลือกหนึ่งคือปลั๊กอินคุณจะพบผ่าน Google หรืออื่น ๆ ในส่วนเสริมปลั๊กอิน; อาจจะเป็นปลั๊กอินนี้


ขอบคุณสำหรับการตอบกลับ แต่ฉันไม่แน่ใจว่าคุณอ่านโพสต์ของฉันหรือไม่ชัดเจนเพียงพอ ฉันขอโทษสำหรับหลัง ในโพสต์ต้นฉบับของฉันฉันพูดถึงปลั๊กอิน WP_Email_Login; ปลั๊กอินที่แน่นอนรหัสและลิงค์ของคุณมาจาก นี่คือโพสต์ดั้งเดิมของฉัน: "ตอนแรกฉันดีใจที่ได้เห็น WP_Email_Login เพียงเพื่อค้นหาว่าคุณยังสามารถใช้ชื่อผู้ใช้ของคุณเพื่อเข้าสู่ระบบ" <--- ดูปัญหาที่ฉันยังคงสามารถใช้ชื่อผู้ใช้ดังนั้นนั่นคือเหตุผลที่ปลั๊กอินนี้จะไม่ทำงาน เนื่องจากฉันไม่สามารถทำอะไรกับชื่อผู้ใช้ฉันกำลังคิดถึงการแทนที่ฟังก์ชันการลงทะเบียนด้วยการบังคับให้ชื่อผู้ใช้เท่ากับที่อยู่อีเมล
agentsmith666

อย่างไรก็ตามฉันกำลังค้นหาวิธีที่จะทำให้สำเร็จโดยไม่ต้องแก้ไขไฟล์หลัก ถ้ามันเป็นไปไม่ได้มันก็ดี แต่ฉันก็อยากจะรู้ทางใดทางหนึ่ง ขอบคุณ!
agentsmith666

นี่เป็นวิธีที่ไม่มีการแก้ไขไฟล์แกน คัดลอกรหัสในปลั๊กอินเปิดใช้งานและพร้อม
bueltge

4

ใช้รหัสข้างต้น:

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

สิ่งที่เราต้องทำก็คือตรวจสอบว่าชื่อผู้ใช้ที่ระบุอย่างน้อยดูเหมือนอีเมลและหากไม่ก่อวินาศกรรมชื่อผู้ใช้


แทนที่จะตรวจสอบสตริงดั้งเดิม'@'ในชื่อผู้ใช้ Wordpress มีฟังก์ชั่นในตัวที่มีประโยชน์: sanitize_emailจะกลับมาในรูปแบบที่อยู่อีเมลที่ถูกต้องหรือไม่มีอะไร:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo

3

มันมีอยู่แล้วในWP-CORE!

ตอนนี้ wordpress อนุญาตให้ลงทะเบียน EMAIL เป็นชื่อผู้ใช้แล้ว แต่ถ้าคุณกำลังพูดถึงผู้ใช้ที่ลงทะเบียนแล้วลองคำตอบที่ระบุไว้


1

การแก้ไขโค้ดข้างบนเล็กน้อยควรเป็นสิ่งที่จำเป็นสำหรับการสร้างโซลูชันที่สวยงาม เอกสารเบ็ดรับรองความถูกต้องระบุว่าทั้งWP_UserวัตถุหรือWP_Errorวัตถุที่ควรจะกลับ

รหัสแหล่งสำหรับฟังก์ชั่น wp_authenticate_username_passwordวิ่งผ่านการตรวจสอบง่ายสวยบาง เราสามารถทำซ้ำวิธีการตรวจสอบเหล่านั้นและสร้างWP_Errorวัตถุใหม่เพื่อจัดการกับที่อยู่อีเมล นอกจากนี้เรายังสามารถใส่wp_authenticate_username_passwordรหัสและแก้ไขได้หากเราต้องการแม้ว่าจะไม่จำเป็นเว้นแต่ว่าคุณต้องการปรับแต่งการทำงานของสิ่งต่าง ๆ รหัสด้านล่างควรทำเคล็ดลับ: (แม้ว่าฉันจะไม่ได้ทดสอบด้วยตัวเอง ... )

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.