25

我正在创建一个双语网站,并决定使用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/neurosur/public_html/v2/wp-content/themes/default/region.php 在第 13 行

有没有办法解决这个问题?

4

6 回答 6

46

编辑

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');

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

$_SESSION['username'] = 'rafi';
于 2014-02-22T09:42:17.500 回答
14

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

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

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

add_action('init', 'register_my_session');
于 2012-08-03T14:10:44.670 回答
14

我在这里找到了 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 ();
}

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

于 2016-09-07T09:56:00.937 回答
2

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

对于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


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

于 2020-11-06T10:12:22.387 回答
0

适用于 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');
于 2021-07-16T08:56:11.573 回答
0
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 站点健康状态中遇到关键问题。错误说;

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

为了抑制这个错误,你可以在你想在 WP 中开始一个会话时进行这个修改;

session_start([
    'read_and_close' => true,
]);
于 2021-10-30T12:05:16.597 回答