使用 Curl 从 Yii2 进行 WP 自动登录在首次加载时不起作用

Posted

技术标签:

【中文标题】使用 Curl 从 Yii2 进行 WP 自动登录在首次加载时不起作用【英文标题】:WP Auto Login From Yii2 using Curl not working on First Load 【发布时间】:2016-08-09 16:53:46 【问题描述】:

我正在使用 YII2 的 WordPress 自动登录 下面是我的代码。

function.php (WP)

function autologin() 
   
    $strCookie = 'PHPSESSID=' . $_COOKIE['PHPSESSID'] . '; path=/';
    session_write_close();
    $ch = curl_init("http://example.com/testregister/wplogin"); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    curl_setopt( $ch, CURLOPT_COOKIE, $strCookie ); 
    $response = curl_exec($ch); 
    curl_close($ch);

    $newres = json_decode($response);
    $email = $newres->email;
    $password = $newres->password;
    $result = $newres->result;

    if($result == 1)
    
        $creds = array();
        $creds['user_login'] = $email;
        $creds['user_password'] = $password;
        $creds['remember'] = false;

        $user = wp_signon( $creds );

        if ( is_wp_error( $user ) )
        
            echo $user->get_error_message();
        
    
    else
    
        wp_destroy_current_session();
        wp_clear_auth_cookie();
        do_action( 'wp_logout' );
    

// ADD CODE JUST BEFORE HEADERS AND COOKIES ARE SENT
add_action( 'init', 'autologin' );

testregister/wplogin:(YII2)

public function actionWplogin()
    
        $userEmail = Yii::$app->user->identity->Email;
        $userpw = Yii::$app->user->identity->Password;
        $result = 1;
        if($userEmail == "")
        
            $result = 0;
        

        return  '"email":"'.$userEmail.'", "password":"'.$userpw.'" ,"result":"'.$result.'"';
    

每次加载 wordpress 网站时都会调用此函数。但第一次它没有登录到网站。

如果我使用wp_redirect( esc_url( home_url() ) );,登录功能可以正常工作,但使用重定向后 wp-admin 无法正常工作。

【问题讨论】:

【参考方案1】:

我找到了解决方案。 以下是 autologin() 函数中 functions.php 中的更改代码

if (!is_user_logged_in ())
        
            $creds = array();
            $creds['user_login'] = $email;
            $creds['user_password'] = $password;
            $creds['remember'] = false;

            $user = wp_signon( $creds );

            if ( is_wp_error( $user ) )
            
                echo $user->get_error_message();
            
            wp_redirect( esc_url(  "http://" . $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'] ) );
            exit;
        

如果用户当时没有登录,则登录并重定向页面。 :)

【讨论】:

以上是关于使用 Curl 从 Yii2 进行 WP 自动登录在首次加载时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

在 YII2 中使用自动注销,需要在再次登录后将用户重定向到用户在自动注销之前的相同 URL

BUG YII2.0 cURL error 6: Could not resolve host:

yii2 登录退出自动登录

Yii2,如何将登录用户的用户名自动保存在另一个表中?

Yii2 - 触发后从事件处理程序终止应用程序

Yii2通过curl调用json-rpc接口