web-dev-qa-db-ja.com

ユーザーのセッションごとにカスタムショッピングカートデータを保存またはキャッシュする方法

私はショッピングカートを開発していますが、どれも自分のニーズを満たすことができないので、プラグインを使用したくありません。だから私は自分のショッピングカートを作るつもりです。

私の質問は:ユーザーが自分のカートに追加したものを保存する方法は?

wp_cacheとTransients APIについて読みました。

それらは十分に安全ですか?

他にもっと良い方法はありますか?

1
Samer Massad

トランジェントを使用することはできますが、必要以上に早く期限切れにならないようにする必要があります。

私は異なる目標で{ here )同じような質問に答えました、しかし私は自己完結型の下でわずかに異なる答えを保とうとしました。

オプション1 - PHPセッション

私はPHPセッション内にカートを保管していますが、これは一般的に問題ありませんが、時折いくつか問題があります。それでそれがうまくいく間、私はもっと堅牢なものをお勧めします。

私のプラグインコードはBasketオブジェクトを使用しています。 initアクションフックで、私はPHPセッションを開始し、セッション内にシリアライズされたBasketオブジェクトがあればそれをグローバルにシリアル化解除し、そうでなければ新しいバスケットをグローバルにインスタンス化します。

shutdownフックで、私は自分のオブジェクトをセッションにシリアライズします。

function setup_session() {

    global $Basket;

    session_start();

    if (isset($_SESSION['basket'])) {
        $Basket = unserialize($_SESSION['basket']);
    } else {
        $Basket = new Basket();
    }

    $Basket->do_actions(); 
    // my own hooks to allow me to add Housekeeping code without messing with my core codde

}



function save_session() {

    global $Basket;
    if (isset($Basket)) {
        $_SESSION['basket'] = serialize($Basket);
    }

}

add_action( 'init', 'setup_session' );
add_action( 'shutdown', 'save_session' ); // works even when redirecting away from a page

これはうまく機能しますが、あるサイトでは、カスタムログインプラグインのセッションコードと衝突する可能性がある、いくつかの空っぽのバスケットの問題が発生します。

オプション2 - より良いセッション

WP Eric Mannによって書かれたセッションフレームワーク があり、Pippinによってよく説明されています。彼はそれをよく知られているEasy Digital Downloadsプラグイン here で使います。 $ _SESSIONとまったく同じようにグローバル$ wp_sessionを使用しますが、セッションを管理するためのヘルパー関数もあります。これはWPのトランジェントを保存に使用しますが、有効期限の延長を適切に処理して、バスケットが早すぎる時期にクリーンアップされないようにします。

私が自分のサイトでどのように機能するかをよく見たときに、私は自分のサイトでこれに移ります。

ここで他のリンクをたどり着かないようにしますが、ここで両方を引くとかなり長い答えになります。

オプション3 - ユーザーログイン

買い物客がアカウントを作成する必要がない場合は、匿名ユーザーの概念に合わせてコードを作成し、アカウントを作成するときにそのユーザーのバスケットをログインユーザー用のバスケットに変換しない限り、この方法は適していません。ユーザーアカウントが必要な場合は、セッション管理をWPの組み込みユーザーログインに引き継ぐことができるので、これが有効な方法です。それからinitshutdownでは、あなたのバスケットをシリアル化してシリアル化してユーザーメタフィールドにすることができます。これはログインセッション間も持続します。

update_user_metaがシリアライゼーションをあなたのために扱うでしょうが、オブジェクトを保存しようとするとき この長年のバグ に注意してください。

0