我正在进行一个多步骤的注册过程,现在我遇到了一个问题。我试图实现的是让第一个电话发送用户注册所需的信息,以便创建他并让他登录,然后在第二步要求他更新之前随机生成的密码。所有操作都是使用AJAX和Wordpress REST API完成的,因此不需要重新加载页面。我观察到的是,我的第一步是正确地生成一个用户并使用以下代码记录他:
$password = wp_generate_password();
$userdata = array(
\'user_login\' => $email,
\'user_email\' => $email,
\'user_pass\' => $password,
\'display_name\' => $firstname . \' \' . $name,
\'first_name\' => $firstname,
\'last_name\' => $name,
\'role\' => \'subscriber\',
\'user_registered\' => (new \\DateTime())->format(\'Y-m-d H:i:s\')
);
$user_id = wp_insert_user( $userdata ) ;
// Autologin after registration
wp_set_current_user($user_id);
if (wp_validate_auth_cookie()==FALSE)
{
wp_set_auth_cookie($user_id, true, false);
}
但是打电话
wp_get_current_user
或
global $current_user
在更新生成密码的附加步骤期间,仅检索0。代码:
$response = null;
$current_user = wp_get_current_user();
var_dump( $current_user );
退货:
object(WP_User)#3217 (7) {
["data"]=>
object(stdClass)#3218 (0) {
}
["ID"]=>
int(0)
["caps"]=>
array(0) {
}
["cap_key"]=>
NULL
["roles"]=>
array(0) {
}
["allcaps"]=>
array(0) {
}
["filter"]=>
NULL
}
你知道为什么吗?这是正常行为吗?作为参考,我使用cookie身份验证,因为调用我的用户API的Javascript代码嵌入到我的自定义主题中。
提前感谢,
最合适的回答,由SO网友:Balessan 整理而成
在对超级复制程序Wordpress的核心功能进行了一整天的挖掘和调试之后,我意识到主要的问题是,用于创建和验证nonce的会话令牌是不等价的。我尝试了不同的方法,结果打电话给wp_set_auth_cookie
方法指定“logged\\u in”cookie目标。
然后,我想到了这个话题:Extend Wordpress (4.x) session and nonce 这家伙似乎有着和我一样的问题。
我试了一下,在课堂上加入了以下动作:
/**
* login_force_update_cookie - Specific action for force overriding the logged_in_cookie
* when being in the AJAX registration context
*
* @param {type} $logged_in_cookie description
* @return {type} description
*/
public function login_force_update_cookie( $logged_in_cookie ) {
if ( strstr( $_SERVER[\'REQUEST_URI\'], \'toto/user/register\' ) ) {
$_COOKIE[LOGGED_IN_COOKIE] = $logged_in_cookie;
}
}
修改一点我的代码,如下所示:
wp_set_current_user($user_id);
if ( wp_validate_auth_cookie( \'\', \'logged_in\' ) != $user_id )
{
wp_set_auth_cookie( $user_id );
}
// Storing the regitration event for the user
$this->saveLoginEvent( $user_id );
$data = array(
\'user_id\' => $user_id,
\'nonce\' => wp_create_nonce( \'wp_rest\' ),
\'message\' => \'user_created\'
);
$response = rest_ensure_response( $data );
这似乎解决了主要问题,即第一个AJAX响应中生成的nonce与第二个AJAX响应中验证的nonce之间的不一致性。的问题
wp_get_current_user
返回0的原因是,当nonce不正常时,wordpress默认将用户设置为0。
这是一个相当棘手的问题,我学到了很多!
感谢您的关注,