http://www.ashuwp.com/courses/highgrade/338.html

文章参考自:http://www.tutorialstag.com/wordpress-custom-password-reset-page-template.html#codesyntax_2

密码重置是一个比稍微复杂的过程,因为这个过程需要更多的数据。

在这篇文章之前,我们先了解一下密码重置的流程:

首先用户需要重置密码

  • 一、先访问本页面,输入需要重置密码账户的Email或者用户名。
  • 二、系统通过用户输入的用户名\邮箱给用户发送一封邮件,邮件内容中有一个链接地址(还是本页面),但是这个链接地址中包含有一个密匙,所以如果访问本页面的地址中没有密匙,则用户需要输入用户名或密码,如果有密匙,那用户是来重置密码的而不是提交重置密码的请求
  • 三、用户通过邮件中的地址访问本页面(地址中含有密匙),判断地址中含有密匙,则用户是来重置密码的,所以判断密匙的正确性,如果正确,则通过邮件将生成的新密码发送给用户,如果不正确,则显示错误信息。

请记住上面说到的两个“动作”,重置密码、提交重置密码的请求。上面有提到一个密匙,密匙是存储在数据库中的,user表中的user_activation_key,一般是随机生成的。

本篇教程呢,以文章模板为例(使用url重写,请读者参考前面的文章自行修改),还有由于作者是在自己的电脑上测试,所以并不能百分百确定代码可用。

第一步:创建模板文件

首先在twenty ten主题中创建模板文件:page-passreset.php.

第二步:给模板文件命名

在文件开头添加代码

  1. <?php
  2. /*
  3. Template Name: 找回密码模板
  4. */
  5. ?>

第三步:判断用户是否已经登陆

  1. <?php
  2. global $wpdb, $user_ID;
  3. wp_enqueue_script( 'jquery' ); //加载jquery,如果你的主题头部已经引入,请删掉
  4. if (!$user_ID) { //判断用户是否已经登陆
  5. //接下来的代码应该添加在这里
  6. } else {
  7. wp_redirect( home_url() ); exit;
  8. //重定向到首页
  9. }
  10. ?>

第四步:找回密码表单

  1. get_header(); ?>
  2. <script src="http://code.jquery.com/jquery-1.4.4.js"></script><!--载入js-->
  3. <div id="content" role="main">
  4. <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
  5. <form class="user_form" id="wp_pass_reset" action="" method="post">
  6. <input type="text" class="text" name="user_input" value="" /><br />
  7. <input type="hidden" name="action" value="tg_pwd_reset" />
  8. <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />
  9. <!--wp_create_nonce函数创建随机数,用于安全验证-->
  10. <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />
  11. </form>
  12. <div id="result"></div> <!-- To hold validation results -->
  13. <script type="text/javascript">
  14. $("#wp_pass_reset").submit(function() {
  15. $('#result').html('<span class="loading">Validating...</span>').fadeIn();
  16. var input_data = $('#wp_pass_reset').serialize();
  17. $.ajax({
  18. type: "POST",
  19. url:  "<?php echo get_permalink( $post->ID ); ?>",
  20. data: input_data,
  21. success: function(msg){
  22. $('.loading').remove();
  23. $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');
  24. }
  25. });
  26. return false;
  27. });
  28. </script>
  29. <?php endwhile; else : ?>
  30. <h2><?php _e('没有找到'); ?></h1>
  31. <?php endif; ?>
  32. </div><!-- content -->
  33. <?php get_footer();

第五步:“重置”页面链接

这里说的重置,是在需要输出当前页面链接地址(比如重置密码的邮件中),需要根据当前页面的url形式重置出一个可用的url来。你可以将下面的函数添加在页面顶部global变量的后面,也可以放在引入js的后面

  1. function tg_validate_url() {
  2. global $post;
  3. $page_url = esc_url(get_permalink( $post->ID )); //获取本页面的链接地址
  4. $urlget = strpos($page_url, "?");
  5. if ($urlget === false) {
  6. $concate = "?";
  7. } else {
  8. $concate = "&";
  9. }
  10. return $page_url.$concate; //返回一个类似example.com/?     example.com/?p=123&   这样的url
  11. }

