因为最近想利用wordpress和微信公众平台做点东西,所以需要近一步了解一下wordpress的某些代码。首先是登录界面。
登录相关的流程集中在wp-login.php中。主要的流程在文件的最后switch部分,该部分会根据$_REQUEST变量中的action进入不同的分支。对于登录这个动作来说,action是login,如果没有设置过action,action的默认值也是login。
走到case ‘login’分支后,会先遇到几个判断条件,对于初次进入到登录页面的情况,$_REQUEST变量一般为空,这时会直接进入到显示登录框页面的部分。登录框相关的内容其实蛮简单的:关键就是一个叫loginform的表单。这个表单里有如下几个域:
- log:用于输入用户名
- pwd:用于输入密码
- rememberme:用于永远免登录,value是字符串“forever”
- interim-login:(暂时不明其含义)
- wp-submit:字符串域,内容为“Log In”的某种语言的显示,例如中文就是汉字“登录”
- redirect_to:验证成功登录之后需要跳转到哪个页面。
- customize-login:(暂时不明其含义)
- testcookie:value必须为1;否则,即使提供正确的用户名和密码也无法登录。
设置了这几个域之后,用户点击登录按钮后,会将表单提交给wp-login.php,也就是提交给自己,然后就会再次进入switch流程,这是action依然是login,但与上次不同的是$_REQUEST变量里面已经有了内容。所以当再次走到case ‘login’之后,就会被前面的几个if语句拦截,并对$_REQUEST中的一些域做一些预处理,例如去掉用户名中的一些危险字符之类的,然后就进入了验证用户的关键分支:
wp_signon() --> wp_authenticate_username_password() --> wp_check_password()
经过以上几步,就可以完成用户身份的验证,如果验证成功,则调用wp_safe_redirect($url)进行跳转,并返回状态码302;如果验证失败则再次进入登录前的状态,并显示登录界面。
打完收工!