2015-04-19 41 views
1

我正在嘗試創建訂閱者自動登錄的功能,並附加到網站URL上。我使用ACF將密鑰文本添加到用戶詳細信息頁面,密鑰存儲在_usermeta表中。我可以自動登錄。但是,當我訪問登錄頁面之外的頁面時,基於$ current_user對象的回顯,登錄名似乎更改爲我的登錄名。WP使用查詢字符串鍵自動登錄

爲了測試,我使用了一個註銷的Safari瀏覽器(我從不使用)。在查詢字符串中使用具有特殊鍵的URL登錄用戶,並在我回顯這些值時顯示正確的用戶名和ID。

查詢字符串看起來像:

http://website.com/?k=ABCD1234

這裏是我的代碼:

function auto_login() { 
 

 
\t $user_key = $_GET['k']; 
 

 
\t global $wpdb; 
 
\t $user_id = $wpdb->get_var(" SELECT user_id FROM wp_usermeta WHERE meta_value = '".$user_key."' "); 
 

 
\t wp_set_current_user($user_id); 
 
\t wp_set_auth_cookie($user_id); 
 

 
\t global $current_user; 
 
\t $user = ""; 
 
\t get_currentuserinfo(); 
 
\t $user = $current_user->user_login; 
 
\t //echo $user; 
 
} 
 
add_action('init', 'auto_login');

感覺就像cookie不會被置位(數據/狀態沒有跨頁面維護)。有什麼想法發生在這裏?謝謝!

+0

查看pluggable.php時,似乎可能與$ current_user發生衝突,因爲wp_set_current_user也會使用它。但是,當我將全局$ current_user行刪除到// echo $ user行時,我仍然得到相同的行爲:我可以使用包含查詢字符串k = value的URL回顯正確的用戶標識,但單擊第二頁開關即使我沒有登錄,我也刪除了與此域名相關的所有Cookie。 – FredHead

回答

2

請嘗試改用plugins_loaded操作。如果用戶已經登錄,功能wp_set_current_user也會失敗,因此您應該檢查該功能。如果沒有找到,$wpdb->get_var再次與驗證返回null。爲了安全起見,你應該逃避SQL,特別是在處理登錄時,這個語句可以很容易地被操縱。

function auto_login() { 
    if (is_user_logged_in()) 
     return; 

    $user_key = $_GET['k']; 

    global $wpdb; 
    $user_id = $wpdb->get_var($wpdb->prepare("SELECT user_id FROM wp_usermeta WHERE meta_value = %s", $user_key)); 

    if (isset($user_id)) { 
     wp_set_current_user($user_id); 
     wp_set_auth_cookie($user_id); 

     global $current_user; 
     $user = ""; 
     get_currentuserinfo(); 
     $user = $current_user->user_login; 
     //echo $user; 
    } 
} 

add_action('plugins_loaded', 'auto_login'); 
+0

是的,我沒有添加任何像登錄檢查,直到我的代碼工作。你肯定$ wpdb->準備是需要選擇查詢嗎?文檔只顯示更新和插入。 欣賞plugins_loaded動作的想法。但是,它不會回顯測試值。而且它沒有解決我登錄信息超出wp_set_current_user和wp_set_auth_cookie設置的問題。事實上,cookie功能似乎不起作用。但是,由於WP或Safari瀏覽器和Chrome瀏覽器中的某些內容,即使我註銷,退出瀏覽器也不清楚。 – FredHead

+1

再次感謝您的幫助。我能夠找到另一臺機器,並通過我的網絡瀏覽器證明我的計算機存在這個問題。欣賞plugins_loaded操作的想法以及一些包裝代碼,以便在調用代碼時進行優化。 – FredHead

0

如果有幫助,這裏是我想出的代碼。剩下的唯一問題是cookie方法似乎設置了瀏覽會話的時間限制,這對我來說不是問題。我將不得不調查如何延長cookie時間。否則,也許這個代碼是給別人做同樣的事情有用:

function auto_login() { 
 

 
\t if (is_user_logged_in()) { 
 
\t \t return; 
 
\t } else { 
 

 
\t \t if ($_GET['k']) { 
 

 
\t \t \t $user_key = $_GET['k']; 
 

 
\t \t \t global $wpdb; 
 
\t \t \t $sql = $wpdb->prepare(" SELECT user_id FROM wp_usermeta WHERE meta_value = %s ", $_GET['k']); 
 
\t \t \t $user_id = $wpdb->get_var($sql); 
 

 
\t \t \t if ($user_id) { 
 
\t \t \t \t wp_set_current_user($user_id); 
 
\t \t \t \t wp_set_auth_cookie($user_id); 
 
\t \t \t } else { 
 
\t \t \t \t //alert stripe div with message/email link 
 
\t \t \t } 
 

 
\t \t \t //only used for testing code above 
 
\t \t \t if ($_GET['k']) { 
 
\t \t \t \t echo $user_id; 
 
\t \t \t \t echo $sql; 
 
\t \t \t \t if (is_wp_error($user)) 
 
\t \t \t \t \t echo $user->get_error_message(); 
 
\t \t \t } 
 
\t \t } 
 

 
\t } 
 
} 
 
add_action('init', 'auto_login');

還要注意,每ub3rst4r上面,你可以使用之前的初始化動作plugins_loaded行動。最後,我使用ACF插件爲用戶創建一個文本字段,以存儲存儲在_usermeta表中的唯一用戶密鑰值。