第六步:请求重置密码
文章最开始说到,本篇教程中需要区分两个“动作”,一个是请求重置代码(输入邮箱或用户名),其次是重置密码(用户通过邮箱中的链接地址来的),下面的代码需要判断用户是否提交了数据,所以请注意代码中最后面的提示,将第四步中的代码包含在那一对大括号中。

  1. if($_POST['action'] == "tg_pwd_reset"){ //判断是否为请求重置密码
  2. if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { //检查随机数
  3. exit("不要开玩笑");
  4. }
  5. if(empty($_POST['user_input'])) {
  6. echo "<div class='error'>请输入用户名或E-mail地址</div>";
  7. exit();
  8. }
  9. //过滤提交的数据
  10. $user_input = $wpdb->escape(trim($_POST['user_input']));
  11. if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名
  12. $user_data = get_user_by_email($user_input); //通过Email获取用户数据
  13. if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员
  14. echo "<div class='error'>无效的E-mail地址!</div>";
  15. exit();
  16. }
  17. } else {
  18. $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据
  19. if(empty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员
  20. echo "<div class='error'>无效的用户名!</div>";
  21. exit();
  22. }
  23. }
  24. $user_login = $user_data->user_login;
  25. $user_email = $user_data->user_email;
  26. $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙
  27. if(empty($key)) { //如果为空
  28. //generate reset keys生成 keys
  29. $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙
  30. $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库
  31. }
  32. //邮件内容
  33. $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";
  34. $message .= get_option('siteurl') . "\r\n\r\n";
  35. $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";
  36. $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";
  37. $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";
  38. $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数
  39. if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {
  40. echo "<div class='error'>邮件发送失败-原因未知。</div>";
  41. exit();
  42. } else {
  43. echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";
  44. exit();
  45. }
  46. } else {
  47. //输出表单--第四步中的代码应该包涵在这个对大括号内
  48. }

第七步:重置密码

如果用户是通过重置密码链接访问本页面,那么url中会有action\key\login三个参数,通过action参数来获取当前动作。

  1. if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { //如果存在key且action参数似乎reset_pwd
  2. $reset_key = $_GET['key']; //获取密匙
  3. $user_login = $_GET['login']; //获取用户名
  4. $user_data = $wpdb->get_row($wpdb->prepare("SELECT ID, user_login, user_email FROM $wpdb->users WHERE user_activation_key = %s AND user_login = %s", $reset_key, $user_login));
  5. //通过key和用户名验证数据
  6. $user_login = $user_data->user_login;
  7. $user_email = $user_data->user_email;
  8. if(!empty($reset_key) && !empty($user_data)) {
  9. $new_password = wp_generate_password(7, false); //生成7位随机密码
  10. //echo $new_password; exit();
  11. wp_set_password( $new_password, $user_data->ID ); //重置密码
  12. //通过邮件将密码发送给用户
  13. $message = __('账户的新密码为:') . "\r\n\r\n";
  14. $message .= get_option('siteurl') . "\r\n\r\n";
  15. $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";
  16. $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";
  17. $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";
  18. if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {
  19. echo "<div class='error'>邮件发送失败-原因未知</div>";
  20. exit();
  21. } else {
  22. $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)
  23. wp_safe_redirect($redirect_to);
  24. exit();
  25. }
  26. } else{
  27. exit('无效的key.');
  28. }
  29. }

第八步:重置密码成功
在上一步的代码中,重置密码成功则重定向到一个重置密码成功的页面,其实还是本页面,只不多action参数不一样:

  1. if(isset($_GET['action']) && $_GET['action'] == "reset_success") { //如果动作为reset_success就是成功了哇
  2. exit('<span class="success">密码重置成功,已经通过邮件发送给您,请查收。</span>');
  3. }

到此,代码已经完成。
下面是懒人下载

懒人下载-页面模板文件

如果你想通过url重写来实现本页面,请注意更改相应的“重置url函数”,以及一些涉及到Url的地方。

