如何在Wordpress中使用session_start?

Rob*_*Rob 19 php wordpress session

我正在创建一个双语网站,并决定使用以下内容session_start来确定页面的语言:

session_start();    
if(!isset($_SESSION['language'])){
    $_SESSION['language'] = 'English'; //default language
}
Run Code Online (Sandbox Code Playgroud)

这个问题是它与Wordpress冲突,我得到以下内容:

警告:session_start()[function.session-start]:无法发送会话cookie - 已经发送的标头(输出从/home/neurosur/public_html/v2/wp-content/themes/default/header.php:8开始)第13行/home/neurosur/public_html/v2/wp-content/themes/default/region.php

有办法解决这个问题吗?

raf*_*afi 39

编辑

Wordpress在运行header.php文件之前发送标头信息.因此,在header.php中启动会话可能仍然与wordpress发送的标头信息冲突.在init上运行它可以避免这个问题.(来自jammypeach的评论)

在functions.php文件中写下以下代码:

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

add_action('init', 'register_my_session');
Run Code Online (Sandbox Code Playgroud)

现在,如果要在会话中设置数据,请执行此操作

$_SESSION['username'] = 'rafi';
Run Code Online (Sandbox Code Playgroud)

  • 这是更好的答案 - wordpress在header.php文件运行之前发送标题,因此启动会话可能仍然会与wordpress发送的标题发生冲突.在init上运行它可以避免这个问题. (6认同)
  • init hook对于session_start更好. (3认同)

kpo*_*hin 15

将代码移动到header.php文件的顶部.并检查会话是否已存在:

if(session_id() == '')
     session_start(); 

your code here...
Run Code Online (Sandbox Code Playgroud)


j.c*_*j.c 14

彼得在这里发现了一篇有趣的文章.我正在使用以下代码functions.php:

add_action('init', 'myStartSession', 1);
add_action('wp_logout', 'myEndSession');
add_action('wp_login', 'myEndSession');

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

function myEndSession() {
    session_destroy ();
}
Run Code Online (Sandbox Code Playgroud)

当用户使用不同的帐户再次注销时,这会破坏旧会话.