我试图建立一个简单的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'发送之前)
所以当我重定向到新的页面时,我传递了两个参数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必须是有效的等等如果一切正常,然后你可以把他重定向到主页
希望这对你的问题有帮助