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


文章参考自: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. ?>  
  6. <?php   
  7. global $wpdb, $user_ID;   
  8. wp_enqueue_script( 'jquery' ); //加载jquery,如果你的主题头部已经引入,请删掉   
  9.   
  10. if (!$user_ID) { //判断用户是否已经登陆   
  11.    //接下来的代码应该添加在这里
  12.   
  13. } else {   
  14.     wp_redirect( home_url() ); exit;   
  15.     //重定向到首页   
  16. }   
  17. ?>  
  18. get_header(); ?>   
  19. <script src="http://code.jquery.com/jquery-1.4.4.js"></script><!--载入js-->   
  20. <div id="content" role="main">   
  21.     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>   
  22.        
  23.         <form class="user_form" id="wp_pass_reset" action="" method="post">   
  24.         <input type="text" class="text" name="user_input" value="" /><br />   
  25.         <input type="hidden" name="action" value="tg_pwd_reset" />   
  26.         <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />   
  27.         <!--wp_create_nonce函数创建随机数,用于安全验证-->   
  28.         <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />   
  29.         </form>   
  30.         <div id="result"></div> <!-- To hold validation results -->   
  31.         <script type="text/javascript">   
  32.         $("#wp_pass_reset").submit(function() {    
  33.             $('#result').html('<span class="loading">Validating...</span>').fadeIn();   
  34.             var input_data = $('#wp_pass_reset').serialize();   
  35.             $.ajax({   
  36.                 type: "POST",   
  37.                 url:  "<?php echo get_permalink( $post->ID ); ?>",   
  38.                 data: input_data,   
  39.                 success: function(msg){   
  40.                     $('.loading').remove();   
  41.                     $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');   
  42.                 }   
  43.             });   
  44.             return false;   
  45.         });   
  46.         </script>   
  47.     <?php endwhile; else : ?>   
  48.     <h2><?php _e('没有找到'); ?></h1>          
  49.     <?php endif; ?>   
  50. </div><!-- content -->   
  51. <?php get_footer();  
  52. function tg_validate_url() {   
  53.     global $post;   
  54.     $page_url = esc_url(get_permalink( $post->ID )); //获取本页面的链接地址   
  55.     $urlget = strpos($page_url, "?");   
  56.     if ($urlget === false) {   
  57.         $concate = "?";   
  58.     } else {   
  59.         $concate = "&";   
  60.     }   
  61.     return $page_url.$concate; //返回一个类似example.com/?     example.com/?p=123&   这样的url
  62. }  
  63. if($_POST['action'] == "tg_pwd_reset"){ //判断是否为请求重置密码   
  64.     if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { //检查随机数   
  65.         exit("不要开玩笑");   
  66.     }   
  67.     if(emptyempty($_POST['user_input'])) {   
  68.         echo "<div class='error'>请输入用户名或E-mail地址</div>";   
  69.         exit();   
  70.     }   
  71.        
  72.     //过滤提交的数据   
  73.     $user_input = $wpdb->escape(trim($_POST['user_input']));   
  74.        
  75.     if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名   
  76.         $user_data = get_user_by_email($user_input); //通过Email获取用户数据   
  77.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  78.             echo "<div class='error'>无效的E-mail地址!</div>";   
  79.             exit();   
  80.         }   
  81.     } else {   
  82.         $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据   
  83.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  84.             echo "<div class='error'>无效的用户名!</div>";   
  85.             exit();   
  86.         }   
  87.     }   
  88.        
  89.     $user_login = $user_data->user_login;   
  90.     $user_email = $user_data->user_email;   
  91.        
  92.     $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙   
  93.     if(emptyempty($key)) { //如果为空   
  94.         //generate reset keys生成 keys   
  95.         $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙   
  96.         $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库   
  97.     }   
  98.        
  99.     //邮件内容   
  100.     $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";   
  101.     $message .= get_option('siteurl') . "\r\n\r\n";   
  102.     $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  103.     $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";   
  104.     $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";   
  105.     $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数   
  106.        
  107.     if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  108.         echo "<div class='error'>邮件发送失败-原因未知。</div>";   
  109.         exit();   
  110.     } else {   
  111.         echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";   
  112.         exit();   
  113.     }   
  114. } else {   
  115.        
  116.     //输出表单--第四步中的代码应该包涵在这个对大括号内   
  117.   
  118. }  
  119. if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { //如果存在key且action参数似乎reset_pwd   
  120.     $reset_key = $_GET['key']; //获取密匙   
  121.     $user_login = $_GET['login']; //获取用户名   
  122.     $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));   
  123.     //通过key和用户名验证数据   
  124.        
  125.     $user_login = $user_data->user_login;   
  126.     $user_email = $user_data->user_email;   
  127.     if(!emptyempty($reset_key) && !emptyempty($user_data)) {   
  128.         $new_password = wp_generate_password(7, false); //生成7位随机密码   
  129.         //echo $new_password; exit();   
  130.         wp_set_password( $new_password, $user_data->ID ); //重置密码   
  131.         //通过邮件将密码发送给用户   
  132.         $message = __('账户的新密码为:') . "\r\n\r\n";   
  133.         $message .= get_option('siteurl') . "\r\n\r\n";   
  134.         $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  135.         $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";   
  136.         $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";   
  137.         if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  138.             echo "<div class='error'>邮件发送失败-原因未知</div>";   
  139.             exit();   
  140.         } else {   
  141.             $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)   
  142.             wp_safe_redirect($redirect_to);   
  143.             exit();   
  144.         }   
  145.                
  146.     } else{   
  147.         exit('无效的key.');   
  148.     }   
  149. }  
  150. if(isset($_GET['action']) && $_GET['action'] == "reset_success") { //如果动作为reset_success就是成功了哇   
  151.     exit('<span class="success">密码重置成功,已经通过邮件发送给您,请查收。</span>');   
  152. }   

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

  1. <?php   
  2. /*
  3. Template Name: 找回密码模板  
  4. */  
  5. ?>  
  6. <?php   
  7. global $wpdb, $user_ID;   
  8. wp_enqueue_script( 'jquery' ); //加载jquery,如果你的主题头部已经引入,请删掉   
  9.   
  10. if (!$user_ID) { //判断用户是否已经登陆   
  11.    //接下来的代码应该添加在这里
  12.   
  13. } else {   
  14.     wp_redirect( home_url() ); exit;   
  15.     //重定向到首页   
  16. }   
  17. ?>  
  18. get_header(); ?>   
  19. <script src="http://code.jquery.com/jquery-1.4.4.js"></script><!--载入js-->   
  20. <div id="content" role="main">   
  21.     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>   
  22.        
  23.         <form class="user_form" id="wp_pass_reset" action="" method="post">   
  24.         <input type="text" class="text" name="user_input" value="" /><br />   
  25.         <input type="hidden" name="action" value="tg_pwd_reset" />   
  26.         <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />   
  27.         <!--wp_create_nonce函数创建随机数,用于安全验证-->   
  28.         <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />   
  29.         </form>   
  30.         <div id="result"></div> <!-- To hold validation results -->   
  31.         <script type="text/javascript">   
  32.         $("#wp_pass_reset").submit(function() {    
  33.             $('#result').html('<span class="loading">Validating...</span>').fadeIn();   
  34.             var input_data = $('#wp_pass_reset').serialize();   
  35.             $.ajax({   
  36.                 type: "POST",   
  37.                 url:  "<?php echo get_permalink( $post->ID ); ?>",   
  38.                 data: input_data,   
  39.                 success: function(msg){   
  40.                     $('.loading').remove();   
  41.                     $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');   
  42.                 }   
  43.             });   
  44.             return false;   
  45.         });   
  46.         </script>   
  47.     <?php endwhile; else : ?>   
  48.     <h2><?php _e('没有找到'); ?></h1>          
  49.     <?php endif; ?>   
  50. </div><!-- content -->   
  51. <?php get_footer();  
  52. function tg_validate_url() {   
  53.     global $post;   
  54.     $page_url = esc_url(get_permalink( $post->ID )); //获取本页面的链接地址   
  55.     $urlget = strpos($page_url, "?");   
  56.     if ($urlget === false) {   
  57.         $concate = "?";   
  58.     } else {   
  59.         $concate = "&";   
  60.     }   
  61.     return $page_url.$concate; //返回一个类似example.com/?     example.com/?p=123&   这样的url
  62. }  
  63. if($_POST['action'] == "tg_pwd_reset"){ //判断是否为请求重置密码   
  64.     if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { //检查随机数   
  65.         exit("不要开玩笑");   
  66.     }   
  67.     if(emptyempty($_POST['user_input'])) {   
  68.         echo "<div class='error'>请输入用户名或E-mail地址</div>";   
  69.         exit();   
  70.     }   
  71.        
  72.     //过滤提交的数据   
  73.     $user_input = $wpdb->escape(trim($_POST['user_input']));   
  74.        
  75.     if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名   
  76.         $user_data = get_user_by_email($user_input); //通过Email获取用户数据   
  77.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  78.             echo "<div class='error'>无效的E-mail地址!</div>";   
  79.             exit();   
  80.         }   
  81.     } else {   
  82.         $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据   
  83.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  84.             echo "<div class='error'>无效的用户名!</div>";   
  85.             exit();   
  86.         }   
  87.     }   
  88.        
  89.     $user_login = $user_data->user_login;   
  90.     $user_email = $user_data->user_email;   
  91.        
  92.     $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙   
  93.     if(emptyempty($key)) { //如果为空   
  94.         //generate reset keys生成 keys   
  95.         $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙   
  96.         $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库   
  97.     }   
  98.        
  99.     //邮件内容   
  100.     $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";   
  101.     $message .= get_option('siteurl') . "\r\n\r\n";   
  102.     $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  103.     $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";   
  104.     $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";   
  105.     $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数   
  106.        
  107.     if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  108.         echo "<div class='error'>邮件发送失败-原因未知。</div>";   
  109.         exit();   
  110.     } else {   
  111.         echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";   
  112.         exit();   
  113.     }   
  114. } else {   
  115.        
  116.     //输出表单--第四步中的代码应该包涵在这个对大括号内   
  117.   
  118. }  
  119. if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { //如果存在key且action参数似乎reset_pwd   
  120.     $reset_key = $_GET['key']; //获取密匙   
  121.     $user_login = $_GET['login']; //获取用户名   
  122.     $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));   
  123.     //通过key和用户名验证数据   
  124.        
  125.     $user_login = $user_data->user_login;   
  126.     $user_email = $user_data->user_email;   
  127.     if(!emptyempty($reset_key) && !emptyempty($user_data)) {   
  128.         $new_password = wp_generate_password(7, false); //生成7位随机密码   
  129.         //echo $new_password; exit();   
  130.         wp_set_password( $new_password, $user_data->ID ); //重置密码   
  131.         //通过邮件将密码发送给用户   
  132.         $message = __('账户的新密码为:') . "\r\n\r\n";   
  133.         $message .= get_option('siteurl') . "\r\n\r\n";   
  134.         $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  135.         $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";   
  136.         $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";   
  137.         if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  138.             echo "<div class='error'>邮件发送失败-原因未知</div>";   
  139.             exit();   
  140.         } else {   
  141.             $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)   
  142.             wp_safe_redirect($redirect_to);   
  143.             exit();   
  144.         }   
  145.                
  146.     } else{   
  147.         exit('无效的key.');   
  148.     }   
  149. }  
  150. if(isset($_GET['action']) && $_GET['action'] == "reset_success") { //如果动作为reset_success就是成功了哇   
  151.     exit('<span class="success">密码重置成功,已经通过邮件发送给您,请查收。</span>');   
  152. }   

