Làm thế nào để đăng nhập bằng email chỉ không có tên người dùng?


20

Sau khi tìm kiếm một vài ngày và đọc các chủ đề 2 năm tuổi, tôi gặp khó khăn trong việc tìm giải pháp cho vấn đề chỉ có người dùng đăng nhập bằng email.

Lúc đầu, tôi rất vui khi thấy WP_Email_Login chỉ để biết bạn vẫn có thể sử dụng tên người dùng của mình để đăng nhập. Tôi không chắc chắn làm thế nào để viết về điều này như là một plugin. Ý tưởng của tôi là ghi đè hàm register_new_user. Tôi không thấy điều này trong danh sách chức năng "có thể cắm". Tôi có thể sử dụng bộ lọc / hành động để thực hiện việc này không?

Tôi nhận ra rằng việc chỉnh sửa các tập tin cốt lõi không phải là thời trang, vì vậy tôi hy vọng một giải pháp sẽ được đưa ra ngoài tuy nhiên nếu không có thì tôi sẽ nắm lấy cơ hội của mình. Trong dòng đầu tiên của hàm "register_new_user" trong wp-login.php tôi có thể thêm:

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

Điều này hoạt động khá độc đáo vì WordPress không cho phép mọi người thay đổi tên người dùng của họ. Trong màn hình đăng ký (biểu mẫu), nó yêu cầu Tên người dùng & Email; Tôi muốn đặt Tên người dùng thành biến Nickname (nếu ai đó có thể cho tôi biết biến biệt danh nào được gọi hoặc nơi được đặt trong quá trình đăng ký sẽ được đánh giá cao).

Chúc mừng

thợ rèn


Bạn đang cố gắng loại bỏ hoàn toàn tên người dùng? Tại sao plugin Đăng nhập Email không hoạt động cho bạn?
Ryan

Tôi thực sự tò mò tại sao bạn muốn loại bỏ tên người dùng, vì đó là cơ sở của tất cả thông tin người dùng trong WordPress. Nó giống như cố gắng loại bỏ Bài viết - rất nhiều công việc không có nhiều tiền, và đảm bảo các vấn đề trong tương lai.
SickHippie

1
@ Ryan- Tôi không nghĩ rằng tôi có thể thoát khỏi tên người dùng vì vậy thay vào đó tôi chỉ buộc tên người dùng bằng với địa chỉ email.
Agentmith666

@SickHippie - để đăng nhập Tôi nghĩ rằng email tốt hơn và độc đáo hơn tên người dùng. Tôi muốn sử dụng tên người dùng làm biệt danh khi người dùng đăng bài. Bạn nói đúng sẽ là một nỗi đau khi "loại bỏ" biến "tên người dùng", đó là lý do tại sao tôi không như vậy. Tôi chỉ chọn tên người dùng cho người dùng khi họ đăng ký (tên người dùng sẽ là địa chỉ email của họ; biệt danh của họ sẽ là tên họ đã nhập làm tên người dùng của họ). Cuối cùng, không có biến nào bị mất, mọi thứ vẫn còn nguyên vẹn.
Agentmith666

1
@SickHippie - Bạn đúng vì mặc định của Wordpress không cho phép người dùng thay đổi tên người dùng, địa chỉ email / tên người dùng của họ sẽ giữ nguyên ngay cả khi họ thay đổi địa chỉ email liên hệ của họ. Tôi đã xem xét điều đó ngay từ đầu và theo kinh nghiệm của riêng tôi, tôi đã thấy rằng mọi người hiếm khi "xóa" một địa chỉ email. Họ có thể có những cái mới nhưng thông thường họ vẫn sẽ có cái cũ. Và nếu không, có lẽ trong những trường hợp hiếm hoi đó, chúng tôi sẽ thay đổi thủ công trong cơ sở dữ liệu. Tôi thực sự đánh giá cao phản hồi của bạn và cái nhìn sâu sắc SickHippie! Bây giờ tôi hy vọng có một giải pháp cho bài viết của mình :)
agentmith666

Câu trả lời:


19

Cập nhật: Tôi đã tạo một plugin để đăng nhập, đăng ký và lấy lại mật khẩu bằng email. https://wordpress.org/plugins/smart-wp-login/

Trả lời ngắn gọn, bạn có thể cấu hình WordPress để đăng nhập bằng email.

Ba bước:

  • Xóa chức năng xác thực mặc định
  • Thêm chức năng xác thực tùy chỉnh
  • Thay đổi văn bản "Tên người dùng" trong wp-login.php thành "Email"

