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

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重写,请读者参考前面的文章自行修改),还有由于作者是在自己的电脑上测试,所以并不能百分百确定代码可用。

wordpress自定义密码重置页面

第一步:创建模板文件

首先在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.  
  5. if (!$user_ID) { //判断用户是否已经登陆
  6.    //接下来的代码应该添加在这里
  7.  
  8. } else {
  9.     wp_redirect( home_url() ); exit;
  10.     //重定向到首页
  11. }
  12. ?>

第四步:找回密码表单

  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.  
  6.         <form class="user_form" id="wp_pass_reset" action="" method="post">
  7.         <input type="text" class="text" name="user_input" value="" /><br />
  8.         <input type="hidden" name="action" value="tg_pwd_reset" />
  9.         <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />
  10.         <!--wp_create_nonce函数创建随机数,用于安全验证-->
  11.         <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />
  12.         </form>
  13.         <div id="result"></div> <!-- To hold validation results -->
  14.         <script type="text/javascript">
  15.         $("#wp_pass_reset").submit(function() {
  16.             $('#result').html('<span class="loading">Validating...</span>').fadeIn();
  17.             var input_data = $('#wp_pass_reset').serialize();
  18.             $.ajax({
  19.                 type: "POST",
  20.                 url:  "<?php echo get_permalink( $post->ID ); ?>",
  21.                 data: input_data,
  22.                 success: function(msg){
  23.                     $('.loading').remove();
  24.                     $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');
  25.                 }
  26.             });
  27.             return false;
  28.         });
  29.         </script>
  30.     <?php endwhile; else : ?>
  31.     <h2><?php _e('没有找到'); ?></h1>
  32.     <?php endif; ?>
  33. </div><!-- content -->
  34. <?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.     //过滤提交的数据
  11.     $user_input = $wpdb->escape(trim($_POST['user_input']));
  12.  
  13.     if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名
  14.         $user_data = get_user_by_email($user_input); //通过Email获取用户数据
  15.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员
  16.             echo "<div class='error'>无效的E-mail地址!</div>";
  17.             exit();
  18.         }
  19.     } else {
  20.         $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据
  21.         if(empty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员
  22.             echo "<div class='error'>无效的用户名!</div>";
  23.             exit();
  24.         }
  25.     }
  26.  
  27.     $user_login = $user_data->user_login;
  28.     $user_email = $user_data->user_email;
  29.  
  30.     $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙
  31.     if(empty($key)) { //如果为空
  32.         //generate reset keys生成 keys
  33.         $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙
  34.         $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库
  35.     }
  36.  
  37.     //邮件内容
  38.     $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";
  39.     $message .= get_option('siteurl') . "\r\n\r\n";
  40.     $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";
  41.     $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";
  42.     $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";
  43.     $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数
  44.  
  45.     if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {
  46.         echo "<div class='error'>邮件发送失败-原因未知。</div>";
  47.         exit();
  48.     } else {
  49.         echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";
  50.         exit();
  51.     }
  52. } else {
  53.  
  54.     //输出表单--第四步中的代码应该包涵在这个对大括号内
  55.  
  56. }

第七步:重置密码

如果用户是通过重置密码链接访问本页面,那么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.  
  7.     $user_login = $user_data->user_login;
  8.     $user_email = $user_data->user_email;
  9.     if(!empty($reset_key) && !empty($user_data)) {
  10.         $new_password = wp_generate_password(7, false); //生成7位随机密码
  11.         //echo $new_password; exit();
  12.         wp_set_password( $new_password, $user_data->ID ); //重置密码
  13.         //通过邮件将密码发送给用户
  14.         $message = __('账户的新密码为:') . "\r\n\r\n";
  15.         $message .= get_option('siteurl') . "\r\n\r\n";
  16.         $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";
  17.         $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";
  18.         $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";
  19.         if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {
  20.             echo "<div class='error'>邮件发送失败-原因未知</div>";
  21.             exit();
  22.         } else {
  23.             $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)
  24.             wp_safe_redirect($redirect_to);
  25.             exit();
  26.         }
  27.  
  28.     } else{
  29.         exit('无效的key.');
  30.     }
  31. }

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

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

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

