PHP wordpress密码更改-登录我退出


php wordpress password change - logging me out!

我试图建立一个简单的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();
}

重置密码后,您必须设置/重置cookie (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,因为与其他应用程序/插件集成。

从另一篇文章链接到这里,并希望给出这个问题的最新解决方案,因为其中一些解决方案(特别是直接修改wpdb->query)不再是最佳实践了。

使用wp_set_password()更新用户的密码,然后使用wp_signon()重新登录用户。

按照其他用户的建议,

wp_signon将为您创建身份验证cookie,但是以一种更精简的方式。

function create_new_password_for_user($new_password){
    //Get the current user's details, while they're still signed in, in this scope.
     $current_user = wp_get_current_user();
     $current_user_id = $current_user->ID;
     $users_login = $current_user->user_email;
    //set their new password (this will trigger the logout)
    wp_set_password($new_password, $current_user_id);
    //setup the data to be passed on to wp_signon
    $user_data = array(
            'user_login'     => $users_login,
            'user_password'    => $new_password,
            'remember'        => false
        );
    // Sign them back in.
    $result = wp_signon( $user_data );
    if(is_wp_error($result)){
      //do something with an error, if there is one.
    }else{
      //do something with the successful change. 
    }
}

实际情况:

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))

试试下面的代码,它不会登录您更改密码后,它与Ajax工作太。此外,在此之后不需要重置cookie/session。

$userdata['ID'] = 1; //user ID
$userdata['user_pass'] = 'new_password';
wp_update_user( $userdata ); // this will handle encryption and everything

欢呼

确保代码在HTTP报头结束和常规页面内容开始之前运行。如果您无意中在页面生成过程中等待的时间过长,则可能得不到任何警告。这一切都只是无声地失败,你会神秘地注销(即使wp_signon()返回一个有效的WP_User对象)。

如果你还在寻找这个话题的答案:我找到了一个解决方案!

简而言之,更新密码后,清除数据并注销(和你一样)

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

用户已注销

然后

重定向到新页面以再次自动登录通过add_action( 'wp', 'auto_login' );捕获对该页面的调用(我们必须这样做,在任何东西通过'headers'发送之前)

然后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必须是有效的等等如果一切正常,然后你可以把他重定向到主页

希望这对你的问题有帮助