Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Wordpress中使用session_start?_Php_Wordpress_Session - Fatal编程技术网

Php 如何在Wordpress中使用session_start?

Php 如何在Wordpress中使用session_start?,php,wordpress,session,Php,Wordpress,Session,我正在创建一个双语网站,并决定使用session\u start确定页面的语言,使用以下内容: session_start(); if(!isset($_SESSION['language'])){ $_SESSION['language'] = 'English'; //default language } 问题是它与Wordpress冲突,我得到以下信息: session_start(); if(!isset($_SESSION['language'])){

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

session_start();    
if(!isset($_SESSION['language'])){
    $_SESSION['language'] = 'English'; //default language
}
问题是它与Wordpress冲突,我得到以下信息:

session_start();    
if(!isset($_SESSION['language'])){
    $_SESSION['language'] = 'English'; //default language
}
警告:会话启动()[函数.会话启动]:无法发送会话 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行


有什么办法可以绕过这个问题吗?

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

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

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

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

add_action('init', 'register_my_session');
编辑

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

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

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

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

add_action('init', 'register_my_session');
现在,如果要在会话中设置数据,请执行以下操作

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

我发现了彼得写的一篇有趣的文章。我在
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、php7的版本:

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


对于PHP<5.4.0
的版本:

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



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

当然,在调用session\u start()之前不要做任何输出。这意味着您需要缓冲WP生成的所有内容,直到会话\u start调用为止,或者在呈现链中更早地插入会话\u start。@MarcB我已经尝试过多次,但始终无法使其正常工作。代码中有错误,您在会话\u start()之后忘记了分号。您应该更正它。这是更好的答案-wordpress在header.php文件运行之前发送头,因此在那里启动会话可能仍然与wordpress发送的头冲突。在init上运行它可以避免这个问题。init hook更适合session_start。编辑header.php文件假定他没有编写插件,等等。真是个糟糕的黑客行为。这是一个糟糕的做法检查其他答案!