如何在Wordpress中使用session_start


How to use session_start in Wordpress?

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

session_start();    
if(!isset($_SESSION['language'])){
    $_SESSION['language'] = 'English'; //default language
}

这个问题是它与Wordpress冲突,我得到了以下信息:

警告:session_start()[function.session start]:无法发送会话cookie-标头已由发送(输出开始于/home/neurosur/public_html/v2/wp-content/themes/default/header.php:8)在/home/neur/public_html/v2/wp-content/themes/default/region.php中13号线

有办法绕过这个吗?

编辑

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

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

function register_my_session()
{
  if( !session_id() )
  {
    session_start();
  }
}
add_action('init', 'register_my_session');

现在,如果你想在会话中设置数据,就这样做

$_SESSION['username'] = 'rafi';

我已经将原来的答案从@rafi改为正确的答案(见下文)。

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

function register_my_session()
{
  if( !session_id() )
  {
    session_start();
  }
}
add_action('init', 'register_my_session');

我在这里发现了Peter的一篇有趣的文章。我在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 ();
}

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

根据这个答案和这里给出的答案,最好使用以下代码片段:

对于PHP>=的版本5.4.0,PHP 7

function register_my_session() {
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
}
add_action('init', 'register_my_session');

参考:http://www.php.net/manual/en/function.session-status.php


对于PHP<5.4.0

function register_my_session() {
    if(session_id() == '') {
        session_start();
    }
}
add_action('init', 'register_my_session');

参考:https://www.php.net/manual/en/function.session-id.php


我不想获得任何学分,我只是觉得分享这些信息会有所帮助。

适用于PHP 7.4版

function register_my_session() {
    if (session_status() === PHP_SESSION_NONE && session_status() !== PHP_SESSION_ACTIVE) {
        @session_start();
    } 
} 
add_action('init', 'register_my_session');
add_action('init', 'customSessionStart', 1);
add_action('wp_logout', 'customSessionDestroy');
add_action('wp_login', 'customSessionDestroy');
function customSessionStart()
{
    if (!session_id()) {
        session_start();
    }
}
function customSessionDestroy()
{
    session_destroy();
}

当您使用此代码时,您可能会在WP站点运行状况中得到关键问题。错误表明;

通过session_start()函数调用创建了一个PHP会话。这会干扰REST API和环回请求。在发出任何HTTP请求之前,会话应由session_write_close()关闭。

要抑制此错误,您可以在希望在WP中启动会话时进行此修订;

session_start([
    'read_and_close' => true,
]);