Site icon Hip-Hop Website Design and Development

Mirgrating a user at signon

I am migrating a wordpress site to another site. The users from the old site need to work with the new site. I am doing a staggered implementation, so do not want to bring all the users over at once.

Basically, when a user attempts to sign in, before the login is authenticated, if the user does not exist on the new site, I am using an api call to grab the user details from the old site, and create the user on the new site.

I am using the wp_authenticate action to do the checks before the user is authenticated.
This works, the user is created, and then the authentication should be done. The authentication fails though. If I then try to login again, it works, so I know the credentials are OK and all of the data has been written correctly.

It feels like during the same trip on the server, I cannot create a user and login.

add_action( 'wp_authenticate' , [$this,"preAuthenticate"],10,1);

public function preAuthenticate($username) {
    try {
        if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
            throw new Exception("Not an email address - carry on");
        }
        
        $usr = get_user_by("email", $username);
        
        if ($usr) {
            throw new Exception("Already a user - carry on");                
        }
        
        $this->getExternalUser($username);
        
    } catch (Exception $ex) {
        // no need to do anything
    }
}

private function getExternalUser($emailAddress) {
    try {
        $oldUser = $this->readExternalUser($emailAddress); 
        
        if (!$oldUser)) {
            throw new Exception("No user found");
        }

        $userData = [
            'user_pass' => $this->randomPassword(), //This will be updated after the user has been created using the hash passed
            'user_login' => $oldUser->login,
            'user_nicename' => $oldUser->niceName,
            'user_email' => $emailAddress,               
            'role' => "subscriber"                
        ];
        
        $result = wp_insert_user($userData);
        $usr = get_user_by("ID", $result);    
        if (!$usr) {
            throw new Exception("user not created");
        }

        global $wpdb;
              
        $wpdb->update($wpdb->users, ["user_pass" => $oldUser->hash],['ID' => $usr->ID]);
        
        return true;

    } catch (Exception $ex) {
        return false;
    }
}