2011-04-18 73 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