Có thể xóa trường tên người dùng khỏi trang đăng ký? Nếu vậy thì thế nào?


16

Có thể xóa trường tên người dùng khỏi trang đăng ký?

Tôi muốn người dùng chỉ nhập email và mật khẩu của họ.
Một người dùng mới nên được tạo chỉ dựa trên hai tham số này.

Điều đó là có thể và nếu vậy, làm thế nào?


Điều này làm điều đó? wordpress.org/extend/plugins/wp-email-login
saltcod

Câu trả lời:


11

Hoàn toàn , bạn có thể đạt được điều này.

Quy tắc 1: WordPress yêu cầu tên người dùng. Chúng tôi phải cung cấp tên người dùng.

Quy tắc 2: Không chỉnh sửa mã lõi WordPress.

Chúng tôi có thể đạt được điều này bằng cách ẩn trường tên người dùng, nhận email và lưu trữ dưới dạng tên người dùng.

Bước 1: Xóa trường văn bản tên người dùng

add_action('login_head', function(){
?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript" src="<?php echo site_url('/wp-includes/js/jquery/jquery.js'); ?>"></script>
    <script type="text/javascript">
        jQuery(document).ready(function($){
            $('#registerform > p:first-child').css('display', 'none');
        });
    </script>
<?php
});

Bước 2: Xóa lỗi tên người dùng

//Remove error for username, only show error for email only.
add_filter('registration_errors', function($wp_error, $sanitized_user_login, $user_email){
    if(isset($wp_error->errors['empty_username'])){
        unset($wp_error->errors['empty_username']);
    }

    if(isset($wp_error->errors['username_exists'])){
        unset($wp_error->errors['username_exists']);
    }
    return $wp_error;
}, 10, 3);

Bước 3: Thao tác với chức năng đăng ký nền.

add_action('login_form_register', function(){
    if(isset($_POST['user_login']) && isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
});

Đặt trên mã trong của chủ đề của bạn functions.php tập tin.

Bạn cũng có thể tải xuống một plugin hoàn chỉnh để đạt được điều này.

Plugin: https://wordpress.org/plugins/smart-wp-login/


4

Bước 3 trong bài đăng của Nishant Kumars kiểm tra bài đăng nếu isset($_POST['user_login'])nó không hoạt động với tôi, vì đăng nhập là những gì chúng tôi thực sự muốn xóa.

Giải pháp của tôi là như sau (trong các chức năng.php của chủ đề), cũng như một chức năng riêng biệt, phù hợp với kiểu mã wordpress:

function copy_username_to_email (){
    if(isset($_POST['user_email']) && !empty($_POST['user_email'])){
        $_POST['user_login'] = $_POST['user_email'];
    }
}
add_action('login_form_register', 'copy_username_to_email');

Tôi đã nhận được thông báo lỗi "ký tự không hợp lệ", vì vậy tôi đã thay thế @.trong địa chỉ email làm tên người dùng:$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
GreatBlakes

4

@Nishant Kumar đã đưa ra câu trả lời hoàn hảo và nên được chấp nhận cho câu hỏi này. Tuy nhiên, có một trục trặc sau khi phiên bản Wordpress 4.0 được phát hành. Từ codex -

Lưu ý: Kể từ 4.0, các thuộc tính này là riêng tư, xem [28511] .

registration_errors bộ lọc ở đây đòi hỏi một chút sửa đổi.

//Remove error for username, only show error for email only.

add_filter('registration_errors', 'remove_username_empty_error', 10, 3);

function remove_username_empty_error($wp_error, $sanitized_user_login, $user_email){

    if(isset($wp_error->errors['empty_username'])){
        $wp_error->remove('empty_username');
    }    
    if(isset($wp_error->errors['username_exists'])){
        $wp_error->remove('username_exists');
    }
    return $wp_error;
}

Lưu ý: Khi @mcnesium đề cập, nếu chúng ta hoàn toàn đã thoát khỏi những lĩnh vực tên người dùng (trong trường hợp của tôi, tôi sử dụng Theme Plugin đăng nhập của tôi để ghi đè lên mẫu đăng ký thường xuyên và ở đó tôi chỉ loại bỏ các lĩnh vực username) sau đó $_POST['user_login']sẽ được nullvà tình trạng sẽ không phù hợp ở tất cả. Chúng tôi tốt hơn nên loại bỏ điều đó khỏi tình trạng như @mcarbonate đề xuất.


2

Lặp lại câu trả lời của @ nishant-kumar, đây là một vanilla JS, không có tập lệnh js bổ sung, 1 bước, không cần chỉnh sửa phụ trợ, giải pháp để tạo một biểu mẫu đăng ký chỉ với đầu vào email:

/** Hook your code to the login / Sign up page **/
add_action('login_head', function(){

    /* Style to hide the user_name field group */
    ?>
    <style>
        #registerform > p:first-child{
            display:none;
        }
    </style>

    <script type="text/javascript">
        /* Execute this action when the DOM is ready AND after everything in the page is loaded */
        let user_email;
        window.addEventListener('load',function() {
            user_email = document.querySelector('[name="user_email"]');
            if(user_email) { // Execute only if there is a user_email field on page
                user_email.addEventListener('keyup',syncUserName);
                user_email.addEventListener('change',syncUserName);
            }
        });

        /* sync user_email's value with the hidden user_login field */
        function syncUserName() {
                document.querySelector('[name="user_login"]').value = user_email.value;
        }

    </script>
<?php
});

