Search code examples
wordpresswordpress-rest-api

WordPress ajax successfully login but it's not set current user?


function ajax_signon () {
    check_ajax_referer('mbx-nonce', 'security');
    $user = wp_signon();
    if ( is_wp_error($user) ) {
        echo json_encode(array(
            'userId' => -1,
            'loggedIn' => false,
            'message' => __('Wrong username or password.')
        ));
    } else {
        wp_set_current_user($user->ID);
        wp_set_auth_cookie($user->ID);
        echo json_encode(array(
            'userId' => $user->ID,
            'loggedIn' => true,
            'message' => __('Login successful')
        ));
    }
    exit();
}
add_action('wp_ajax_nopriv_signon', 'ajax_signon');

I have two site first in react and second in WordPress. I'm trying to login with WordPress. but both domain are different.


Solution

  • 1st Set Proper login detail in your $user = wp_signon();

    Like This:

    //$_POST["user_email"] = 'admin';
    //$_POST["user_password"] = '123456';
    
    $user_login     = esc_attr($_POST["user_email"]);
    $user_password  = esc_attr($_POST["user_password"]);
    
    $creds = array();
    $creds['user_login'] = $user_login;
    $creds['user_password'] = $user_password;
    $creds['remember'] = true;
    
    $user = wp_signon( $creds, false );
    

    Then set/use wp_signon for login like this:

    $user_id = $user->ID;
    
    wp_set_current_user($user_id);
    wp_set_auth_cookie($user_id);
    

    Other Method(direct login without password):

    set user id like:

    $user_id = $_POST['user_id];
    

    Then

    wp_set_current_user($user_id);
    wp_set_auth_cookie($user_id);
    

    One more thing replace

    add_action('wp_ajax_nopriv_signon', 'ajax_signon');
    

    To

    add_action('wp_ajax_signon', 'ajax_signon');
    add_action('wp_ajax_nopriv_signon', 'ajax_signon');