是否可以从注册页面删除用户名字段?
我希望用户仅输入他们的电子邮件和密码。
仅应基于这两个参数创建一个新用户。
那有可能吗?
是否可以从注册页面删除用户名字段?
我希望用户仅输入他们的电子邮件和密码。
仅应基于这两个参数创建一个新用户。
那有可能吗?
Answers:
当然是,你可以做到这一点。
规则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文件中。
您也可以下载完整的插件来实现此目的。
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']);
@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建议的条件中删除它。
迭代@ 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文件中(或自定义插件中,如果有的话)
user_email is not defined at HTMLInputElement.syncUserName
。在上部函数中移动“函数syncUserName”部分可以消除该错误,并且代码段可以很好地工作。请发表评论,以便其他人可能遇到相同的问题。谢谢Gfra54。
user_email
var放在相同的范围内。谢谢。
我认为针对此请求的任何解决方案都将成为“黑客”,因为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/)允许用户使用其电子邮件地址登录。