我正在创建一个双语网站,并决定使用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行
有没有办法解决这个问题?
答案 0 :(得分:37)
修改强>
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';
答案 1 :(得分:15)
将代码移至header.php文件的顶部。 并检查会话是否已存在:
if(session_id() == '')
session_start();
your code here...
答案 2 :(得分:13)
我在彼得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 ();
}
当用户使用不同的帐户再次注销时,这会破坏旧会话。
答案 3 :(得分:0)
根据this answer和此处给出的答案,最好使用以下代码段:
对于 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
我不想获得任何荣誉,我只是想分享这些信息会有所帮助。
答案 4 :(得分: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');