2017-01-21 2 views
0

PHPセッションの私の理解は、彼らが私たちにサイト上のページ間の変数を追跡させることです。しかし、私はWordPressで何か違うものを見ているようです。私は自分のfunctions.phpファイルに以下のフックを持っている:これは価格設定のページであればWordPressのPHPセッション

add_action('wp', 'sa_clear_session_email'); 
function sa_clear_session_email() { 

    if (! is_page('Pricing ') ) 
     return; 

    $ret = session_start(); 
    if ($ret) { 
    $s_id = session_id(); 
    trace("M20D:Pricing page. Started session $s_id"); 
    } 
    else { 
    trace("M20E:Pricing page. Unable to start session"); 
    } 
unset($_SESSION['user_email']); 

ので、コードがセッションを開き、「USER_EMAIL」変数をクリアします。 functions.phpでも

add_action('wp', 'woa_add_membership_auto_on_checkout'); 
function woa_add_membership_auto_on_checkout() { 
    if (! is_page('checkout') || ! is_checkout()) {// is_checkout() returns true if viewing the checkout page 
     return; 
    } 

$ret = session_start(); 
    if ($ret) { 
    $s_id = session_id(); 
    trace("M9F:Started session $s_id"); 
    } 
    else { 
    trace("M9F:Unable to start session"); 
    } 
$email = $_SESSION['user_email']; 

このコードはチェックアウトページを待ち、その後、最初のコードで開いたセッションを使用しようとしています。 私は最初のフック関数で 'user_email'をクリアしても、 それは2番目にクリアされていません。その理由はsession_idが最初のコードになるということです。 は私が入るsession_idではありません2番目のコード

ここで何が起こっているのか分かりますか?

ありがとうございました。

+0

通常、 '' init''アクションはセッションを開始するために使用されます。それでも問題が解決しない場合は、サーバーがセッションを正しく保存していない可能性があります。 – ub3rst4r

+0

if(!is_page( 'Pricing'))とif(!is_page( 'checkout')||!is_checkout()){両方とも正常に動作しており、ループが関数内に入りますか? –

答えて

1

まず、セッションが既に開始されていることを確認せずに、session_start()を使用しないでください。

例:

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

第二に、 "WP" フックでそれを使用しないでください。 initフックまたはtemplate_redirectフックで使用します。

例:

add_action('init', 'yourclass'); 

問題はまだ私が知っているが、私はあなたの問題を解決し、これら二つのtweeksとのセッションをリセットすることを停止すると信じ存在する場合。 :)

+0

私は応答するために答えを使用し、それはあなたの答えより先に置かれています。私はあなたがそれに気づかないようにしたくなかった。 – Steve

1

user854993、

私は成功せず、両方のこれらのアイデアを試してみました。初期化フックで私は

add_action('init', 'myStartSession', 1); 
function myStartSession() { 
    if(!session_id()) { 
     session_start(); 
    } 
    $s_id = session_id(); 
    trace("M00C:init hook: session_id is $s_id" ); 
} 

しかし、トレースラインを持っている、これは複数回実行されることを示しており、ほぼ毎回のsession_idが異なっている:

enter image description here

私がしようとしてを放棄する準備ができてよWordPressでセッションを使用する代わりに、ユーザがメインのスーパー管理者(me)であるユーザメタ変数にuser_emailの値を格納します。それはこれらの問題のない安定しているはずです

あなたはどう思いますか?