为什么$_SESSION仅在我登录时才起作用?

时间:2015-07-15 作者:Vial

我在我的一些页面模板中包含了一个纯PHP库(与WordPress无关)。该库调用PHP session\\u start()函数并引用$\\u session[“cart”]全局变量。由于session\\u start,我将库包含在模板的顶部。

当我完全按照预期登录库函数时,但当我注销时,$\\u会话变量似乎不存储数据。有什么办法解决这个问题吗?

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

WordPress不使用PHP会话,因此WordPress本身不能与您的会话工作或不考虑您是否登录(我认为)。

尝试呼叫session_start() 在…上init 操作,而不是在模板文件中执行,并确保在加载自定义库之前调用它。此外,在用户登录和用户注销时结束PHP会话以开始新的会话也很有趣:

add_action(\'init\', \'cyb_start_session\', 1);
add_action(\'wp_logout\', \'cyb_end_session\');
add_action(\'wp_login\', \'cyb_end_session\');

function cyb_start_session() {
    if( ! session_id() ) {
        session_start();
        // now you can load your library that use $_SESSION
    }
}

function cyb_end_session() {
    session_destroy();
}
因为你图书馆的电话session_start(), 避免自己调用它,但仍需要加载库init 并在登录/注销时销毁会话:

add_action(\'init\', \'cyb_start_session\', 1);
add_action(\'wp_logout\', \'cyb_end_session\');
add_action(\'wp_login\', \'cyb_end_session\');

function cyb_start_session() {
      // load your libreary here (assuming it calls session_start())
}

function cyb_end_session() {
    session_destroy();
}
关键是在输出任何内容之前,尽早启动PHP会话。在…上init 优先级1是最早在WP环境中完成的。如果您以前这样做过,则可以通过以下方式销毁会话:wp_unregister_GLOBALS().

一个简单而愚蠢但有效的例子:

add_action(\'init\', \'cyb_start_session\', 1);
add_action(\'wp_logout\', \'cyb_end_session\');
add_action(\'wp_login\', \'cyb_end_session\');

function cyb_start_session() {
    if( ! session_id() ) {
        session_start();
        // now you can use $_SESSION
        $_SESSION[\'test\'] = "test";
    }
}

function cyb_end_session() {
    session_destroy();
}


// This will print array(1) { ["test"]=> string(4) "test" }
// above the content of any post
add_filter( \'the_content\', function( $content ) {

        var_dump($_SESSION);

        return $content;

} );

SO网友:Roddy P. Carbonell

我一直在考虑使用Wordpress的元键作为会话变量。类似这样:

add_user_meta(
    int $user_id,
    string $meta_key,
    mixed $meta_value,
    bool $unique = false
);
Wordpress将保留这些元值,将它们链接到用户,您可以稍后删除这些值。

结束

相关推荐

克隆像users.php这样的管理页面

在我的项目中,我想创建一个新的菜单位置,它实际上是“用户”页面的副本,但需要一些额外的过滤器/修改。例如,我需要在用户上方有另一个名为“Admins”的菜单位置,它将显示完全相同的结构化页面,但只有Admin用户。这是为了给我的客户带来更好/更简单的用户体验。我的问题是如何做到这一点?我知道有些函数add_menu_page 但是像这样使用它们(users.php 作为标识符):add_menu_page( \'custom menu title\', \'custom menu\', \'users.p