Bạn chỉ cần thêm mã này trong functions.php tệp (hoặc trong bạn Plugin tùy chỉnh , nếu bạn có một)


1
Tôi đã thử điều này và nhận được một lỗi user_email is not defined at HTMLInputElement.syncUserName. Di chuyển phần "function syncUserName" bên trong hàm trên sẽ loại bỏ lỗi và đoạn mã hoạt động rất tốt. Chỉ cần bình luận để những người khác có thể gặp phải vấn đề tương tự. Cảm ơn bạn Gfra54.
Betty

Bạn hoàn toàn đúng @betty, tôi đã sửa câu trả lời của mình để đặt user_emailvar trong cùng phạm vi. Cảm ơn.
Gfra54

1

Tôi nghĩ rằng bất kỳ giải pháp nào cho yêu cầu này sẽ là một 'hack' vì wordpress yêu cầu phải có tên người dùng cho tất cả người dùng đã đăng ký. Ngay cả các plugin được đề cập ở trên rất có thể chỉ là tìm tên người dùng thông qua địa chỉ email, sau đó sử dụng tên người dùng đó để đăng nhập vào trang web.

Nếu bạn ổn với hack, đây là một khái niệm có thể hoạt động:

1) Nhập trước trường tên người dùng trong biểu mẫu đăng ký của bạn với một số duy nhất, sử dụng dấu thời gian hiện tại là một ý tưởng tốt để tránh nhận được bất kỳ bản sao nào. Sau đó, bạn sẽ ẩn trường này để người dùng không nhìn thấy nó trên màn hình khi điền vào biểu mẫu của họ.

Nếu bạn đang sử dụng jQuery, bạn có thể sử dụng một cái gì đó như:

$(document).ready(function() {
    var timestamp = (new Date).getTime();
    $('form input.username').val(timestamp);
    $('form input.username').css('display', 'none');
});

Trong ví dụ này, 'form input.username' sẽ là bộ chọn jQuery để tìm trường tên người dùng, bạn sẽ cần kiểm tra cấu trúc html trên trang của mình để đảm bảo bộ chọn phù hợp với cấu trúc.

2) Sử dụng một plugin như plugin được đề cập trước đó ( http://wordpress.org/extend/plugins/wp-email-login/ ) để cho phép người dùng đăng nhập bằng địa chỉ email của họ.

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.