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