第四步:找回密码表单

  1. <?php   
  2. /*
  3. Template Name: 找回密码模板  
  4. */  
  5. ?>  
  6. <?php   
  7. global $wpdb, $user_ID;   
  8. wp_enqueue_script( 'jquery' ); //加载jquery,如果你的主题头部已经引入,请删掉   
  9.   
  10. if (!$user_ID) { //判断用户是否已经登陆   
  11.    //接下来的代码应该添加在这里
  12.   
  13. } else {   
  14.     wp_redirect( home_url() ); exit;   
  15.     //重定向到首页   
  16. }   
  17. ?>  
  18. get_header(); ?>   
  19. <script src="http://code.jquery.com/jquery-1.4.4.js"></script><!--载入js-->   
  20. <div id="content" role="main">   
  21.     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>   
  22.        
  23.         <form class="user_form" id="wp_pass_reset" action="" method="post">   
  24.         <input type="text" class="text" name="user_input" value="" /><br />   
  25.         <input type="hidden" name="action" value="tg_pwd_reset" />   
  26.         <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />   
  27.         <!--wp_create_nonce函数创建随机数,用于安全验证-->   
  28.         <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />   
  29.         </form>   
  30.         <div id="result"></div> <!-- To hold validation results -->   
  31.         <script type="text/javascript">   
  32.         $("#wp_pass_reset").submit(function() {    
  33.             $('#result').html('<span class="loading">Validating...</span>').fadeIn();   
  34.             var input_data = $('#wp_pass_reset').serialize();   
  35.             $.ajax({   
  36.                 type: "POST",   
  37.                 url:  "<?php echo get_permalink( $post->ID ); ?>",   
  38.                 data: input_data,   
  39.                 success: function(msg){   
  40.                     $('.loading').remove();   
  41.                     $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');   
  42.                 }   
  43.             });   
  44.             return false;   
  45.         });   
  46.         </script>   
  47.     <?php endwhile; else : ?>   
  48.     <h2><?php _e('没有找到'); ?></h1>          
  49.     <?php endif; ?>   
  50. </div><!-- content -->   
  51. <?php get_footer();  
  52. function tg_validate_url() {   
  53.     global $post;   
  54.     $page_url = esc_url(get_permalink( $post->ID )); //获取本页面的链接地址   
  55.     $urlget = strpos($page_url, "?");   
  56.     if ($urlget === false) {   
  57.         $concate = "?";   
  58.     } else {   
  59.         $concate = "&";   
  60.     }   
  61.     return $page_url.$concate; //返回一个类似example.com/?     example.com/?p=123&   这样的url
  62. }  
  63. if($_POST['action'] == "tg_pwd_reset"){ //判断是否为请求重置密码   
  64.     if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { //检查随机数   
  65.         exit("不要开玩笑");   
  66.     }   
  67.     if(emptyempty($_POST['user_input'])) {   
  68.         echo "<div class='error'>请输入用户名或E-mail地址</div>";   
  69.         exit();   
  70.     }   
  71.        
  72.     //过滤提交的数据   
  73.     $user_input = $wpdb->escape(trim($_POST['user_input']));   
  74.        
  75.     if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名   
  76.         $user_data = get_user_by_email($user_input); //通过Email获取用户数据   
  77.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  78.             echo "<div class='error'>无效的E-mail地址!</div>";   
  79.             exit();   
  80.         }   
  81.     } else {   
  82.         $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据   
  83.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  84.             echo "<div class='error'>无效的用户名!</div>";   
  85.             exit();   
  86.         }   
  87.     }   
  88.        
  89.     $user_login = $user_data->user_login;   
  90.     $user_email = $user_data->user_email;   
  91.        
  92.     $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙   
  93.     if(emptyempty($key)) { //如果为空   
  94.         //generate reset keys生成 keys   
  95.         $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙   
  96.         $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库   
  97.     }   
  98.        
  99.     //邮件内容   
  100.     $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";   
  101.     $message .= get_option('siteurl') . "\r\n\r\n";   
  102.     $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  103.     $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";   
  104.     $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";   
  105.     $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数   
  106.        
  107.     if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  108.         echo "<div class='error'>邮件发送失败-原因未知。</div>";   
  109.         exit();   
  110.     } else {   
  111.         echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";   
  112.         exit();   
  113.     }   
  114. } else {   
  115.        
  116.     //输出表单--第四步中的代码应该包涵在这个对大括号内   
  117.   
  118. }  
  119. if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { //如果存在key且action参数似乎reset_pwd   
  120.     $reset_key = $_GET['key']; //获取密匙   
  121.     $user_login = $_GET['login']; //获取用户名   
  122.     $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));   
  123.     //通过key和用户名验证数据   
  124.        
  125.     $user_login = $user_data->user_login;   
  126.     $user_email = $user_data->user_email;   
  127.     if(!emptyempty($reset_key) && !emptyempty($user_data)) {   
  128.         $new_password = wp_generate_password(7, false); //生成7位随机密码   
  129.         //echo $new_password; exit();   
  130.         wp_set_password( $new_password, $user_data->ID ); //重置密码   
  131.         //通过邮件将密码发送给用户   
  132.         $message = __('账户的新密码为:') . "\r\n\r\n";   
  133.         $message .= get_option('siteurl') . "\r\n\r\n";   
  134.         $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  135.         $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";   
  136.         $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";   
  137.         if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  138.             echo "<div class='error'>邮件发送失败-原因未知</div>";   
  139.             exit();   
  140.         } else {   
  141.             $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)   
  142.             wp_safe_redirect($redirect_to);   
  143.             exit();   
  144.         }   
  145.                
  146.     } else{   
  147.         exit('无效的key.');   
  148.     }   
  149. }  
  150. if(isset($_GET['action']) && $_GET['action'] == "reset_success") { //如果动作为reset_success就是成功了哇   
  151.     exit('<span class="success">密码重置成功,已经通过邮件发送给您,请查收。</span>');   
  152. }   

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

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

  1. <?php   
  2. /*
  3. Template Name: 找回密码模板  
  4. */  
  5. ?>  
  6. <?php   
  7. global $wpdb, $user_ID;   
  8. wp_enqueue_script( 'jquery' ); //加载jquery,如果你的主题头部已经引入,请删掉   
  9.   
  10. if (!$user_ID) { //判断用户是否已经登陆   
  11.    //接下来的代码应该添加在这里
  12.   
  13. } else {   
  14.     wp_redirect( home_url() ); exit;   
  15.     //重定向到首页   
  16. }   
  17. ?>  
  18. get_header(); ?>   
  19. <script src="http://code.jquery.com/jquery-1.4.4.js"></script><!--载入js-->   
  20. <div id="content" role="main">   
  21.     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>   
  22.        
  23.         <form class="user_form" id="wp_pass_reset" action="" method="post">   
  24.         <input type="text" class="text" name="user_input" value="" /><br />   
  25.         <input type="hidden" name="action" value="tg_pwd_reset" />   
  26.         <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />   
  27.         <!--wp_create_nonce函数创建随机数,用于安全验证-->   
  28.         <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />   
  29.         </form>   
  30.         <div id="result"></div> <!-- To hold validation results -->   
  31.         <script type="text/javascript">   
  32.         $("#wp_pass_reset").submit(function() {    
  33.             $('#result').html('<span class="loading">Validating...</span>').fadeIn();   
  34.             var input_data = $('#wp_pass_reset').serialize();   
  35.             $.ajax({   
  36.                 type: "POST",   
  37.                 url:  "<?php echo get_permalink( $post->ID ); ?>",   
  38.                 data: input_data,   
  39.                 success: function(msg){   
  40.                     $('.loading').remove();   
  41.                     $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');   
  42.                 }   
  43.             });   
  44.             return false;   
  45.         });   
  46.         </script>   
  47.     <?php endwhile; else : ?>   
  48.     <h2><?php _e('没有找到'); ?></h1>          
  49.     <?php endif; ?>   
  50. </div><!-- content -->   
  51. <?php get_footer();  
  52. function tg_validate_url() {   
  53.     global $post;   
  54.     $page_url = esc_url(get_permalink( $post->ID )); //获取本页面的链接地址   
  55.     $urlget = strpos($page_url, "?");   
  56.     if ($urlget === false) {   
  57.         $concate = "?";   
  58.     } else {   
  59.         $concate = "&";   
  60.     }   
  61.     return $page_url.$concate; //返回一个类似example.com/?     example.com/?p=123&   这样的url
  62. }  
  63. if($_POST['action'] == "tg_pwd_reset"){ //判断是否为请求重置密码   
  64.     if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { //检查随机数   
  65.         exit("不要开玩笑");   
  66.     }   
  67.     if(emptyempty($_POST['user_input'])) {   
  68.         echo "<div class='error'>请输入用户名或E-mail地址</div>";   
  69.         exit();   
  70.     }   
  71.        
  72.     //过滤提交的数据   
  73.     $user_input = $wpdb->escape(trim($_POST['user_input']));   
  74.        
  75.     if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名   
  76.         $user_data = get_user_by_email($user_input); //通过Email获取用户数据   
  77.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  78.             echo "<div class='error'>无效的E-mail地址!</div>";   
  79.             exit();   
  80.         }   
  81.     } else {   
  82.         $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据   
  83.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  84.             echo "<div class='error'>无效的用户名!</div>";   
  85.             exit();   
  86.         }   
  87.     }   
  88.        
  89.     $user_login = $user_data->user_login;   
  90.     $user_email = $user_data->user_email;   
  91.        
  92.     $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙   
  93.     if(emptyempty($key)) { //如果为空   
  94.         //generate reset keys生成 keys   
  95.         $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙   
  96.         $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库   
  97.     }   
  98.        
  99.     //邮件内容   
  100.     $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";   
  101.     $message .= get_option('siteurl') . "\r\n\r\n";   
  102.     $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  103.     $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";   
  104.     $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";   
  105.     $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数   
  106.        
  107.     if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  108.         echo "<div class='error'>邮件发送失败-原因未知。</div>";   
  109.         exit();   
  110.     } else {   
  111.         echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";   
  112.         exit();   
  113.     }   
  114. } else {   
  115.        
  116.     //输出表单--第四步中的代码应该包涵在这个对大括号内   
  117.   
  118. }  
  119. if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { //如果存在key且action参数似乎reset_pwd   
  120.     $reset_key = $_GET['key']; //获取密匙   
  121.     $user_login = $_GET['login']; //获取用户名   
  122.     $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));   
  123.     //通过key和用户名验证数据   
  124.        
  125.     $user_login = $user_data->user_login;   
  126.     $user_email = $user_data->user_email;   
  127.     if(!emptyempty($reset_key) && !emptyempty($user_data)) {   
  128.         $new_password = wp_generate_password(7, false); //生成7位随机密码   
  129.         //echo $new_password; exit();   
  130.         wp_set_password( $new_password, $user_data->ID ); //重置密码   
  131.         //通过邮件将密码发送给用户   
  132.         $message = __('账户的新密码为:') . "\r\n\r\n";   
  133.         $message .= get_option('siteurl') . "\r\n\r\n";   
  134.         $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  135.         $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";   
  136.         $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";   
  137.         if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  138.             echo "<div class='error'>邮件发送失败-原因未知</div>";   
  139.             exit();   
  140.         } else {   
  141.             $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)   
  142.             wp_safe_redirect($redirect_to);   
  143.             exit();   
  144.         }   
  145.                
  146.     } else{   
  147.         exit('无效的key.');   
  148.     }   
  149. }  
  150. if(isset($_GET['action']) && $_GET['action'] == "reset_success") { //如果动作为reset_success就是成功了哇   
  151.     exit('<span class="success">密码重置成功,已经通过邮件发送给您,请查收。</span>');   
  152. }   

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

  1. <?php   
  2. /*
  3. Template Name: 找回密码模板  
  4. */  
  5. ?>  
  6. <?php   
  7. global $wpdb, $user_ID;   
  8. wp_enqueue_script( 'jquery' ); //加载jquery,如果你的主题头部已经引入,请删掉   
  9.   
  10. if (!$user_ID) { //判断用户是否已经登陆   
  11.    //接下来的代码应该添加在这里
  12.   
  13. } else {   
  14.     wp_redirect( home_url() ); exit;   
  15.     //重定向到首页   
  16. }   
  17. ?>  
  18. get_header(); ?>   
  19. <script src="http://code.jquery.com/jquery-1.4.4.js"></script><!--载入js-->   
  20. <div id="content" role="main">   
  21.     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>   
  22.        
  23.         <form class="user_form" id="wp_pass_reset" action="" method="post">   
  24.         <input type="text" class="text" name="user_input" value="" /><br />   
  25.         <input type="hidden" name="action" value="tg_pwd_reset" />   
  26.         <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />   
  27.         <!--wp_create_nonce函数创建随机数,用于安全验证-->   
  28.         <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />   
  29.         </form>   
  30.         <div id="result"></div> <!-- To hold validation results -->   
  31.         <script type="text/javascript">   
  32.         $("#wp_pass_reset").submit(function() {    
  33.             $('#result').html('<span class="loading">Validating...</span>').fadeIn();   
  34.             var input_data = $('#wp_pass_reset').serialize();   
  35.             $.ajax({   
  36.                 type: "POST",   
  37.                 url:  "<?php echo get_permalink( $post->ID ); ?>",   
  38.                 data: input_data,   
  39.                 success: function(msg){   
  40.                     $('.loading').remove();   
  41.                     $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');   
  42.                 }   
  43.             });   
  44.             return false;   
  45.         });   
  46.         </script>   
  47.     <?php endwhile; else : ?>   
  48.     <h2><?php _e('没有找到'); ?></h1>          
  49.     <?php endif; ?>   
  50. </div><!-- content -->   
  51. <?php get_footer();  
  52. function tg_validate_url() {   
  53.     global $post;   
  54.     $page_url = esc_url(get_permalink( $post->ID )); //获取本页面的链接地址   
  55.     $urlget = strpos($page_url, "?");   
  56.     if ($urlget === false) {   
  57.         $concate = "?";   
  58.     } else {   
  59.         $concate = "&";   
  60.     }   
  61.     return $page_url.$concate; //返回一个类似example.com/?     example.com/?p=123&   这样的url
  62. }  
  63. if($_POST['action'] == "tg_pwd_reset"){ //判断是否为请求重置密码   
  64.     if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { //检查随机数   
  65.         exit("不要开玩笑");   
  66.     }   
  67.     if(emptyempty($_POST['user_input'])) {   
  68.         echo "<div class='error'>请输入用户名或E-mail地址</div>";   
  69.         exit();   
  70.     }   
  71.        
  72.     //过滤提交的数据   
  73.     $user_input = $wpdb->escape(trim($_POST['user_input']));   
  74.        
  75.     if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名   
  76.         $user_data = get_user_by_email($user_input); //通过Email获取用户数据   
  77.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  78.             echo "<div class='error'>无效的E-mail地址!</div>";   
  79.             exit();   
  80.         }   
  81.     } else {   
  82.         $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据   
  83.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  84.             echo "<div class='error'>无效的用户名!</div>";   
  85.             exit();   
  86.         }   
  87.     }   
  88.        
  89.     $user_login = $user_data->user_login;   
  90.     $user_email = $user_data->user_email;   
  91.        
  92.     $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙   
  93.     if(emptyempty($key)) { //如果为空   
  94.         //generate reset keys生成 keys   
  95.         $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙   
  96.         $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库   
  97.     }   
  98.        
  99.     //邮件内容   
  100.     $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";   
  101.     $message .= get_option('siteurl') . "\r\n\r\n";   
  102.     $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  103.     $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";   
  104.     $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";   
  105.     $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数   
  106.        
  107.     if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  108.         echo "<div class='error'>邮件发送失败-原因未知。</div>";   
  109.         exit();   
  110.     } else {   
  111.         echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";   
  112.         exit();   
  113.     }   
  114. } else {   
  115.        
  116.     //输出表单--第四步中的代码应该包涵在这个对大括号内   
  117.   
  118. }  
  119. if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { //如果存在key且action参数似乎reset_pwd   
  120.     $reset_key = $_GET['key']; //获取密匙   
  121.     $user_login = $_GET['login']; //获取用户名   
  122.     $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));   
  123.     //通过key和用户名验证数据   
  124.        
  125.     $user_login = $user_data->user_login;   
  126.     $user_email = $user_data->user_email;   
  127.     if(!emptyempty($reset_key) && !emptyempty($user_data)) {   
  128.         $new_password = wp_generate_password(7, false); //生成7位随机密码   
  129.         //echo $new_password; exit();   
  130.         wp_set_password( $new_password, $user_data->ID ); //重置密码   
  131.         //通过邮件将密码发送给用户   
  132.         $message = __('账户的新密码为:') . "\r\n\r\n";   
  133.         $message .= get_option('siteurl') . "\r\n\r\n";   
  134.         $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  135.         $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";   
  136.         $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";   
  137.         if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  138.             echo "<div class='error'>邮件发送失败-原因未知</div>";   
  139.             exit();   
  140.         } else {   
  141.             $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)   
  142.             wp_safe_redirect($redirect_to);   
  143.             exit();   
  144.         }   
  145.                
  146.     } else{   
  147.         exit('无效的key.');   
  148.     }   
  149. }  
  150. if(isset($_GET['action']) && $_GET['action'] == "reset_success") { //如果动作为reset_success就是成功了哇   
  151.     exit('<span class="success">密码重置成功,已经通过邮件发送给您,请查收。</span>');   
  152. }   

