2014-01-14 91 views
8

我開發了一個使用PHP和MySQL的網站,它已經有一個登錄和註冊表單。 (myweb.com也使WordPress的網站登錄工作

我在這個網址myweb.com/blog

我想在WordPress和強迫用戶停用登錄和註冊頁面使用雷添加WordPress的吧。基本上將我的登錄與WordPress集成,以便用戶將登錄到這兩個網站。我的網站表看起來像這樣。而所有註冊用戶都存儲在這裏。而在我的數據庫密碼使用md5()

id | name | email | password 

散列和WordPress的結構是這樣的,目前是空

ID | user_login | user_pass | user_nicename | user_email | user_url | user_registered | user_activation_key | user_status | display_name 

我嘗試以下步驟mentioned here

,但我得到的線這個錯誤254 var_dump($user);

object(WP_Error)#620 (2) { 
    ["errors"]=> 
    array(1) { 
    ["invalid_username"]=> 
    array(1) { 
     [0]=> 
     string(166) "<strong>ERROR</strong>: Invalid username. <a href="http://localhost/dev/blog/wp-login.php?action=lostpassword" title="Password Lost and Found">Lost your password</a>?" 
    } 
    } 
    ["error_data"]=> 
    array(0) { 
    } 
} 

也,所有的用戶信息都存儲在我的網站的members表中,而不是在WordPress的數據庫中。

這是我的網站的登錄代碼,我最近也爲它添加了WordPress登錄。

/* 
* Login 
* 
* $email = email of user 
* $pass = user password (must already be in md5 form) 
* $url = url of page they are login from 
*/ 
function login($email = '', $pass = '', $url = '', $sticky = false) 
{ 
     global $lang, $_db, $mod, $template_style; 

     // Replace nasty things to stop sql injection 
     $email = addslashes(strtolower($email)); 
     $email = strip_tags($email); 
     $email = htmlspecialchars($email, ENT_QUOTES); 

     //get user id 
    $sql = "SELECT `id`, `name`, `username` 
       FROM `members` 
       WHERE `email`='".mysql_real_escape_string($email)."' 
       AND `pass` = '" . mysql_real_escape_string($pass) . "' 
       LIMIT 0,1"; 

     $q = $_db->query($sql); 
     list($uid, $name, $username) = $_db->fetch_array($q); 

     $login_check = $_db->num_rows($q); 

     if ($login_check <= '0') //check if login matches 
     { 
        echo '0'; //login failed 
        die; 
     } 

     /* 
     * wordpress login 
     * 
     * read: 
     * http://codex.wordpress.org/Function_Reference/wp_update_user 
     */ 
     $credentials = array(); 
     $credentials['user_email'] = $email; 
     $credentials['user_password'] = $pass; 
     $credentials['remember'] = $sticky; // true/false 
     $secure_cookie = false; // true/false 

     $user = wp_authenticate($credentials['user_email'], $credentials['user_password']); 

    if (is_wp_error($user)) { 
     if ($user->get_error_codes() == array('empty_email', 'empty_password')) { 
      //$user = new WP_Error('', ''); 
      $user = wp_update_user(array ('user_login' => $name, 'user_email' => $email, 'user_pass' => $pass)); 
     } 
    } 

     var_dump($user); 

     wp_set_auth_cookie($user->ID, $credentials['remember'], $secure_cookie); 
     do_action('wp_login', $user->user_login, $user); 

     /* 
      set login cookies 
     */ 
     set_login_cookie($uid, $pass, $sticky); 

     //lock check 
     lock_checker($uid); 

     update_thisuser_online();   
} 

我必須一切從我members表將其複製並填充到wp_users或者是有沒有辦法登錄到WordPress,而無需在2個不同的表中的重複數據?我不想在兩個網站上都有2個登錄和2個註冊表單。

爲什麼我的代碼中不會有wp_authenticate()驗證?

回答

0

嘗試更改您的wp-config.php文件中的選項以指向您的members數據庫;用MySQL創建一個單獨的用戶/密碼並授予其成員數據庫權限可能是一個好主意。您可以使用該文件設置/更改許多有用的選項。我建議你閱讀documentation以獲得更深入的內容。如果您決定嘗試上述方法,請確保也要更改$table-prefix行以匹配您的現有數據庫。

此外,請參閱this博客文章是否有幫助,因爲它直接處理外部認證。有一個PHP腳本可供您複製/粘貼或以其他方式適應您的特定需求。請特別注意include_once("../wp-config.php");include_once("../wp-includes/class-phpass.php");這幾行。

