web-dev-qa-db-ja.com

Wordpressでsession_startを使用する方法

私はバイリンガルサイトを作成していて、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行目)

これを回避する方法はありますか?

19
Rob

コードをheader.phpファイルの先頭に移動します。そして、セッションがすでに存在しているかどうかを確認します。

if(session_id() == '')
     session_start(); 

your code here...
15
kpotehin

[〜#〜]編集[〜#〜]

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

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 ();
}

これにより、ユーザーがログアウトし、別のアカウントで再度ログインすると、古いセッションが破棄されます。

13
j.c