WordPress注册时,只需要填写用户名和电子邮箱,点击提交后密码由系统产生并通过邮件发给用户,用户用随机密码登陆后要更改密码。这个过程对用户不是十分友好,今天发现了一个超级简单的让用户填写密码的方法,和大家分享一下。
目录
关于自动生成密码
你是否觉得WordPress的注册有点绕弯的感觉,既然用户注册后还要将随机生成的密码更改,为什么不让他们自己填写密码呢?
我想主要的原因可能是——防止机器人注册,验证码对机器人并不是十分有效,甚至谷歌那种晦涩难懂的验证码也能被某些机器人识别,但机器人没法接收邮件,所以这种方式可以有效的防止spam。
让用户填写密码
已有的插件
露兜博客出过一款自定义用户注册页面插件,可以实现这个功能,效果如下图所示
效果很棒,如果能带上中文语言包,并把“A password will be e-mailed to you”改掉会更好。感兴趣的朋友可以尝试这款实用的插件。
超简单的方法
今天要介绍的一个超级简单的方法是在一个老外的博客ThematoSoup上发现的,原文地址请看结尾参考文章中的链接。先看最终效果图
步骤如下:
1. 通过register_form action向注册表单添加密码、重复密码和防机器人的验证输入框,防止机器人注册的方法是要求用户填写要注册的网站的名称,这个方法很棒,比验证码方便的多。
<?php // Add Password, Repeat Password and Are You Human fields to WordPress registration form // http://wp.me/p1Ehkq-gn add_action( 'register_form', 'ts_show_extra_register_fields' ); function ts_show_extra_register_fields(){ ?> <p> <label for="password">Password<br/> <input id="password" class="input" type="password" tabindex="30" size="25" value="" name="password" /> </label> </p> <p> <label for="repeat_password">Repeat password<br/> <input id="repeat_password" class="input" type="password" tabindex="40" size="25" value="" name="repeat_password" /> </label> </p> <p> <label for="are_you_human" style="font-size:11px">Sorry, but we must check if you are human. What is the name of website you are registering for?<br/> <input id="are_you_human" class="input" type="text" tabindex="40" size="25" value="" name="are_you_human" /> </label> </p> <?php }
2. 检查用户的输入,两次输入的密码是否一致,是否正确填写网站名称
// Check the form for errors add_action( 'register_post', 'ts_check_extra_register_fields', 10, 3 ); function ts_check_extra_register_fields($login, $email, $errors) { if ( $_POST['password'] !== $_POST['repeat_password'] ) { $errors->add( 'passwords_not_matched', "<strong>ERROR</strong>: Passwords must match" ); } if ( strlen( $_POST['password'] ) < 8 ) { $errors->add( 'password_too_short', "<strong>ERROR</strong>: Passwords must be at least eight characters long" ); } if ( $_POST['are_you_human'] !== get_bloginfo( 'name' ) ) { $errors->add( 'not_human', "<strong>ERROR</strong>: Your name is Bot? James Bot? Check bellow the form, there's a Back to [sitename] link." ); } }
3. 存储用户输入的密码,如果用户没有填写密码,什么也不做,让WordPress自动生成密码。
// Storing WordPress user-selected password into database on registration // http://wp.me/p1Ehkq-gn add_action( 'user_register', 'ts_register_extra_fields', 100 ); function ts_register_extra_fields( $user_id ){ $userdata = array(); $userdata['ID'] = $user_id; if ( $_POST['password'] !== '' ) { $userdata['user_pass'] = $_POST['password']; } $new_user_id = wp_update_user( $userdata ); }
4. 最后就要处理那句不协调的“A password will be e-mailed to you”,通过gettext filter处理一下即可。
// Editing WordPress registration confirmation message // http://wp.me/p1Ehkq-gn add_filter( 'gettext', 'ts_edit_password_email_text' ); function ts_edit_password_email_text ( $text ) { if ( $text == 'A password will be e-mailed to you.' ) { $text = 'If you leave password fields empty one will be generated for you. Password must be at least eight characters long.'; } return $text; }
仅仅4步就完成了这个实用的功能,是不是超简单!这些代码可以放到主题的functions.php中,但不推荐这样,其实做成插件和放到functions.php中在性能上没有很大区别,但functions.php的可移植性和方便性会大打折扣,建议做成插件。
要做成插件,只要把这些代码拷贝到一个文件中,并写上标准插件声明就可以了。
插件版
Sola尝试把这段代码做成插件,上面的代码不支持多语言化,稍微改动一下,增加多语言支持,增加语言包,支持中英双语。效果如下图所示
插件下载:[download id=33]
我也遇到了同样的一个问题,安装了插件 但是注册界面一样没改,www.ttbgn.com。这个应该是原版的wp登录界面吧!!!!
如何在注册页面显示昵称选项!
参考https://support.woothemes.com/hc/en-us/articles/203182373-How-to-add-custom-fields-in-user-registration-on-the-My-Account-page
多谢
你好,请问有没有注册用户需要邮箱确认验证的插件没?
无意发现博主这个插件,感觉最接近我的需要,但根据实际测试,发现这2个小问题,不知道如何解决,能否指点下:
(1)会员注册后给会员发送的邮件,标题为:密码修改通知,看名字很吓人,这个不知道如何修改,邮件内容如下
嗨XXX:
这个通知是为了确认您在XX上的密码已被修改。
如果您没有修改您的密码,请发送电子邮件到22222222atqq.com
来通知站点管理员。
(2)会员登录后如果能跳转到前台登陆前页面就好了,跳到后台后实在用户体验欠佳。。
修改wordpress邮件模板的文章可以在网上找到,比如http://www.webtipblog.com/change-wordpress-user-registration-welcome-email/
login redirect并不难,可以看一下官方文档https://codex.wordpress.org/Plugin_API/Filter_Reference/login_redirect
或者有插件https://wordpress.org/plugins/peters-login-redirect/
这个插件是很久以前看别人的文章弄的,参考链接里的原文已经没了,这个 插件很旧很旧,如果要用的话最好重新写写,可是我现在没那么多时间,只能先提供你一些参考的东西,希望你不要介意。
博主您好,很好的文章,不过有个问题有点不解,为什么说填写网站名称是阻止机器人注册的一个好办法呢?填写网站名单无非也是提交表单中的一个文本字段罢了,机器人应该非常容易提交该字段。是不是我对这个机制的理解错了?
我对spam研究不多,说实话我也很不解,实际使用中发现过对我这种小站点来说,换成填写网站名称后垃圾注册一下子就没了。
谢谢了,好文章!
忘记密码的链接不对,怎么修改?
插件很棒!我想请问怎么去掉填写邮件这个选项?
我想把验证填写网站名称改成其它任意的文字,请问怎么改?
在步骤2 Check the form for errors中
if ( $_POST[‘are_you_human’] !== get_bloginfo( ‘name’ ) )
这句改成
if ( $_POST[‘are_you_human’] !==‘任意文字’)
hi,用了你的插件,感觉很好。不过发现一个bug:如果使用了密码注册,系统仍然会发一封带有“密码”的邮件给用户,而这其中的密码其实是系统自动生成的“乱码”,不是用户自己输入的。这封邮件中的内容会对用户造成困扰。你的站点现在就是这样的。
这个问题有必要解决一下,可惜我不懂写代码……
这个插件的代码是从文中提到的博客看到的,就是一个方法介绍,没有达到产品发布的水平,所以很多方面都没照顾了。我用这个纯属是讨厌有人乱copy我文章,还带着下载链接,顺便防一下spam注册,嘿,你说的发送邮件问题确实是有影响,等我有空会看下的,谢谢你提醒。
感謝Sola的分享,可是安裝到我的wordpress,插件啟用後註冊頁面並沒改變,安裝其他類似的註冊插件同樣沒反應,sola可以幫看一下嗎?
http://www.ahoxmilk.byethost13.com
謝謝~><
这种方法仅对WordPress原生注册界面有效,我看你的注册界面已经很定制化了,如果你的主题或插件已经修改了注册界面,就要先看下是怎么改的,在此基础上增添其它功能,因为这种修改和我文中介绍的方法很可能是互相覆盖的
感激你的回覆><
我的主題是用Artisteer4 弄的,請問要修改主題的註冊介面,要修改哪個檔案?
如果你确定是主题修改了注册界面,就到functions.php(包括其引入的文件)里找下,我不太清楚artisteer是怎么完成这功能的,没用过。
好久没来,sola总能教我点东西,谢谢。
不错,感谢!
不客气!
太佩服你了!
你真是个高手!
过奖啦 🙂
Hi! Sorry, I don’t speak Chinese, but Google Translate tells me that you mentioned us in a good way 🙂
Thanks for mentioning out post!
I love your blog, the method you created is dead simple and innovative, I have been searching something like this for long. I also read your other posts, it’s very useful so I bookmarked your website in my Chrome and I also put it in my collection of websites, great blog!
That’s very kind of you, thanks 🙂