+0

權限已經設置在兩個數據庫中,並且可以讀取和寫入我的站點數據庫和wordpress數據庫。只是從我的網站登錄到wordpress不起作用 – user2636556

+0

你看過那篇博客文章我鏈接,第一個評論 - 關於密碼哈希? '$ wp_hasher =新PasswordHash(8,TRUE);' '$ password_hashed = $行[ 'user_pass'];' 這是關於用戶通WordPress的手冊: >記住,user_pass應該是純文本密碼,因爲它會被WordPress自動散列。 但是,據我所知,這是通過'wp-includes/class-phpass.php'腳本完成的。 –

+0

無論密碼的複雜程度如何,WordPress現在都默認使用PasswordHash類來哈希密碼。 較新版本的WordPress(自版本2.5開始)不再使用MD5,除非作爲最後的手段,如果一系列更安全的哈希協議不可用。 PasswordHash首先處理嘗試最安全的方法,然後嘗試下一個最安全的方法(如果第一個方法對主機服務器不可用),等等。 –

4

可以設置WordPress的登錄通過編輯config.php文件並添加以下兩行使用自定義表:

define('CUSTOM_USER_TABLE','new_user_table'); //login, pass, email etc 
define('CUSTOM_USER_META_TABLE', 'new_usermeta_table'); //optional bio, don't have to include this line 

哪裏new_user_table是您的網站的桌子和new_usermeta_table是您的網站的生物表(如果您想要一個)

自定義表格需要與正常的wordpress表格具有相同的結構。所以,爲了使這個工作與你現有的網站的表,你必須添加一些字段,並確保密碼散列相同的方式。

Here is how to structure the user table

Here is how to structure the user meta table

要在註冊正確散列的口令,包括文件WP-包括/ pluggable.php和使用函數
<?php $hash = wp_hash_password($password) ?>

對於未散列現有密碼正確的,你必須設置一個電子郵件密碼重置。

或者。如果你想保留你當前的密碼哈希值(不是出於安全原因而推薦的,但可行),你可以改變wordpress哈希函數。在WP-包括/ pluggable.php變化:

if (!function_exists('wp_hash_password')){ 
    function wp_hash_password($password) { 
       //apply your own hashing structure here 
      return $password; 
    } 
} 

而變化:

if (!function_exists('wp_check_password')){ 
    function wp_check_password($password, $hash, $user_id = '') { 
      //check for your hash match 
      return apply_filters('check_password', $check, $password, $hash, $user_id); 
      } 
} 

有關wp_check_password細節Go Here

或者

您可以跳過周圍搞亂你的自定義用戶表,並讓wordpress登錄適用於您網站的其他部分。要做到這一點,簡單的使用下面的代碼:

<?php 
include 'wp-config.php'; 
if (is_user_logged_in()) { 
    echo 'Welcome, registered user!'; 
} else { 
    header('Location: http://google.com') ; 
}; 
?> 

確保「的wp-config.php文件」是對文件的完整相對路徑,然後將在每個頁面的代碼在您的非WordPress站點。將回顯替換爲登錄用戶要顯示的任何內容,並將標題替換爲客人顯示的內容。如果內容是簡單的HTML你可以做到以下幾點:

<?php 
include 'wp-config.php'; 
if (is_user_logged_in()) { 
?> 

<html> 
<head></head> 
<body><p>Welcome Registered user</p></body> 
</html> 

<?php 
} else { 
?> 

<html> 
<head></head> 
<body><p>Please log in</p></body> 
</html> 

<?php 
}; 
?> 
0

我已經設法通過使用Wordpress API中的函數來做到這一點。

wp_set_auth_cookie($wordpress_user_id, $remember, false); 

$wordpress_user_id是Wordpress表中用戶的ID。

$remember是一個布爾變量,指示Wordpress是否應該在會話之間創建「記住」用戶的持久cookie。

我不記得第三個,但你可以很容易地Google。


P.S.要使wp_set_auth_cookie功能可用,您需要在使用之前包含/需要一些Wordpress文件。嘗試使用wp-load.php文件。

+0

所以我必須將我的會員表複製到wordpress中? – user2636556

+0

@ user2636556我不確定哪種情況最適合您的情況。我的解決方案將Wordpress博客/網站和其他網站視爲兩個完全分開的東西。但你可以讓用戶覺得它們是一個整體。你可能會註冊和評論類似的東西。 –