1

我正在使用自定义登录表单,这是代码。成功登录后,它重定向到 /portal 页面,但在门户页面中,用户登录状态再次为 false。

$email = $_REQUEST['login_email'];
        $password = $_REQUEST['login_password'];

        $args = array(
            'orderby'      => 'login',
            'order'        => 'ASC',
            'fields'       => 'all'
            );
        $count=0;
        $all_users = get_users( $args );
        $login_data['user_password'] = $password;
        $login_data['user_login'] = $email;
        $login_data['remember'] = true;
        $user_verify = wp_signon( $login_data, true );

        $userID = $user_verify->ID;

        do_action( 'wp_login', $email );
        wp_set_current_user( $userID, $email );
        wp_set_auth_cookie( $userID, true, false );


        if ( is_wp_error($user_verify) ){
            $loginerror = true;
            $errors['login_error']=__("Error in login",'domain');
        }
        else{
            $loginSuccess = true;
            $_SESSION['login_email']=$email; // Initializing Session
            if(empty($previous_location))
            {

                wp_safe_redirect( home_url('/portal/'));
            }
            else{
                wp_safe_redirect($previous_location);
            }
            exit();
        }

但是在/portal页面中,当我var_dump(is_user_logged_in())返回 false 时。这里发生了什么?我做了什么?

4

2 回答 2

1

我知道这个问题很老,但是我在这个问题上挣扎了很长时间,我只想为下一个人分享我的知识。

我的问题是在页面重新加载时页面标题已经发送,因此导致 wp_signon() 正常工作的问题。为了解决这个问题,我创建了这个函数并将其放入我的 functions.php 文件中:

add_action('template_redirect', 'my_check_login');
function my_check_login(){
    if( is_page_template('custom-login.php') ){
        global $wpdb; 

        //SQL Escape all inputs
        $email = $wpdb->escape($_POST['email']);  
        $password = $wpdb->escape($_POST['password']);  
        $remember = $wpdb->escape($_POST['rememberme']);  

        if($remember) $remember = "true";  
        else $remember = "false";

        $login_data = array();  
        $login_data['user_login'] = $email;  
        $login_data['user_password'] = $password;  
        $login_data['remember'] = $remember;  

        $user_verify = wp_signon( $login_data, false );
        if ( is_wp_error($user_verify) ) {  
            echo "Invalid login details";  
        } else {    
            wp_set_current_user($user_verify->ID);
            wp_set_auth_cookie($user_verify->ID,true);
            echo "<script type='text/javascript'>window.location.href='". home_url() ."'</script>";
            exit();  
        }
    } else {  
        // Add user feedback here
        //echo "Invalid login details";  
    }  
}

我的 custom-login.php 文件只是一个简单的形式:

<?php  
/** 
 * Template Name: Login page 
 */  
 get_header();   

?>  
<div class="background-light">
    <div class="container">
        <div class="row">
            <div class="offset-3 col-6">
                <form id="login1" class="registration-form" name="form" action="<?php echo home_url(); ?>/login/" method="post">
                    <input id="email" type="text" placeholder="Email" name="email"><br>  
                    <input id="password" type="password" placeholder="Password" name="password">  
                    <input id="submit" type="submit" name="submit" value="Submit">  
                </form>
            </div>
        </div>
    </div>
</div>
于 2020-10-07T20:31:07.050 回答
0

我也有同样的经历。原来是我的自定义注册机制出了问题。$wpdb我正在使用对象和插入方法通过自定义 sql 查询添加新用户。

不知何故,这种方法与后一种wp_signon用法相冲突。如果您还编写了自定义注册机制,请尝试回退到wp_insert_user方法,然后使用$wpdb->update.

于 2017-10-06T15:12:56.337 回答