本文翻譯自 http://www.tutorialstag.com/create-custom-WordPress-registration-page.html 謝謝 (有改動) 。

我相信大多數站長使用 WordPress 時不喜歡讓用户使用默認的註冊/登陸頁面來讓用户註冊或者登陸。大家都希望讓這個頁面看起來能配合站點的樣式。這一篇教程我們將創建一個自定義的註冊頁面。

原文使用的是自定義的頁面模板,我們在文章結尾將講述使用我們上一篇教程説到的自定義 url 重寫功能來添加這樣一個頁面。

第一步:創建文件。

我們還是以默認的 twenty ten 主題為例,在主題文件夾下面創建一個 custom-register.php 。

第二步:給頁面模板命名。
在 custom-register.php 的開頭添加下面代碼,提示:注意文件編碼哦

  1. <?php     
  2. /* 
  3. Template Name: 自定義註冊頁面模板  
  4. */     
  5. ?>  

第三步:檢查用户是否已經登錄

我們首先應該檢車用户是否已經登錄,如果登錄了,還註冊啥?所以只有未注登錄用户才能註冊。我們需要包含 WordPress 的 wp-includes 文件夾裏面的 registration.php 文件,以便我們創建一個新的用户。繼續添加以下代碼

  1. <?php   
  2. require_once(ABSPATH . WPINC . '/registration.php'); //寶航 registration.php 文件   
  3. global $wpdb$user_ID//glocal 全局變量   
  4. if (!$user_ID) { //如果存在 $user_ID 變量,則用户已經登錄   
  5.    //接下來的代碼都添加在這裏.     
  6. }else{   
  7.    wp_redirect( home_url() ); exit//如果已經登錄,重定向到站點首頁   
  8. }   
  9. ?>  

第四步:添加註冊表單和 ajax 代碼。

在我們顯示註冊表單之前,我們要先獲取後台設置選項的值:是否允許註冊,如果後台設置了不允許註冊,那就不顯示註冊表單。

雖然下面貼出了代碼,但是請先不要在文件中添加下面的代碼。

  1. //get_option('users_can_register') 獲取是否允許註冊   
  2. if(get_option('users_can_register')) {   
  3. ?>   
  4. <h1> 註冊</h1>   
  5. <div id="result"></div> <!-- 為 ajax 返回結果做準備 -->     
  6. <form id="wp_signup_form" action="" method="post"> <!--註冊表單-->   
  7. <label> 用户名</label>   
  8. <input type="text" name="username" class="text" value="" /><br />   
  9. <label>Email</label>   
  10. <input type="text" name="email" class="text" value="" /> <br />   
  11. <input type="submit" id="submitbtn" name="submit" value="註冊" />   
  12. </form>   
  13.   
  14. <script type="text/javascript">   
  15.     $("#submitbtn").click(function() {   
  16.         $('#result').html('<img src="<?php bloginfo('template_url'); ?>/images/loader.gif" class="loader" />').fadeIn();   
  17.         var input_data = $('#wp_signup_form').serialize();   
  18.         $.ajax({   
  19.             type: "POST",   
  20.             url:  "<?php echo "http://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI']; ?>",   
  21.             data: input_data,   
  22.             success: function(msg){   
  23.                 $('.loader').remove();   
  24.                 $('<div>').html(msg).appendTo('div#result').hide().fadeIn('slow');   
  25.             }   
  26.         });   
  27.         return false;   
  28.     });   
  29. </script>   
  30. <?php   
  31. }else{   
  32.     echo "對不起暫時不開放註冊,請以後再試.";   
  33. }  