懒人下载-页面模板文件

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

七大排序的个人总结(二) 归并排序(Merge

七大排序的个人总结&#xff08;二&#xff09; 归并排序&#xff08;Merge 归并排序&#xff08;Merge Sort&#xff09;: 归并排序是一个相当“稳定”的算法对于其它排序算法&#xff0c;比如希尔排序&#xff0c;快速排序和堆排序而言&#xff0c;这些算法有所谓的最好与最…

从Eclipse转移到IntelliJ IDEA一点心得

本人使用IntelliJ IDEA其实并不太久&#xff0c;用了这段时间以后&#xff0c;觉得的确很是好用。刚刚从Eclipse转过来的很多人开始可能不适应&#xff0c;我就把使用过程中的一些经验和常用功能分享下&#xff0c;当然在看这篇之前推荐你先看完IntelliJ IDEA 的 20 个代码自动…

【转】教你何时开启水果机上的HDR拍照

原址&#xff1a;http://news.mydrivers.com/1/175/175922.htm 苹果在iOS 4.1操作系统中为iPhone 4增加了一项有趣的新功能&#xff1a;HDR拍照。虽然目前市场上支持HDR功能的数码相机已经不在少数&#xff0c;但能够让普通消费者注意到这一功能&#xff0c;iPhone 4依然居功至…

Python快速学习03:运算 缩进和选择

前言 系列文章&#xff1a;[传送门] 这篇昨晚本来要出的&#xff0c;去搭了帐篷&#xff0c;在学校的屋顶上。 运算 运算&#xff0c;不得不说的是运算符。 数学 , -, *, /, **, %,// 判断 , !, >, >, <, <, in 逻辑 and, or, not 数学运算符 例子 print (19) …

冯洛伊曼体系结构

布尔代数 是一种关于0 和 1 的代数系统&#xff0c;用基础的逻辑符号系统描叙物体和概念&#xff0c;是现代电子计算机的数学和逻辑基础 布尔量&#xff1a; 0 1   True, False 与&#xff1a; a, b ab a*b and 或&#xff1a; ab …

web基础,用html元素制作web页面

观察常用网页的HTML元素&#xff0c;在实际的应用场景中&#xff0c;用已学的标签模仿制作。 用div,form制作登录页面&#xff0c;尽可能做得漂亮。 练习使用下拉列表选择框&#xff0c;无序列表&#xff0c;有序列表&#xff0c;定义列表。 <!DOCTYPE html> <html la…

三级分类菜单的数据库设计

http://www.imooc.com/article/285246?block_idtuijian_wz 最近在设计一款进销存系统的时候&#xff0c;遇到一个分类的设计问题&#xff0c;就是如何将分类设计成数据库里的表&#xff0c;怎么样设计才比较灵活&#xff1f; 举个例子&#xff0c;一级分类&#xff1a;生鲜类&…

(二)单元测试利器 JUnit 4

JUnit 深入 当然&#xff0c;JUnit 提供的功能决不仅仅如此简单&#xff0c;在接下来的内容中&#xff0c;我们会看到 JUnit 中很多有用的特性&#xff0c;掌握它们对您灵活的编写单元测试代码非常有帮助。Fixture 何谓 Fixture&#xff1f;它是指在执行一个或者…

.net平台的MongoDB使用

网址&#xff1a;http://www.cnblogs.com/skychen1218/p/6595759.html 前言 最近花了点时间玩了下MongoDB.Driver&#xff0c;进行封装了工具库&#xff0c;平常也会经常用到MongoDB&#xff0c;因此写一篇文章梳理知识同时把自己的成果分享给大家。 本篇会设计到Lambda表达式的…

2018程序员最佳ssh免费登陆工具

https://www.jianshu.com/p/b29b894aa60f Linux 终端 Screenshot from 2018-09-15 00-12-41.png PAC Screenshot from 2018-09-15 00-12-00.png 参考资料 讨论qq群144081101 591302926 567351477本文涉及的python测试开发库 谢谢点赞&#xff01;本文相关海量书籍下载 Wind…

学习flex布局(弹性布局)

Flex是Flexible Box的缩写&#xff0c;意为弹性布局。是W3C早期提出的一个新的布局方案。可以便捷的实现页面布局&#xff0c;目前较高版本的主流浏览器都能兼容&#xff0c;兼容情况如下&#xff1a; Flex在移动端开发上已是主流&#xff0c;比如在h5页面&#xff0c;微信小程…

php创建无限级树型菜单以及三级联动菜单

http://www.php.cn/php-weizijiaocheng-373500.html 这篇文章主要介绍了php创建无限级树型菜单 &#xff0c;主要使用的是递归函数&#xff0c;感兴趣的小伙伴们可以参考一下 写递归函数&#xff0c;可考虑缓存&#xff0c;定义一些静态变量来存上一次运行的结果&#xff0c;多…

使用Docker镜像和仓库

为什么80%的码农都做不了架构师&#xff1f;>>> Docker镜像 由文件系统叠加而成最底端第一层是引导文件系统bootfs&#xff0c;类似grub镜像第二层是root文件系统rootfs列出镜像 huangyiHP ~ % sudo docker images REPOSITORY TAG IMAGE …

wordpress发布文章时右侧边栏选择作者的功能代码

因为本网络营销博客现在有了两个作者&#xff0c;在后台发布文章时&#xff0c;希望可以选择作者&#xff08;以前仅是一个管理员&#xff09;。通过在网上查找资料&#xff0c;并进行实践成功。特分享如下。 一 在当前使用主题目录下的functions.php中添加以下php代码&#x…

c# webbrowser  获取用户选中文字

c# webbrowser 获取用户选中文字 原文:c# webbrowser 获取用户选中文字最近一直被一个问题困扰&#xff0c;有一个文本框&#xff0c;一个webbrowser控件&#xff0c;一个上下文菜单&#xff0c; 用户用鼠标左键选中文字&#xff0c;右键点击搜索&#xff0c;就把选中的文字赋…

cannot be deleted directly via the port API: has device owner network:floatingip

cannot be deleted directly via the port API: has device owner network:floatingip posted on 2015-10-13 19:26 秦瑞It行程实录 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/ruiy/p/4875605.html

c# params 工作原理。

2019独角兽企业重金招聘Python工程师标准>>> 高级语言之所以成为高级语言&#xff0c;编译器付出了很多。params在给我们带来方便的同时&#xff0c;编译器也是贡献不少。 实例代码&#xff1a; using System; public class Test { public static void Main(){ C…

这7个在线工具,帮助您快速开发WordPress主题

由于WordPress遵从GPL协议&#xff0c;这个协议规定WordPress可以免费用于商业用途。这样做一个网站的成本就比较低。相对应的开发WordPress主题的需求就多起来了。结合笔者多年开发WordPress主题的经验&#xff0c;熟练使用下面一些免费的工具&#xff0c;在开发WordPress主题…

不用第三方插件如何统计自己wordpress的访问量

很多wordpress博主都很在乎自己的访问量&#xff0c;使用第三方统计插件又会拖慢自己博客的响应速度&#xff0c;下面就交给大家如何自己写代码统计自己博客的访问量。 工具/原料 wordpress站点 自己站点的各种权限 方法/步骤 登录自己博客的后台&#xff0c;输入正确的用户…

WordPress导航菜单函数register_nav_menus() 和 wp_nav_menu()

导航菜单是每一个WordPress主题必须的元素&#xff0c;如果你要制作一个WordPress主题&#xff0c;那就必须熟悉WordPress导航菜单注册函数 register_nav_menus() 和 导航菜单调用函数wp_nav_menu() &#xff0c;这两个参数一般都是配合使用的。今天我们就一起来解释一下这两个…