【问题标题】:How to use session_start in Wordpress?如何在 Wordpress 中使用 session_start?
【发布时间】:2012-08-01 14:21:38
【问题描述】:

我正在创建一个双语网站,并决定使用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 行

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

【问题讨论】:

  • 当然,在调用 session_start() 之前不要做任何输出。这意味着您需要缓冲 WP 生成的所有内容,直到 session_start 调用,或者在渲染链中更早地插入 session_start。
  • @MarcB 我已经尝试了几次,但始终无法让它发挥作用。

标签: php wordpress session


【解决方案1】:

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

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

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

add_action('init', 'register_my_session');

【讨论】:

  • 编辑 header.php 文件假定他没有写插件等。真的很糟糕。
  • 这是一个不好的做法检查其他答案!
【解决方案2】:

编辑

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

【讨论】:

  • 您的代码有错误,您忘记了 session_start() 后的分号。你应该纠正它。
  • 这是更好的答案 - wordpress 在运行 header.php 文件之前发送标头,因此开始会话时可能仍会与 wordpress 发送的标头发生冲突。在 init 上运行它可以避免这个问题。
  • init hook 更适合 session_start。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    根据this answer和这里给出的答案,最好使用以下代码sn-ps:

    对于 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 的版本:

    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


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

    【讨论】:

      【解决方案5】:

      适用于 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');
      

      【讨论】:

        【解决方案6】:
        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 和环回请求。在发出任何 HTTP 请求之前,会话应由 session_write_close() 关闭。

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

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

        【讨论】:

          猜你喜欢
          • 2018-05-10
          • 2017-08-24
          • 1970-01-01
          • 2020-09-22
          • 1970-01-01
          • 1970-01-01
          • 2019-01-18
          • 2013-01-14
          • 1970-01-01
          相关资源
          最近更新 更多