【问题标题】:How to set is_user_logged_in() true in Wordpress如何在 Wordpress 中设置 is_user_logged_in() true
【发布时间】:2019-04-13 00:25:13
【问题描述】:

我在插件内部和简码函数内部使用wp_signon 来登录用户。为了澄清,短代码是从页面内容中调用的。 wp_signon 函数成功返回用户信息。但是is_user_logged_in() 正在返回 false。为什么会发生这种情况,或者我该如何设置 is_user_logged_in() true 以便用户保持登录状态?

            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

            }

【问题讨论】:

  • 您的意思是用户不能在您的网站上保持登录状态?如果你想在这个网站上满足,$remember 需要 true。如果您的会话中没有任何数据,is_user_logged_in() 将不起作用。 wp_signon() 将处理您的会话。但是为什么在 else 条件下设置 $_SESSION['fc_user']?会议开始了吗?
  • @Faysal 是的,我确实使用 session_start() 开始了会话。
  • @FaysalHaque,我不明白您所说的“$remember 需要真实”是什么意思。但我尝试使用 wp_signon( $user_data, true );也是。还是不行。
  • 你有没有把这段代码放在 after_setup_theme 钩子上调用的函数中,就像 here 解释的那样?
  • @d79 不,它在一个简码挂钩内,我需要在一个简码挂钩内。

标签: php wordpress login


【解决方案1】:

函数wp_signon

向页面发送标题。它必须在返回任何内容之前运行。

因此在短代码中运行它(就像您在评论中指定的那样)为时已晚:标头已经发送。

为了实现你想要的,你应该把你的代码分成两部分,在不同的时间运行,像这样:

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 );
    }

} );

【讨论】:

    【解决方案2】:

    我刚刚在使用 MVC Wordpress 插件时遇到了类似的问题。 对我来说,解决方案是包括

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

    通过插件访问核心功能。

    【讨论】:

    • 这只是做了一个可能完全错误的假设。如果 WordPress 的核心文件不在在服务器的文档根目录中怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-20
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多