Wordpress插件会话仅在登录时有效

时间:2017-03-02 10:31:23

标签: php wordpress session

我正在使用我正在处理的Wordpress插件。 PHP会话的行为不一致。我读过以下文章:

https://wordpress.stackexchange.com/questions/121144/session-in-wordpress-plugin-development

https://silvermapleweb.com/using-the-php-session-in-wordpress/

还有更多关于使用init钩子启动会话的相同建议。

我在我的插件中实现了这个:

add_action('init', 'set_session', 1);

function set_session(){
    if(!session_id()){
        session_start();
    }
}

会话仍然表现得很奇怪,所以我创建了一个测试来查看是否正在设置会话。

$_SESSION['GuestID'] = 'test';

if(!session_id()){
    echo 'Session Not Started';
} else{
    if(isset($_SESSION['GuestID'])){
        echo 'Guest ID From Session: '.$_SESSION['GuestID'];
    } else{
        echo 'Guest ID not set in Session!';
    }
}

当我运行此客户ID时,将返回“来自会话的客户ID:测试”,但是如果您重新加载尝试从其他页面访问会话,则会收到“未在会话中设置的访客ID!”信息。对我来说,这表明会话已经启动,但由于某种原因,它没有存储我的会话数据。

我还可以看到没有为会话ID存储cookie。

所有这一切的奇怪之处在于,如果我登录到Wordpress管理员,PHP会话ID存储在cookie中,并且会话按预期运行!

可能导致这种情况的原因是什么?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

在做了一些进一步的研究之后,似乎一些Wordpress优化的托管服务具有高级别的缓存,可以向浏览器提供静态内容,而无需在每个请求上执行PHP。登录wordpress站点的admin部分时,这些缓存服务不会运行,从而导致会话性能不一致。在访问缓存页面时,Sessions不起作用,在没有缓存时工作。

我的托管服务提供商使用Varnish,并且为相关网站停用Varnish已解决了该问题。