第五步:驗證提交的數據,創建用户
第四步中的代碼中,我們通過 ajax 提交了數據,數據提交地址就是本頁面,所以我們在本頁面添加驗證數據代碼即可。
在第三步代碼的註釋位置添加以下代碼 (即 if (!$user_ID) {的後面):

  1. if($_POST){   
  2.     //驗證數據是否全部為空格   
  3.     $username = $wpdb->escape($_REQUEST['username']);   
  4.     if(empty($username)) {   
  5.         echo "用户名不能為空.";   
  6.         exit();   
  7.     }   
  8.     $email = $wpdb->escape($_REQUEST['email']);   
  9.     //驗證郵箱格式   
  10.     if( !is_email($email) ) {   
  11.         echo "請輸入有效的郵箱地址.";   
  12.         exit();   
  13.     }   
  14.        
  15.     //生成密碼   
  16.     $random_password = wp_generate_password( 12, false );   
  17.     //創建用户   
  18.     $status = wp_create_user( $username$random_password$email );     
  19.     if ( is_wp_error($status) ) {   
  20.        echo $status->get_error_message();//輸出錯誤信息  
  21.     }else{   
  22.         $from = get_option('admin_email');   
  23.         $headers = 'From: '.$from . "
    "
    ;   
  24.         $subject = "註冊成功";   
  25.         $msg = "註冊成功.
    你的登陸信息
    用户名: $username
    密碼: $random_password"
    ;   
  26.         //發送郵件   
  27.         wp_mail( $email$subject$msg$headers );   
  28.         echo "請檢查你電子郵件中的登陸信息。";   
  29.     }   
  30.        
  31.     exit();   
  32. }else{   
  33.     get_header(); //加載頭部問及愛你   
  34.     ?>   
  35.     <!-- <script src="http://code.jquery.com/jquery-1.4.4.js"></script> --> <!-- 如果你的主題沒有引入了 jquery,請自己引入 -->   
  36.     <div id="container">   
  37.     <div id="content">   
  38.     <?php   
  39.     //將註冊表單和 ajax 代碼添加到這裏   
  40.     ?>   
  41.     </div>   
  42.     </div>   
  43.     <?php   
  44.         get_footer(); //加載底部文件   
  45. }  

OK 到這裏自定義註冊頁面模板的代碼已經全部完成。

 

懶人下載 (本工作室編輯好的文件,該文件引入了 jquery,請自行更改)

 

請注意第五步,代碼中有一句引入 jquery 的,如果你的主題沒有引入,請手動加上。

添加完上面的代碼,在後台添加頁面,然後選擇對應的頁面模板即可,再添加自定義的 css,就可以創建一個完全自主的註冊頁面。

如果不通過添加頁面來實現,我們也可以通過上一篇教程中講的添加自定義 url 地址。

在主題的 functions.php 文件中添加以下代碼。 (詳解請參考上一篇教程)

  1. add_action('generate_rewrite_rules', 'ashu_rewrite_rules' );   
  2. /**********重寫規則************/  
  3. function ashu_rewrite_rules( $wp_rewrite ){   
  4.     $new_rules = array(   
  5.         'ashulogin/?$' => 'index.php?my_custom_page=ashu_login',   
  6.     ); //添加翻譯規則   
  7.     $wp_rewrite->rules = $new_rules + $wp_rewrite->rules;   
  8.     //php 數組相加   
  9. }   
  10.   
  11. /*******添加 query_var 變量***************/  
  12. add_action('query_vars', 'ashu_add_query_vars');   
  13. function ashu_add_query_vars($public_query_vars){     
  14.     $public_query_vars[] = 'my_custom_page';   
  15.        
  16.     return $public_query_vars;     
  17. }   
  18.   
  19.   
  20. //模板載入規則   
  21. add_action("template_redirect", 'ashu_template_redirect');   
  22. function ashu_template_redirect(){   
  23.     global $wp;   
  24.     global $wp_query$wp_rewrite;   
  25.        
  26.     //查詢 my_custom_page 變量   
  27.     $reditect_page =  $wp_query->query_vars['my_custom_page'];   
  28.     if ($reditect_page == "ashu_login"){ 
  29.         include(TEMPLATEPATH.'/registration.php');   
  30.         die();   
  31.     }   
  32. }   
  33.   
  34. /***************激活主題更新重寫規則***********************/  
  35. add_action( 'load-themes.php', 'frosty_flush_rewrite_rules' );   
  36. function frosty_flush_rewrite_rules() {   
  37.     global $pagenow$wp_rewrite;   
  38.     if ( 'themes.php' == $pagenow && isset( $_GET['activated'] ) )   
  39.         $wp_rewrite->flush_rules();   
  40. }