简体   繁体   中英

How to set is_user_logged_in() true in Wordpress

I am using wp_signon from inside a plugin and inside a shortcode function to login a user. To clarify, the short code is being called from a page content. The wp_signon function successfully returns the user info. But is_user_logged_in() is returning false . Why it's happening or how can I set is_user_logged_in() true so that user stays login?

            ob_start();
            $user_data = array();
            $user_data['user_login'] = $username;
            $user_data['user_password'] = $password;
            $user_data['remember'] = $remember;  
            $user = wp_signon( $user_data, false );
              ob_get_clean();
            if ( is_wp_error($user) ) {
                $err = $user->get_error_message();

            } else {


                $_SESSION['fc_user']=$user->ID;
                var_dump($user); // gives the user info
                var_dump(is_user_logged_in()); // gives false

            }

The function wp_signon

sends headers to the page. It must be run before any content is returned.

So running it inside a shortcode (like you specified in your comment) is too late: headers have already been sent.

In order to achieve what you want you should divide your code in two parts, to be run at different time, something like this:

add_action( 'after_setup_theme', function() {

    // run this only on the page you want
    if( !is_page('the_page_you_want') )
        return;

    $user_data = array();
    $user_data['user_login'] = $username;
    $user_data['user_password'] = $password;
    $user_data['remember'] = $remember;  
    $user = wp_signon( $user_data, false );
    if ( is_wp_error($user) ) {
        $GLOBALS['user_error_message'] = $user->get_error_message();
    } else {
        $_SESSION['fc_user'] = $user->ID;
    }

} );


add_shortcode( 'your_shortcode', function( $atts ) {

    if( is_user_logged_in() ) {
        // get user info
        return print_r( get_userdata(get_current_user_id()), 1 );
    } elseif( isset($GLOBALS['user_error_message']) ) {
        // show error
        return print_r( $GLOBALS['user_error_message'], 1 );
    }

} );

I just ran into a similar issue with an MVC Wordpress plugin. For me the solution was to include

require_once($_SERVER['DOCUMENT_ROOT'].'/wp-includes/pluggable.php');

to have access to the core function via a plugin.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM