在本系列的前两篇教程中,我们构建了一个用于登录和注册新用户的定制页面。现在,登录过程中只有一部分需要探索和替换:如果用户忘记密码并想重置wordpress密码会发生什么?
在本教程中,我们将解决最后一步并完成我们在整个系列中构建的个性化登录插件。
WordPress中的密码重置功能或多或少遵循了当今网站上的标准方法:
用户通过输入用户名或电子邮件地址并请求WordPress重置密码来启动重置。创建一个临时密码重置令牌并将其存储在用户数据中。包含此令牌的链接将发送到用户的电子邮件地址。用户点击链接。在重置密码页面上,验证令牌,如果令牌与用户的数据匹配,他们可以选择新密码。就像登录和新用户注册一样,该功能通过wp-login.php处理。因此,如何定制这个过程的一般思想现在与以前的教程非常相似。
如果您没有阅读前两个教程,最好从第1部分开始,并按顺序浏览该系列。您可以根据教程编写自己的代码,也可以从链接的GitHub资源库下载完整的源代码。
现在,让我们开始更换流程中的第一个屏幕。
启动WordPress重置密码当用户到达您的登录页面但不记得他们在网站上使用的密码时,他们将开始重置WP密码。
为此,在本系列的第一部分中,我们在登录表单的底部放置了一个忘记的密码。消息模板链接。默认情况下,在WordPress支持的网站上,这个链接指向wp-login.php?Action=lostpassword,页面如下:
为了用自定义页面替换该页面,我们将创建一个函数来将用户重定向到我们的自定义页面,并将该函数与WordPress操作挂钩。
在这种情况下,我们有两个选项可供选择:我们可以使用操作lost_password(在页面呈现之前调用),或者使用我们在上一教程中使用的操作:login_form_{action},这次是login_form_lostpassword。
我们可以采用两种方法,但是为了限制不必要的代码执行量,让我们选择后一种方法。
但是首先,让我们创建一个新的WordPress自定义密码重置页面:
步骤1:创建重置密码页面p》
正如您所记得的,在第1部分中,我们使用plugin_activated回调函数创建了一个函数,该函数在插件被激活时创建一个WordPress页面。
在这个函数中,新页面的定义被添加到$page_definitions数组的末尾。在WordPress密码重置过程中,我们还需要第二个页面来选择新密码。因此,为了节省时间,我们现在添加第二页。
为了清楚起见,这是整个数组(添加了最后两个页面定义):
//创建插件页面所需的信息$ page _ definitions = array(‘member-log in‘= & gt;数组(‘title‘= & gt;_ _(‘登录‘,‘个性化-登录‘),‘内容‘= & gt;’
第四步:处理WordPress帐户恢复表单提交现在我们已经创建了WordPress密码表单,接下来看看用户提交时会发生什么。
为了让我们在不求助于黑客的情况下正确处理错误,我们需要自己编写一些函数——当然是尽可能多地使用wp-login.php中的辅助函数。
为此,我们将在login_form_lostpassword操作中添加一个新函数来处理POST请求。
该函数将在wp-login.php中定义,使用retrieve_password函数查找用户并启动密码更新过程。然后,根据是否有错误,该函数将用户重定向到正确的页面:如果有错误,返回到忘记密码?消息模板页面,成功后,进入登录页面。
在构造函数中,添加下面一行:
add _ action(‘log in _ form _ lost password’,array($ this,‘do _ password _ lost’);然后,创建一个函数:
/** *启动密码重置。*/公共函数do _ password _ lost(){ if(‘POST‘= = $ _ SERVER
为了显示错误,我们将返回到丢失的WordPress更改密码表单。
首先,在短代码处理程序render_password_lost_form中,在呈现模板之前,添加以下行来遍历错误代码并收集数组中匹配的错误消息$属性。
这是一个简单的表单,包含两个字段:pass1和pass2。一个用于输入WordPress的密码,另一个用于重新输入密码以检查是否有拼写错误。
为了创建该表单的定制版本,我们将使用短代码。
首先,将下面一行添加到插件的构造函数中:
add _ short code(‘custom-password-reset-form’,array($ this,‘render _ password _ reset _ form’);然后,创建一个函数来呈现表单:
/** *用于呈现表单的短代码,该表单用于重置用户密码。* * @param array $attributes短代码属性。* @param string $content短代码的文本内容。没用过。* * @return string短代码输出*/公共函数render _ password _ reset _ form($ attributes,$ content = null){//解析短代码属性$ default _ attributes = array(‘show _ title‘= & gt;假的);$ attributes = short code _ atts($ default _ attributes,$ attributes);if(is _ user _ logged _ in()){ return _ _(‘您已经登录。,‘个性化-登录’);} else { if(isset($ _ REQUEST
步骤3:处理WordPress密码重置操作当用户通过点击WordPress密码重置按钮提交表单时,其内容将被发送到wp-login.php?Action=resetpass,这是我们用来将用户重定向到自定义密码重置页面的URL。
当然,当我们创建自己的表单时,我们也可以使用不同的URL。但是,通过保留这个默认URL并用login_form_resetpass(和login_form_rp,只是为了确认)替换默认函数,我们可以确保没有人意外地结束调用默认版本的密码重置。
为此,再次向构造函数添加两行:
add _ action(‘log in _ form _ RP’,array($ this,‘do _ password _ reset’));add _ action(‘log in _ form _ reset pass’,array($ this,‘do _ password _ reset’));然后,创建一个函数:
/** *如果提交了密码重置表单,则重置用户的密码。*/public function do _ password _ reset(){ if(‘POST‘= = $ _ SERVER【‘REQUEST _ METHOD‘】){ $ RP _ key = $ _ REQUEST【‘RP _ key‘】;$ RP _ log in = $ _ REQUEST【‘RP _ log in‘】;$ user = check _ password _ reset _ key($ RP _ key,$ RP _ log in);如果(!$ user | | is _ WP _ error($ user){ if($ user & amp;& amp$ user-& gt;get _ error _ code()= = =‘expired _ key’){ WP _ redirect(home _ URL(‘member-log in?log in = expired key‘));} else { WP _ redirect(home _ URL‘‘member-log in?log in = invalid key‘));}退出;} if(isset($ _ POST【‘pass 1‘】){ if($ _ POST【‘pass 1‘】!= $ _ POST【‘pass 2‘】){//密码不匹配$ redirect _ URL = home _ URL(‘member-password-reset‘);$ redirect _ URL = add _ query _ arg(‘key‘,$rp_key,$ redirect _ URL);$ redirect _ URL = add _ query _ arg(‘log in‘,$rp_login,$ redirect _ URL)$ redirect _ URL = add _ query _ arg(‘error‘,password _ reset _ mismatch,$ redirect _ URL);WP _ redirect($ redirect _ URL);退出;} if(empty($ _ POST【‘pass 1‘】)){//Password为空$ redirect _ URL = home _ URL(‘member-Password-reset‘);$ redirect _ URL = add _ query _ arg(‘key‘,$rp_key,$ redirect _ URL);$ redirect _ URL = add _ query _ arg(‘log in‘,$rp_login,$ redirect _ URL);$ redirect _ URL = add _ query _ arg(‘error‘,password _ reset _ empty,$ redirect _ URL);WP _ redirect($ redirect _ URL);退出;} //参数检查OK,重置密码reset _ password($ user,$ _ POST【‘pass 1‘】);WP _ redirect(home _ URL(‘会员登录?password = changed‘));} else { echo & quot无效请求。”;}退出;}}这个函数首先检查请求方法,应该是POST上面的重定向函数已经处理了GET请求。
然后,它从表单数据中收集密钥和登录参数,并使用它们来验证第9行的密码重置链接,使用WordPress函数check_password_reset_key(我们已经在重定向函数中使用了相同的函数)。
在第10-18行中,我们再次检查密码重置键检查中的可能错误,并将用户重定向到“忘记密码?”呈现消息模板页面时出错。
然后,如果重置密钥有效,我们可以关注WordPress帐户恢复表单。
首先,该函数检查两个密码是否匹配(第231行),然后检查它们是否为空(第343行)。在这两种情况下,用户将被重定向回我们的密码重置页面,URL包含密钥和登录参数,以便用户可以重试密码更新。p >
最后,如果所有检查都成功(如果您愿意,可以添加更多检查),该函数将使用函数reset_password重置WordPress密码(位于第46行),将用户重定向到登录页面,并将参数password=changed附加到URL以显示通知。
WordPress密码已经成功更新,剩下的就是显示成功通知和添加错误消息。
首先,让我们添加一个通知。在短代码函数render_login_form中,添加以下检查:
//检查用户是否刚刚更新了密码$ attributes【‘password _ updated‘】= isset($ _ REQUEST【‘password‘】)& amp;& amp$ _ REQUEST【‘密码‘】= =‘已更改‘;然后,在呈现表单之前将实际消息添加到login_form.php模板中:
& lt?PHP if($ attributes【‘password _ updated‘】):?& gt& ltp class = & quot登录信息& gt& lt?PHP _ e(‘您的密码已经更改。你现在可以登录了。,‘个性化-登录’);?& gt& lt/p & gt;& lt?php endif?& gt由于我们已经添加了对呈现上述错误消息的支持,剩下的工作就是向我们的函数get_error_message添加描述性错误消息。
在交换机的默认分支之前添加以下行…案例结构:
//Reset password case“expired key”:case“invalid key”:return _ _(“您使用的密码重置链接不再有效。”,‘个性化-登录’);case“password _ reset _ mismatch”:return _ _(& quot;您输入的两个密码不匹配。”,‘个性化-登录’);case“password _ reset _ empty”:return _ _(& quot;抱歉,我们不接受空密码。”,‘个性化-登录’);这就是结论!重置WP密码的功能已经准备好了,所以我们现在已经完成了WordPress登录体验的定制,从注册新用户到登录并重置丢失的密码。
我希望本系列为您提供了足够的工具,以便您可以更好地进一步定制它(例如,通过向密码重置过程添加新步骤)并更好地了解wp-login.php内部发生的事情。
现在,去定制更多内容吧!