是否可以从注册页面删除用户名字段?如果是这样,怎么办?


Answers:


11

当然,你可以做到这一点。

规则1: WordPress需要用户名。我们必须提供一个用户名。

规则2:请勿编辑WordPress核心代码。

我们可以通过隐藏用户名字段,获取电子邮件并将其存储为用户名来实现。

步骤1:删除用户名文本字段

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

步骤2:删除用户名错误

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

步骤3:操纵后台注册功能。

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'];
    }
});

将上述代码放在主题的functions.php文件中。

您也可以下载完整的插件来实现此目的。

插件:https//wordpress.org/plugins/smart-wp-login/


4

Nishant Kumars帖子的第3步将检查isset($_POST['user_login'])哪个对我不起作用,因为实际上是我们要删除的登录名。

我的解决方案如下(在主题的functions.php中),也作为单独的函数,与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');

我收到“非法字符”错误消息,因此我将电子邮件地址中的@和替换.为用户名:$_POST['user_login'] = str_replace(array('@', '.'), '_', $_POST['user_email']);
GreatBlakes18年

4

@Nishant Kumar对此问题给出了完美且应被接受的答案。但是,在Wordpress 4.0版本发布后会出现故障。来自法典 -

注意:从4.0开始,这些属性是私有的,请参见[28511]

registration_errors 这里的过滤器需要一些修改。

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

注:由于@mcnesium提到的,如果我们完全摆脱了用户名字段的(在我的情况下,我用我的主题插件登录重写定期登记表,并在那里我只是删除了用户名字段),那么$_POST['user_login']null和条件不匹配完全没有 我们最好从@mcnesium建议的条件中删除它。


2

迭代@ nishant-kumar的答案,这是一个普通的JS,不需要额外的js脚本,第一步,不需要后端编辑,仅使用电子邮件输入即可创建注册表单的解决方案:

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

您只需要将此代码添加到functions.php文件中(或自定义插件中,如果有的话)


1
我试过了,但出错了user_email is not defined at HTMLInputElement.syncUserName。在上部函数中移动“函数syncUserName”部分可以消除该错误,并且代码段可以很好地工作。请发表评论,以便其他人可能遇到相同的问题。谢谢Gfra54。
Betty

您绝对正确@betty,我更正了我的回答,将user_emailvar放在相同的范围内。谢谢。
Gfra54

1

我认为针对此请求的任何解决方案都将成为“黑客”,因为wordpress要求所有注册用户都必须有一个用户名。甚至上面提到的插件很可能只是通过电子邮件地址找到用户名,然后使用该用户名登录该站点。

如果您可以接受骇客入侵,以下是一个可行的概念:

1)使用当前时间戳预填充您注册表格中的用户名字段,并使用唯一的数字,这是避免重复的好主意。然后,您将隐藏此字段,以便用户在填写表格时不会在屏幕上看到它。

如果您使用的是jQuery,则可以使用以下方法:

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

在此示例中,“ form input.username”将是查找用户名字段的jQuery选择器,您将需要检查页面上的html结构以确保选择器与该结构匹配。

2)使用前面提到的插件(http://wordpress.org/extend/plugins/wp-email-login/)允许用户使用其电子邮件地址登录。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.