I use form to send POST request to a page and to login user with wp_signon() in order to authenticate user to my wordpress installation as described in WP documentation:
$creds = array(); $creds['user_login'] = $_POST["user-login"]; $creds['user_password'] = $_POST["user-password"]; $creds['remember'] = true; $user = wp_signon( $creds, false );
After this little piece of code I’m checking if user was logged in:
if ( is_user_logged_in() ) { echo "SUCCESS"; } else { echo "FAIL!"; }
But I got FAIL! all the time. Then after sniffing around I found this little trick:
wp_set_current_user( $user );
if ( is_user_logged_in() ) { echo "SUCCESS"; } else { echo "FAIL!"; }
I’ve got SUCCESS on this one but when I leave this page I got FAIL again and again.
Can anyone explain me how to login user with wp_signon() without logging her out after page is changed or reloaded or whatever.
I’ve got desirable result when I go to /wp_admin and login with WP’s default login form. I can navigate through every page of my WP site remaining logged-in all the time. But when I try to do this outside the default form I FAIL.
Guide me! PLEASE!
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
finally this is working for me on my local WP installation after replacing – with _ from input attribute name and using full php start tags <?php instead of <? the final code is here copy and paste into your template.
<?php if ( isset($_POST["user_email"]) && isset($_POST["user_password"]) ) {
$user_login = esc_attr($_POST["user_email"]);
$user_password = esc_attr($_POST["user_password"]);
$user_email = esc_attr($_POST["user_email"]);
$user_data = array(
'user_login' => $user_login,
'user_pass' => $user_password,
'user_email' => $user_email,
'role' => 'student'
);
// Inserting new user to the db
//wp_insert_user( $user_data );
$creds = array();
$creds['user_login'] = $user_login;
$creds['user_password'] = $user_password;
$creds['remember'] = true;
$user = wp_signon( $creds, false );
$userID = $user->ID;
wp_set_current_user( $userID, $user_login );
wp_set_auth_cookie( $userID, true, false );
do_action( 'wp_login', $user_login );
}
if ( is_user_logged_in() ) : echo 'SUCCESS'; ?>
<h1>Html for logged in user </h1>
<?php else : echo 'FAIL!'; ?>
<form id="user-credentials" method="post" action="<?php the_permalink(); ?>">
<p><input name="user_email" type="text" placeholder="Email" /></p>
<p><input name="user_password" type="password" placeholder="Password" /></p>
<p><input type="submit" class="button blue size-s" value="Submit" /></p>
</form>
<?php endif; ?>
Method 2
If your password includes the # and/or @ characters, you need to urlencode before sending in the form, and then urldecode before setting the credentials in wp_signon.
The url encoding for @ is %40, # is %23 and ! is %21
if your password is [email protected]# then should be URL encoded before POSTING to mY%21p%40ssWord%23, then URL decoded before setting the credentials for wp_signon
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0