第七步:重置密码

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

  1. <?php   
  2. /*
  3. Template Name: 找回密码模板  
  4. */  
  5. ?>  
  6. <?php   
  7. global $wpdb, $user_ID;   
  8. wp_enqueue_script( 'jquery' ); //加载jquery,如果你的主题头部已经引入,请删掉   
  9.   
  10. if (!$user_ID) { //判断用户是否已经登陆   
  11.    //接下来的代码应该添加在这里
  12.   
  13. } else {   
  14.     wp_redirect( home_url() ); exit;   
  15.     //重定向到首页   
  16. }   
  17. ?>  
  18. get_header(); ?>   
  19. <script src="http://code.jquery.com/jquery-1.4.4.js"></script><!--载入js-->   
  20. <div id="content" role="main">   
  21.     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>   
  22.        
  23.         <form class="user_form" id="wp_pass_reset" action="" method="post">   
  24.         <input type="text" class="text" name="user_input" value="" /><br />   
  25.         <input type="hidden" name="action" value="tg_pwd_reset" />   
  26.         <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />   
  27.         <!--wp_create_nonce函数创建随机数,用于安全验证-->   
  28.         <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />   
  29.         </form>   
  30.         <div id="result"></div> <!-- To hold validation results -->   
  31.         <script type="text/javascript">   
  32.         $("#wp_pass_reset").submit(function() {    
  33.             $('#result').html('<span class="loading">Validating...</span>').fadeIn();   
  34.             var input_data = $('#wp_pass_reset').serialize();   
  35.             $.ajax({   
  36.                 type: "POST",   
  37.                 url:  "<?php echo get_permalink( $post->ID ); ?>",   
  38.                 data: input_data,   
  39.                 success: function(msg){   
  40.                     $('.loading').remove();   
  41.                     $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');   
  42.                 }   
  43.             });   
  44.             return false;   
  45.         });   
  46.         </script>   
  47.     <?php endwhile; else : ?>   
  48.     <h2><?php _e('没有找到'); ?></h1>          
  49.     <?php endif; ?>   
  50. </div><!-- content -->   
  51. <?php get_footer();  
  52. function tg_validate_url() {   
  53.     global $post;   
  54.     $page_url = esc_url(get_permalink( $post->ID )); //获取本页面的链接地址   
  55.     $urlget = strpos($page_url, "?");   
  56.     if ($urlget === false) {   
  57.         $concate = "?";   
  58.     } else {   
  59.         $concate = "&";   
  60.     }   
  61.     return $page_url.$concate; //返回一个类似example.com/?     example.com/?p=123&   这样的url
  62. }  
  63. if($_POST['action'] == "tg_pwd_reset"){ //判断是否为请求重置密码   
  64.     if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { //检查随机数   
  65.         exit("不要开玩笑");   
  66.     }   
  67.     if(emptyempty($_POST['user_input'])) {   
  68.         echo "<div class='error'>请输入用户名或E-mail地址</div>";   
  69.         exit();   
  70.     }   
  71.        
  72.     //过滤提交的数据   
  73.     $user_input = $wpdb->escape(trim($_POST['user_input']));   
  74.        
  75.     if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名   
  76.         $user_data = get_user_by_email($user_input); //通过Email获取用户数据   
  77.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  78.             echo "<div class='error'>无效的E-mail地址!</div>";   
  79.             exit();   
  80.         }   
  81.     } else {   
  82.         $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据   
  83.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  84.             echo "<div class='error'>无效的用户名!</div>";   
  85.             exit();   
  86.         }   
  87.     }   
  88.        
  89.     $user_login = $user_data->user_login;   
  90.     $user_email = $user_data->user_email;   
  91.        
  92.     $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙   
  93.     if(emptyempty($key)) { //如果为空   
  94.         //generate reset keys生成 keys   
  95.         $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙   
  96.         $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库   
  97.     }   
  98.        
  99.     //邮件内容   
  100.     $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";   
  101.     $message .= get_option('siteurl') . "\r\n\r\n";   
  102.     $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  103.     $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";   
  104.     $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";   
  105.     $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数   
  106.        
  107.     if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  108.         echo "<div class='error'>邮件发送失败-原因未知。</div>";   
  109.         exit();   
  110.     } else {   
  111.         echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";   
  112.         exit();   
  113.     }   
  114. } else {   
  115.        
  116.     //输出表单--第四步中的代码应该包涵在这个对大括号内   
  117.   
  118. }  
  119. if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { //如果存在key且action参数似乎reset_pwd   
  120.     $reset_key = $_GET['key']; //获取密匙   
  121.     $user_login = $_GET['login']; //获取用户名   
  122.     $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));   
  123.     //通过key和用户名验证数据   
  124.        
  125.     $user_login = $user_data->user_login;   
  126.     $user_email = $user_data->user_email;   
  127.     if(!emptyempty($reset_key) && !emptyempty($user_data)) {   
  128.         $new_password = wp_generate_password(7, false); //生成7位随机密码   
  129.         //echo $new_password; exit();   
  130.         wp_set_password( $new_password, $user_data->ID ); //重置密码   
  131.         //通过邮件将密码发送给用户   
  132.         $message = __('账户的新密码为:') . "\r\n\r\n";   
  133.         $message .= get_option('siteurl') . "\r\n\r\n";   
  134.         $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  135.         $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";   
  136.         $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";   
  137.         if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  138.             echo "<div class='error'>邮件发送失败-原因未知</div>";   
  139.             exit();   
  140.         } else {   
  141.             $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)   
  142.             wp_safe_redirect($redirect_to);   
  143.             exit();   
  144.         }   
  145.                
  146.     } else{   
  147.         exit('无效的key.');   
  148.     }   
  149. }  
  150. if(isset($_GET['action']) && $_GET['action'] == "reset_success") { //如果动作为reset_success就是成功了哇   
  151.     exit('<span class="success">密码重置成功,已经通过邮件发送给您,请查收。</span>');   
  152. }   

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

  1. <?php   
  2. /*
  3. Template Name: 找回密码模板  
  4. */  
  5. ?>  
  6. <?php   
  7. global $wpdb, $user_ID;   
  8. wp_enqueue_script( 'jquery' ); //加载jquery,如果你的主题头部已经引入,请删掉   
  9.   
  10. if (!$user_ID) { //判断用户是否已经登陆   
  11.    //接下来的代码应该添加在这里
  12.   
  13. } else {   
  14.     wp_redirect( home_url() ); exit;   
  15.     //重定向到首页   
  16. }   
  17. ?>  
  18. get_header(); ?>   
  19. <script src="http://code.jquery.com/jquery-1.4.4.js"></script><!--载入js-->   
  20. <div id="content" role="main">   
  21.     <?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>   
  22.        
  23.         <form class="user_form" id="wp_pass_reset" action="" method="post">   
  24.         <input type="text" class="text" name="user_input" value="" /><br />   
  25.         <input type="hidden" name="action" value="tg_pwd_reset" />   
  26.         <input type="hidden" name="tg_pwd_nonce" value="<?php echo wp_create_nonce("tg_pwd_nonce"); ?>" />   
  27.         <!--wp_create_nonce函数创建随机数,用于安全验证-->   
  28.         <input type="submit" id="submitbtn" class="reset_password" name="submit" value="Reset Password" />   
  29.         </form>   
  30.         <div id="result"></div> <!-- To hold validation results -->   
  31.         <script type="text/javascript">   
  32.         $("#wp_pass_reset").submit(function() {    
  33.             $('#result').html('<span class="loading">Validating...</span>').fadeIn();   
  34.             var input_data = $('#wp_pass_reset').serialize();   
  35.             $.ajax({   
  36.                 type: "POST",   
  37.                 url:  "<?php echo get_permalink( $post->ID ); ?>",   
  38.                 data: input_data,   
  39.                 success: function(msg){   
  40.                     $('.loading').remove();   
  41.                     $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');   
  42.                 }   
  43.             });   
  44.             return false;   
  45.         });   
  46.         </script>   
  47.     <?php endwhile; else : ?>   
  48.     <h2><?php _e('没有找到'); ?></h1>          
  49.     <?php endif; ?>   
  50. </div><!-- content -->   
  51. <?php get_footer();  
  52. function tg_validate_url() {   
  53.     global $post;   
  54.     $page_url = esc_url(get_permalink( $post->ID )); //获取本页面的链接地址   
  55.     $urlget = strpos($page_url, "?");   
  56.     if ($urlget === false) {   
  57.         $concate = "?";   
  58.     } else {   
  59.         $concate = "&";   
  60.     }   
  61.     return $page_url.$concate; //返回一个类似example.com/?     example.com/?p=123&   这样的url
  62. }  
  63. if($_POST['action'] == "tg_pwd_reset"){ //判断是否为请求重置密码   
  64.     if ( !wp_verify_nonce( $_POST['tg_pwd_nonce'], "tg_pwd_nonce")) { //检查随机数   
  65.         exit("不要开玩笑");   
  66.     }   
  67.     if(emptyempty($_POST['user_input'])) {   
  68.         echo "<div class='error'>请输入用户名或E-mail地址</div>";   
  69.         exit();   
  70.     }   
  71.        
  72.     //过滤提交的数据   
  73.     $user_input = $wpdb->escape(trim($_POST['user_input']));   
  74.        
  75.     if ( strpos($user_input, '@') ) { //判断用户提交的是邮件还是用户名   
  76.         $user_data = get_user_by_email($user_input); //通过Email获取用户数据   
  77.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  78.             echo "<div class='error'>无效的E-mail地址!</div>";   
  79.             exit();   
  80.         }   
  81.     } else {   
  82.         $user_data = get_userdatabylogin($user_input); //通过用户名获取用户数据   
  83.         if(emptyempty($user_data) || $user_data->caps[administrator] == 1) { //排除管理员   
  84.             echo "<div class='error'>无效的用户名!</div>";   
  85.             exit();   
  86.         }   
  87.     }   
  88.        
  89.     $user_login = $user_data->user_login;   
  90.     $user_email = $user_data->user_email;   
  91.        
  92.     $key = $wpdb->get_var($wpdb->prepare("SELECT user_activation_key FROM $wpdb->users WHERE user_login = %s", $user_login)); //从数据库中获取密匙   
  93.     if(emptyempty($key)) { //如果为空   
  94.         //generate reset keys生成 keys   
  95.         $key = wp_generate_password(20, false); //生成一个20位随机密码用做密匙   
  96.         $wpdb->update($wpdb->users, array('user_activation_key' => $key), array('user_login' => $user_login)); //更新到数据库   
  97.     }   
  98.        
  99.     //邮件内容   
  100.     $message = __('有人提交了重置下面账户密码的请求:') . "\r\n\r\n";   
  101.     $message .= get_option('siteurl') . "\r\n\r\n";   
  102.     $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  103.     $message .= __('如果不是您本人操作,请忽略这个邮件即可.') . "\r\n\r\n";   
  104.     $message .= __('如果需要重置密码,请访问下面的链接:') . "\r\n\r\n";   
  105.     $message .= tg_validate_url() . "action=reset_pwd&key=$key&login=" . rawurlencode($user_login) . "\r\n"; //注意tg_validate_url(),注意密码重置的链接地址,需要action\key\login三个参数   
  106.        
  107.     if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  108.         echo "<div class='error'>邮件发送失败-原因未知。</div>";   
  109.         exit();   
  110.     } else {   
  111.         echo "<div class='success'>我们已经在给你发送的邮件中说明了重置密码的各项事宜,请注意查收。</div>";   
  112.         exit();   
  113.     }   
  114. } else {   
  115.        
  116.     //输出表单--第四步中的代码应该包涵在这个对大括号内   
  117.   
  118. }  
  119. if(isset($_GET['key']) && $_GET['action'] == "reset_pwd") { //如果存在key且action参数似乎reset_pwd   
  120.     $reset_key = $_GET['key']; //获取密匙   
  121.     $user_login = $_GET['login']; //获取用户名   
  122.     $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));   
  123.     //通过key和用户名验证数据   
  124.        
  125.     $user_login = $user_data->user_login;   
  126.     $user_email = $user_data->user_email;   
  127.     if(!emptyempty($reset_key) && !emptyempty($user_data)) {   
  128.         $new_password = wp_generate_password(7, false); //生成7位随机密码   
  129.         //echo $new_password; exit();   
  130.         wp_set_password( $new_password, $user_data->ID ); //重置密码   
  131.         //通过邮件将密码发送给用户   
  132.         $message = __('账户的新密码为:') . "\r\n\r\n";   
  133.         $message .= get_option('siteurl') . "\r\n\r\n";   
  134.         $message .= sprintf(__('用户名: %s'), $user_login) . "\r\n\r\n";   
  135.         $message .= sprintf(__('密码: %s'), $new_password) . "\r\n\r\n";   
  136.         $message .= __('你可以使用你的新密码通过下面的链接登录: ') . get_option('siteurl')."/login" . "\r\n\r\n";   
  137.         if ( $message && !wp_mail($user_email, '密码重置请求', $message) ) {   
  138.             echo "<div class='error'>邮件发送失败-原因未知</div>";   
  139.             exit();   
  140.         } else {   
  141.             $redirect_to = tg_validate_url()."action=reset_success";//跳转到登陆成功页面(还是本页面地址)   
  142.             wp_safe_redirect($redirect_to);   
  143.             exit();   
  144.         }   
  145.                
  146.     } else{   
  147.         exit('无效的key.');   
  148.     }   
  149. }  
  150. if(isset($_GET['action']) && $_GET['action'] == "reset_success") { //如果动作为reset_success就是成功了哇   
  151.     exit('<span class="success">密码重置成功,已经通过邮件发送给您,请查收。</span>');   
  152. }   

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

懒人下载-页面模板文件

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