是否可以从注册页面中删除用户名字段?如果是这样的话,是如何做到的呢?

时间:2012-05-16 作者:phpnwordpress

是否可以从注册页面中删除用户名字段?

我希望用户只输入他们的电子邮件和密码
应仅基于这两个参数创建新用户。

这可能吗?如果可能,怎么可能?

5 个回复
SO网友:Nishant Kumar

Absolutely YES, 你可以做到这一点。

Rule 1: WordPress需要用户名。我们必须提供用户名。

Rule 2: 不要编辑WordPress核心代码。

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

Step-1: Remove Username textfield

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

Step-2: Remove Username error

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

Step-3: Manipulate Background Registration Functionality.

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 文件

You can also download a complete plugin to achieve this.

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

SO网友:mcnesium

第3步在Nishant Kumars post检查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\');

SO网友:maksbd19

@尼桑特·库马尔对这个问题给出了完美的、应该被接受的答案。然而,Wordpress 4.0版本发布后出现了一个小故障。从…起codex-

注意:自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;
}
Note: 正如@mcnesium所提到的,如果我们完全去掉了用户名字段(在我的例子中,我使用了主题我的登录插件来覆盖常规注册表,在那里我只删除了用户名字段),那么$_POST[\'user_login\'] 将是null 条件根本不匹配。我们最好像@mcnesium建议的那样,将其从条件中移除。

SO网友:Gfra54

重复@nishant kumar的回答,这里有一个普通的JS,无需额外的JS脚本,1步,无需后端编辑,只需输入电子邮件即可生成注册表单:

/** 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 文件(或在custom plugin, 如果您有)

SO网友:Matt Keys

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

如果你对黑客没意见,这里有一个可行的概念:

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

如果您使用的是jQuery,则可以使用如下内容:

$(document).ready(function() {
    var timestamp = (new Date).getTime();
    $(\'form input.username\').val(timestamp);
    $(\'form input.username\').css(\'display\', \'none\');
});
在本例中,“表单输入”。username’将是jQuery选择器,要查找username字段,您需要检查页面上的html结构,以确保选择器与结构匹配。

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

结束

相关推荐