从插件中获取用户登录状态。未定义$CURRENT_USER

时间:2012-07-25 作者:emersonthis

我正在编写一个插件,它添加了一个类,该类为第三方软件创建一个端点,以便对其进行API调用并检查当前用户是否已登录。这是我正在做的精简版本。

class API_Endpoint{

    public function __construct(){
        add_filter(\'query_vars\', array($this, \'add_query_vars\'), 0);
        add_action(\'parse_request\', array($this, \'sniff_requests\'), 0);
        add_action(\'init\', array($this, \'add_endpoint\'), 0);

    }   

    //other functions...

    protected function send_response($msg, $uid = \'\'){

        global $current_user;

        $uid1 = get_current_user_id();
        $uid2 = $current_user->ID;

        $response[\'message\'] = $msg;
        $response[\'uid1\'] = $uid1; //always = 0
        $response[\'uid2\'] = $uid2; //always = 0
        $response[\'login_status\'] = ( is_user_logged_in() ) ? TRUE : FALSE ; //always = false
        header(\'content-type: application/json; charset=utf-8\');
        echo json_encode($response)."\\n";
        exit; //prevents the rest of Wordpress from running....
    }
}

new API_Endpoint();
我在测试时已登录。。。从代码中的注释可以看出,$current_user 似乎没有定义,也没有is_user_logged_in() 工作知道为什么吗?据我所知,在init 行动挂钩。

1 个回复
最合适的回答,由SO网友:TheDeadMedic 整理而成

One question: 发送请求的第三方是否通过用户cookie?

如果没有,那么WP将像对待任何其他客人一样对待该请求!如果是,你检查过了吗$_COOKIE 什么时候send_response() 跑步?

Update: 我想我会一劳永逸地结束下面的讨论:)

您必须维护已登录用户的数据库日志

我以为WP已经这么做了!

不,WP只是在每个请求上验证cookie(如果发送了cookie)。

我以为cookies存储在浏览器中

是的。

因此,如果同一个用户登录到我的站点,然后访问子域站点,该子域站点调用file\\u get\\u contents(),为什么没有cookie?

因为API请求来自服务器,而不是浏览器。这就像问你为什么在使用Firefox登录后没有使用Chrome登录!

我想收回我关于维护登录日志的建议,因为我相信有两种更好、更简单的解决方案;

在客户端(即使用AJAX)激发请求-因为它来自用户的浏览器,所以cookie会像您预期的那样一起发送,在服务器端将用户的cookie与您的API请求一起发送*(请参见下文)

    使用客户端cookie发送远程get的示例代码:

    $data = array();
    
    if ( ! empty( $_SERVER[\'HTTP_COOKIE\'] ) ) {
        foreach ( explode( \'; \', $_SERVER[\'HTTP_COOKIE\'] ) as $pair )
            $data[\'cookies\'][] = new WP_Http_Cookie( $pair );
    }
    
    // Wp_Http_Cookie will choke if cookie value has special characters.
    add_filter( \'wp_http_cookie_value\', \'rawurlencode\' );
    
    if ( $get = wp_remote_get( $url, $data ) ) {
        // Yippee!
    }
    
    However, 2) 有一个陷阱;验证API请求所需的cookie必须发送给触发它的脚本(这里提到的子域标志着潜在的问题)。

    如果您将多站点与子域一起使用,这将得到解决。否则,您需要在wp-config.php:

     define( \'COOKIE_DOMAIN\', \'.example.com\'  );
    
    看到那个点前缀了吗?这表示应将cookie发送到域或其任何子域(而默认情况下,WP将其设置为仅将其应用于主域)。

结束

相关推荐

Custom login page problem!

我试图通过在函数中添加1来创建自定义登录页。php和2放入主题文件夹。但我甚至不能执行主题。我可以在没有1和2的情况下激活主题。然而,该网站在试图更新功能时双向冻结。将2推到服务器并修改函数后的php。php,并尝试在将主题(包括1,2)推送到服务器后激活主题。该文件可访问www.lastech。com。金色/绿色。zip我尝试了很多不同的方法来解决这个问题,但都不管用。我花了将近一周的时间。请帮帮我,伙计们!1.function custom_login() { echo \'<link