生活随笔
收集整理的這篇文章主要介紹了
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重寫,請讀者參考前面的文章自行修改),還有由于作者是在自己的電腦上測試,所以并不能百分百確定代碼可用。
第一步:創建模板文件
首先在twenty ten主題中創建模板文件:page-passreset.php.
第二步:給模板文件命名
在文件開頭添加代碼
<?php/*Template?Name:?找回密碼模板*/?>
第三步:判斷用戶是否已經登陸
<?phpglobal?$wpdb,?$user_ID;wp_enqueue_script(?'jquery'?);?//加載jquery,如果你的主題頭部已經引入,請刪掉?if?(!$user_ID)?{?//判斷用戶是否已經登陸? ?//接下來的代碼應該添加在這里?}?else?{????wp_redirect(?home_url()?);?exit;????//重定向到首頁}?>
第四步:找回密碼表單
get_header();??><script?src="http://code.jquery.com/jquery-1.4.4.js"></script><!--載入js--><div?id="content"?role="main">????<?php?if?(?have_posts()?)?:?while?(?have_posts()?)?:?the_post();??>?????????<form?class="user_form"?id="wp_pass_reset"?action=""?method="post">????????<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="reset_password"?name="submit"?value="Reset?Password"?/>????????</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;??></div><!--?content?--><?php?get_footer();
第五步:“重置”頁面鏈接
這里說的重置,是在需要輸出當前頁面鏈接地址(比如重置密碼的郵件中),需要根據當前頁面的url形式重置出一個可用的url來。你可以將下面的函數添加在頁面頂部global變量的后面,也可以放在引入js的后面
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;?//返回一個類似example.com/? ? ? example.com/?p=123&?? 這樣的url}
第六步:請求重置密碼
文章最開始說到,本篇教程中需要區分兩個“動作”,一個是請求重置代碼(輸入郵箱或用戶名),其次是重置密碼(用戶通過郵箱中的鏈接地址來的),下面的代碼需要判斷用戶是否提交了數據,所以請注意代碼中最后面的提示,將第四步中的代碼包含在那一對大括號中。
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(emptyempty($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?{?????//輸出表單--第四步中的代碼應該包涵在這個對大括號內?}
第七步:重置密碼
如果用戶是通過重置密碼鏈接訪問本頁面,那么url中會有action\key\login三個參數,通過action參數來獲取當前動作。
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.');????}}
第八步:重置密碼成功
在上一步的代碼中,重置密碼成功則重定向到一個重置密碼成功的頁面,其實還是本頁面,只不多action參數不一樣:
if(isset($_GET['action'])?&&?$_GET['action']?==?"reset_success")?{?//如果動作為reset_success就是成功了哇????exit('<span?class="success">密碼重置成功,已經通過郵件發送給您,請查收。</span>');}
到此,代碼已經完成。
下面是懶人下載
懶人下載-頁面模板文件
如果你想通過url重寫來實現本頁面,請注意更改相應的“重置url函數”,以及一些涉及到Url的地方。
總結
以上是生活随笔為你收集整理的wordpress进阶教程(十九):创建自定义的找回密码页面的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。