Published: 2019-08-21 12:07 |
Category: Code | Tags: code, custom function, php, user management, users, wordpress
I'm finishing up a website for a private project which allows for people to register and create posts as members. The client wanted to have a specific onboarding flow which moved users from account creation to a terms page before finishing on a brief site overview.
I started by hooking into registration_redirect and pushing the user to a simple terms page.
add_filter( 'registration_redirect', 'new_user_redirect' );
function new_user_redirect() {
return home_url('/complete-registration/');
}
This didn't work because the user was immediately redirected to the terms page instead of on their login. This meant my terms form (using Gravity Forms) couldn't collect the user_id field because it didn't actually exist yet.
To fix this, I hooked into the user_register action to capture the new user. There are several validation steps on the front and backend that I won't detail, but in the end, the user is written to the database and emailed a secure link to set their password. I created a new user meta key called is_first_login and set it to true. This was added when the user was written to the database.
update_user_meta( $user_id, 'is_first_login', true);
Now, I can check that key and send the user to the correct page when they log in.
add_action( 'login_redirect', 'redirect_user_on_login', 10, 3);
function redirect_user_on_login( $redirect, $request, $user ) {
if(get_user_meta($user->ID, 'is_first_login', true)) {
// Since it's the first login, set this to false
update_user_meta($user->ID, 'is_first_login', false);
// push to the terms page
return home_url('/complete-registration');
} else {
// Check the user role and redirect appropraitely
return (is_array($user->roles) && in_array('administrator', $user->roles)) ? admin_url() : site_url();
}
}
If it is a new user, they are shown the terms page. Accepting the terms allows for accountability. Gravity Forms handles the next redirect when the user submits the terms form.