Một lưu ý:

  • Đừng chỉnh sửa các tập tin cốt lõi.

Xóa chức năng xác thực mặc định của WordPress.

WordPress sử dụng bộ lọc " xác thực " để thực hiện xác nhận bổ sung khi đăng nhập của người dùng.

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

Thêm chức năng xác thực tùy chỉnh

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

Thay đổi văn bản "Tên người dùng" trong wp-login.php thành "Email"

Chúng tôi có thể sử dụng bộ lọc gettext để thay đổi văn bản "Tên người dùng" thành "Email" mà không cần chỉnh sửa các tệp cốt lõi.

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

Tôi cũng đã viết một bài viết chi tiết tại blog của mình http://www.thebinary.in/blog/wordpress-login-USE-email/


2
Câu trả lời hay ho Nishant
Andrew Bartel

hữu ích! Trong trường hợp của tôi, tôi chỉ tước email các ký tự đặc biệt và biến nó thành tên người dùng. vì vậy user@example.com trở thành user_example_com và nó đã hoạt động.
wpcoder

6

Có thể, bạn phải thay đổi bộ lọc cho tên.

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

Một thay thế là một plugin, có bạn tìm thấy thông qua Google oder trong repo plugin; có thể plugin này .


Cảm ơn vì đã trả lời tuy nhiên tôi không chắc là bạn đã đọc bài viết của tôi hay nếu tôi không đủ rõ ràng. Tôi xin lỗi vì sau này. Trong bài viết gốc của tôi, tôi đã đề cập đến plugin WP_Email_Login; các plugin chính xác mã và liên kết của bạn là từ. Đây là bài viết gốc của tôi: "Lúc đầu, tôi rất vui khi thấy WP_Email_Login chỉ để tìm hiểu bạn vẫn có thể sử dụng tên người dùng của mình để đăng nhập." <--- Xem vấn đề tôi vẫn có thể sử dụng tên người dùng để đó là lý do tại sao plugin này không hoạt động. Vì tôi không thể loại bỏ tên người dùng, tôi nghĩ đến việc ghi đè chức năng đăng ký bằng cách buộc tên người dùng bằng với địa chỉ email.
Agentmith666

Tuy nhiên tôi đang tìm cách để thực hiện điều này mà không cần chỉnh sửa các tệp cốt lõi. Nếu điều đó là không thể, nhưng tôi muốn biết một trong hai cách. Cảm ơn!
Agentmith666

Đây là một cách mà không cần chỉnh sửa các tập tin cốt lõi. Sao chép mã trong một plugin, kích hoạt và sẵn sàng.
bueltge

4

Sử dụng mã trên:

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

Tất cả những gì chúng tôi phải làm là kiểm tra xem tên người dùng được cung cấp ít nhất trông giống như một email và nếu không phá hoại tên người dùng.


Thay vì kiểm tra chuỗi nguyên thủy '@'trong tên người dùng, Wordpress có chức năng tích hợp sẵn tiện dụng: sanitize_email sẽ trả về định dạng địa chỉ email hợp lệ hoặc không có gì:sanitize_email('email¬!"@business_com'); // Returns nothing
indextwo

3

nó đã nằm trong WP-CORE!

bây giờ wordpress đã cho phép đăng ký EMAIL làm tên người dùng. nhưng nếu bạn đang nói về người dùng đã đăng ký, thì hãy thử các câu trả lời được liệt kê.


1

Sửa đổi nhẹ cho mã ở trên nên là tất cả những gì cần thiết để tạo ra một giải pháp thanh lịch. Các tài liệu cho móc xác thực trạng đó hoặc là một WP_Userđối tượng hoặc WP_Errorđối tượng sẽ được trả lại.

Các mã nguồn cho các chức năng wp_authenticate_username_password chạy qua một số kiểm tra khá đơn giản; chúng ta chỉ có thể sao chép cách thực hiện các kiểm tra đó và tạo một WP_Errorđối tượng mới để xử lý địa chỉ email. Ngoài ra, chúng tôi thậm chí có thể cắm wp_authenticate_username_passwordmã và sửa đổi mã nếu chúng tôi muốn, mặc dù điều đó có vẻ không cần thiết trừ khi bạn thực sự muốn tùy chỉnh cách mọi thứ hoạt động. Đoạn mã dưới đây nên thực hiện thủ thuật: (Mặc dù tôi chưa tự mình kiểm tra nó ...)

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.