2011-04-18 71 views
3

我試圖建立一個我自己的簡單wordpress密碼更改腳本(當然,基於一個插件真的) - 密碼已成功更改 - 但它會在更改完成後將我註銷!以下是使用的代碼。任何人都可以看到我正在註銷的地方以及如何防止它?謝謝!php wordpress密碼更改 - 登出我!

$update = $wpdb->query($wpdb->prepare("UPDATE {$wpdb->users} SET `user_pass` = %s WHERE `ID` = %d",array(wp_hash_password($_POST['admin_pass1']),$user_ID))); 

if(!is_wp_error($update)) 
{ 
    wp_cache_delete($user_ID,'users'); 
    wp_cache_delete($user->user_login,'userlogins'); 
    wp_logout(); 
    if (wp_signon(array('user_login'=>$user->user_login,'user_password'=>$_POST['admin_pass1']),false)): 
     wp_redirect(admin_url()); 
    endif; 
    ob_start(); 
} 
+4

我會認爲'wp_logout();'有什麼關係呢哈哈,當然 – 2011-04-18 16:44:53

+0

,但它後點登錄功能應該把我直接回到我的儀表盤.. 。這是從自己工作得很好的插件... – Fearghal 2011-04-18 16:52:45

+0

事實上,即使刪除了該塊 - wordpress似乎仍然記錄我,我個人覺得奇怪...... – Fearghal 2011-04-18 17:10:41

回答

1

其實這個:

if(!is_wp_error($update)) 
{ 
    wp_cache_delete($user_ID,'users'); 
    wp_cache_delete($user->user_login,'userlogins'); 
    wp_logout(); 
    if (wp_signon(array('user_login'=>$user->user_login,'user_password'=>$_POST['admin_pass1']),false)): 
     wp_redirect(admin_url()); 
    endif; 
    ob_start(); 
} 

意味着,如果沒有錯誤以下功能將被執行。其中一個功能是wp_logout(),如果執行條件塊,將始終調用它。

如果這不是你想要的東西,那麼你要考慮更換:

if(!is_wp_error($update)) 

有:

if(is_wp_error($update)) 
+0

我甚至不使用WP和'wp_logout()'似乎很明顯。對我來說,我看到'如果沒有錯誤更新,然後做包括wp_logout()'的東西。事實上,該塊中沒有任何東西看起來是必要的,但正如我所說,我不使用WP – 2011-04-18 16:53:53

0

確保代碼是HTTP頭的結束和開始前運行常規頁面內容。如果您在頁面生成過程中無意中等待太久,您可能不會收到任何警告。它會全部失敗,你會被神祕地註銷(即使wp_signon()返回一個有效的WP_User對象)。

2

重置密碼後,必須設置/復位餅乾(http://codex.wordpress.org/Function_Reference/wp_set_auth_cookie
這樣

$update = $wpdb->query($wpdb->prepare("UPDATE {$wpdb->users} SET `user_pass` = %s WHERE `ID` = %d",array(wp_hash_password($_POST['admin_pass1']),$user_ID))); 

if(!is_wp_error($update)) 
{ 
    wp_cache_delete($user_ID,'users'); 
    wp_cache_delete($user->user_login,'userlogins'); 
    wp_logout(); 
    if (wp_signon(array('user_login'=>$user->user_login,'user_password'=>$_POST['admin_pass1']),false)): 
     wp_redirect(admin_url()); 
    endif; 
    ob_start(); 
}else{ 
    wp_set_auth_cookie($current_user_id, true); 
} 

要重設密碼,你最好使用WordPress的功能,如因與其他應用程序集成wp_check_password和wp_set_password /插件。

0

如果您仍然在尋找關於此主題的答案:,我找到了解決方案!

總之

,更新密碼後,清除數據並註銷 (像你一樣)

wp_cache_delete($user_ID,'users'); 
wp_cache_delete($user->user_login,'userlogins'); 
wp_logout(); 

用戶註銷現在

然後

做一個「重定向」到一個新的頁面再次自動登錄 通過add_action('wp', 'auto_login'); (通過'標題'發送任何內容之前,我們必須這樣做)來接聽此頁面的電話

auto_login函數然後可以處理您的請求來自動登錄給定的用戶。(通過$ _GET參數)

所以,當我重定向到新的頁面我通過兩個參數 USER_ID(用戶登錄) 密鑰(安全)

$key = password_hash('[some secret ]' . $user_id, PASSWORD_DEFAULT); 

     wp_redirect(get_permalink($to['fl_autologin']) . "/?p=" . urlencode($key) . "&z=" . $user_id); 
     exit; 

然後在AUTO_LOGIN功能我找這兩個參數 解密密鑰來檢查,如果這是奧凱

  if ($_GET['z'] && password_verify('[some secret]' . $_GET['z'], urldecode($_GET['p']))) { 

如果是這樣,那麼 登錄指定用戶

$user = get_user_by('id', $_GET['z']); 
      $user_id = $user->ID; 
wp_set_current_user($user_id, $user->user_login); 
      wp_set_auth_cookie($user_id); 

      do_action('wp_login', $user->user_login); 

做一些更多的安全檢查,在此, 像USER_ID必須是有效的等等 如果所有的OKE, 然後才能將他重定向到一個home_page再次

希望這可以幫助您的問題

1

你可以嘗試下面的代碼。更改密碼後它不會將您註銷。

$userdata['ID'] = 1; //admin user ID 
$userdata['user_pass'] = 'new_password'; 
wp_update_user($userdata); 

享受;)

+0

要小心,這會觸發一個'更改密碼電子郵件'發送出去,這可能是不可取的。 – 2017-03-24 08:31:33

+0

@WaltyYeung當然,將照顧這一點。但是,如果您是開發人員,並且您忘記了管理員密碼,並且您的電子郵件在本地服務器上無法正常工作,我認爲這會很有用。 – 2017-03-27 05:38:57