WordPress中的PHP会话

时间:2017-01-21 04:20:32

标签: php wordpress

我对PHP会话的理解是,它们让我们跟踪站点上页面之间的变量。但我似乎看到了与WordPress不同的东西。我在我的functions.php文件中有以下钩子:

    public boolean onOptionsItemSelected(MenuItem item)
    {
       int id = item.getItemId();

       if (id == android.R.id.home)
       {
          yourResideMenu.getResideMenu().openMenu(ResideMenu.DIRECTION_LEFT);
       }

       return super.onOptionsItemSelected(item);
    }

因此,如果这是“定价”页面,则代码会打开会话并清除“user_email”变量。

同样在functions.php中

add_action( 'wp', 'sa_clear_session_email' );
function sa_clear_session_email() {

    if ( ! is_page( 'Pricing ' )  )
        return;

  $ret = session_start();
  if ($ret) {
    $s_id = session_id();
    trace("M20D:Pricing page. Started session $s_id");
  }
  else {
    trace("M20E:Pricing page. Unable to start session");
  }
unset( $_SESSION['user_email'] );

此代码等待结帐页面,然后尝试使用第一个代码中打开的会话。 我遇到的问题是即使我在第一个钩子函数中清除了“user_email” 它在第二个中没有被清除,原因是我在第一个代码中得到session_id 不是我在第二个代码中得到的session_id。

有谁知道这里发生了什么?

感谢。

2 个答案:

答案 0 :(得分:1)

首先,不要在没有检查会话已启动的情况下使用session_start()。

示例:

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

其次,不要在" wp"钩。在init hook OR template_redirect hook中使用它。

示例:

add_action('init', 'yourclass');

如果问题仍然存在,请告诉我,但我相信您将解决您的问题,并停止使用这两个tweek重置会话。 :)

答案 1 :(得分:1)

user854993,

我尝试过这两种想法,却没有成功。在init钩子里我有

add_action('init', 'myStartSession', 1);
function myStartSession() {
    if(!session_id()) {
        session_start();
    }
    $s_id = session_id();
    trace("M00C:init hook: session_id is $s_id"  );
}

但是跟踪线表明这会多次执行,几乎每次session_id都不同时执行:

enter image description here

我准备放弃尝试使用WordPress会话,而是将user_email值存储在用户元变量中,其中用户是主要的superadmin(me)。这应该是稳定的,没有这些问题

您怎么看?