wordpress进阶教程(十九):创建自定义的找回密码页面相关推荐

  1. php后台幻灯片管理,wordpress进阶教程(三十七):wordpress后台添加幻灯片板块

    本站框架有提供添加幻灯片的步骤,请直接前往本站 框架栏目->幻灯片插件. 网页幻灯片(slider)应用很广泛,很多博客也喜欢在首页弄一个特色文章切换. 不管是文章切换还是图片切换,或者是图文混 ...

  2. 【Visual C++】游戏开发五十一 浅墨DirectX教程十九 网格模型进阶之路

    本系列文章由zhmxy555(毛星云)编写,转载请注明出处. 文章链接: http://blog.csdn.net/zhmxy555/article/details/8770426 作者:毛星云(浅墨 ...

  3. 群晖NAS教程(十九)、利用Docker安装青龙面板(京东薅羊毛)

    为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客 群晖NAS教程(十九).利用Docker安装青龙面板(京东薅羊毛) 一.安装qinglong容器 在群晖docker套件中,搜索qinglong, ...

  4. SAP UI5 初学者教程之九 - 创建第一个 Component 的试读版

    一套适合 SAP UI5 初学者循序渐进的学习教程 教程目录 SAP UI5 本地开发环境的搭建 SAP UI5 初学者教程之一:Hello World SAP UI5 初学者教程之二:SAP UI5 ...

  5. PVE系列教程(十九)、ubuntu22.04使用Nginx配置chevereto服务器

    PVE系列教程(十九).ubuntu22.04使用Nginx配置chevereto服务器 为了更好的浏览体验,欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 一.环 ...

  6. ComicEnhancerPro 系列教程十九:用JpegQuality看JPG文件的压缩参数

    作者:马健 邮箱:stronghorse_mj@hotmail.com 主页:http://www.comicer.com/stronghorse/ 发布:2017.07.23 教程十九:用JpegQ ...

  7. SwiftUI 颜色教程大全之中创建自定义调色板

    SwiftUI 颜色教程大全之中创建自定义调色板 SwiftUI 中的颜色管理很简单.在这个简短的教程中,我们将介绍一些可以在项目中使用自定义调色板的方法. 创建您的调色板 创建新项目时,您会注意到已 ...

  8. html菜单wodpress,wordpress进阶教程(二十二):初步了解菜单

    这篇教程放到本站的进阶教程中来,其实有点不合适,但是我发现很多人对菜单使用不熟,更别提应用了.所以我觉得在写菜单的高级应用之前有必要重新写个基础篇. wordpress 3.5版本中,取消了友情链接项 ...

  9. twisted系列教程十九–cancel deferred

    Introduction twisted 是一个正在发展的项目,twisted 的开发者们会添加一些新的特色或者扩展旧的.随着twisted 10.1.0 的发布,开发者们增加了一个新的功能–取消,这 ...

最新文章

  1. Python Numpy 从文件中读取数据
  2. python软件代码示例-python 示例代码1
  3. Hexo+OSChina(码云)+git 搭建个人博客
  4. 多线程:AQS的一些心得
  5. python模拟sed在每行添加##
  6. Flash Builder 找不到所需的 Adobe Flash Player
  7. linux idea 权限,Linux下idea由于缺少相关权限导致的tomcat ERROR
  8. 数据结构课上笔记13
  9. 蓝桥杯大赛 青少年创意编程 第十一届 C++组
  10. 用启动易合并启动光盘图解教程
  11. CentOS 利用Yum安装mysql后无法启动(MySQL Daemon failed to start.)
  12. 7月1号连连支付不能提现PayPal了,以后PayPal怎样提现?
  13. Tomcat8出现To prevent a memory leak, the JDBC Driver has been forcibly unregistered
  14. 什么是公网ip?--快解析科普
  15. android 自定义 对号,超简单实现Android自定义Toast
  16. Excel计算工作日的公式
  17. 使用Canvas制作刮刮乐,看看你能刮出什么奖品来?
  18. 使用python进行相关性分析并绘制散点图
  19. Oxygen XML Editor Mac版(基于Java的XML编辑器)
  20. 宁夏大学计算机学院导师,宁夏大学数学计算机学院大学生职业生涯人物访谈大赛落幕...

热门文章

  1. iOS开发之如何将字典转为模型
  2. httpd2.4源码编译
  3. mysql 分区信息查看
  4. 分类结果可视化python_可视化分类结果的另一种方法
  5. android 字符串特殊字符转义
  6. css背景图片添加url_CSS背景图片–如何向您的Div添加图片URL
  7. django构建网页_如何使用Django构建照片供稿
  8. 单变量线性回归模型_了解如何为单变量模型选择效果最好的线性回归
  9. 如何使用Create React App DevOps自动化工作中所有无聊的部分
  10. ols线性回归_普通最小二乘[OLS]方法使用于机器学习的简单线性回归变得容易