wordpress添加前台会员找回密码页面功能

对于开放会员注册的wordpress站点来说,添加网站会员前台操作功能非常有必要,以前博客吧分别分享了会员前台注册教程《wordpress前台会员注册功能表单调用》和会员前台登陆教程《实现wordpress前台输入用户名密码登陆表单》,现在再分享会员前台找回密码教程。

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

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

操作步骤:

1、创建一个php文件,命名为page-passreset.php,添加以下代码:

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

2、在后台——页面中创建新页面,页面属性的“模板”中选择“找回密码”:

wordpress添加前台会员找回密码页面功能

然后发布页面即可。

注意:发送密码重置邮件需要网站服务器开启mail函数!

网友留言:

  1. 2016-11-25回复

    非常感谢!全网找了好久啊,终于找到了!

发表留言