web-dev-qa-db-ja.com

ログインしたときに$ _SESSIONが機能するのはなぜですか?

私はいくつかのページテンプレートに純粋なPHPライブラリ(WordPressとは関係ありません)を含めています。このライブラリはPHP session_start()関数を呼び出して$ _SESSION ["cart"]グローバル変数を参照します。 session_startのため、テンプレートの先頭にライブラリを含めます。

想定どおりにライブラリ関数にログインしたとき、ログアウトしたときに$ _SESSION変数がデータを格納していないように見えます。これを修正するためのアイデアはありますか?

1
Vial

WordPressはPHPセッションを使用しないので、WordPress自体はあなたのセッションがうまくいっているかどうか、あるいはあなたがログインしているかどうかに関係ないということはできません(私は思います)。

テンプレートファイルではなく、initアクションでsession_start()を呼び出すようにし、カスタムライブラリがロードされる前に必ず呼び出されるようにしてください。また、ユーザーログインとユーザーログアウトでPHPセッションを終了して、新しいセッションを開始するのも面白いかもしれません。

add_action('init', 'cyb_start_session', 1);
add_action('wp_logout', 'cyb_end_session');
add_action('wp_login', 'cyb_end_session');

function cyb_start_session() {
    if( ! session_id() ) {
        session_start();
        // now you can load your library that use $_SESSION
    }
}

function cyb_end_session() {
    session_destroy();
}

あなたのライブラリはsession_start()を呼び出しているので、conは自分自身で呼び出すのを避けてください、しかしあなたはまだinitにあなたのライブラリをロードし、ログイン/ログアウト時にセッションを破棄する必要があります:

add_action('init', 'cyb_start_session', 1);
add_action('wp_logout', 'cyb_end_session');
add_action('wp_login', 'cyb_end_session');

function cyb_start_session() {
      // load your libreary here (assuming it calls session_start())
}

function cyb_end_session() {
    session_destroy();
}

重要なのは、何も出力する前にできるだけ早くPHPセッションを開始することです。優先度1のinitでは、それがWP enviromentでできる最も早い時期に行われます。以前に行った場合、 wp_unregister_GLOBALS() によってセッションが破壊される可能性があります。

基本的で愚かだが実用的な例:

add_action('init', 'cyb_start_session', 1);
add_action('wp_logout', 'cyb_end_session');
add_action('wp_login', 'cyb_end_session');

function cyb_start_session() {
    if( ! session_id() ) {
        session_start();
        // now you can use $_SESSION
        $_SESSION['test'] = "test";
    }
}

function cyb_end_session() {
    session_destroy();
}


// This will print array(1) { ["test"]=> string(4) "test" }
// above the content of any post
add_filter( 'the_content', function( $content ) {

        var_dump($_SESSION);

        return $content;

} );
4
cybmeta