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のコメントから

関数.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からの正しい回答に変更しました(以下を参照)。

関数.phpファイルに次のコードを記述します。

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

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

ここでピーターの面白い記事を見つけました。私は私の中で次のコードを使用しています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()関数呼び出しによって作成されました。これは、RESTAPIおよびループバック要求に干渉します。session_write_close()HTTPリクエストを行う前に、セッションを閉じる必要があります。

このエラーを抑制するために、WPでセッションを開始するときにこの改訂を行うことができます。

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