web-dev-qa-db-ja.com

一時的なものは私用ですか、それとも公共ですか?

WPトランジェントはユーザーセッションに固有のものですか、それともどこかのセッションからアクセスできるのでしょうか。

それらはDBに書き込まれるので、私はそれらがどこでも公開されていてアクセス可能であると想像するでしょう、しかし彼らの範囲を1人のユーザーのセッションだけに制限する方法はありますか?

私が構築しているウェブサイトはログイン/会員増強オプションを提供していません。userによって私はウェブサイトを見ている人を意味します - 私は ではありません wp_usersについて話しています!

例:

  • 私は、乱数を生成し、それを同じセッション内でアクセス可能なはずのトランジェントに格納するホームページをロードします。

  • しかし、同じコンピュータからでも、別のブラウザから、または別のIPから、私はこの一時的なものにアクセスすることができないはずです...

これは可能ですか?

5
Daniel Boccato

トランジェントは、期限が切れる単なるデータベースキーです。 WordPressに特定の情報を記憶してもらいたいが、限られた時間内であるように指示するのと同じです。一般に、トランジェントは任意の要求を通じてPHPにアクセスできます。

しかし、それらはサーバーサイドであるため、開発者としてあなたが公開した場合にのみ、トランジェントはフロントエンドユーザーに公開されます。

解決策

あなたの具体的な質問を考えます。

私は、乱数を生成し、それを同じセッション内でアクセス可能なはずのトランジェントに格納するホームページをロードします。

トランジェントとクッキーを組み合わせることをお勧めします。基本的に、リクエストごとに一意のキー(おそらくtime()といくつかの乱数のハッシュ)を生成し、それをユーザーのセッションキーとして使用します。それから、だけのユーザーにトランジェントを保存できます。必ずこの一意のキーをcookieのようにブラウザに渡してください。次回同じユーザーがページを更新したときにも、同じ番号が割り当てられます。

未テスト 擬似コード...

/**
 * Check the user's cookie if they have it.
 * Create one if they don't.
 */
function wpa_105249_check_cookie() {
    if ( isset( $_COOKIE['wpa_105249_key'] ) ) {
        $key = (string) $_COOKIE['wpa_105249_key'];
    } else {
        $key = md5( time() . Rand() );

        // Set the browser cookie to expire in 30 minutes
        set_cookie( 'wpa_105249_key', $key, time() + 30 * 60 )
    }

    // Try to grab the transient from the database, if it exists.
    $transient = get_transient( 'wpa_105249_' . $key );

    // If the transient doesn't exist, create it.
    if ( false === $transient ) {
        // Call your function to generate the random number.
        $transient = generate_random_number();

        // Store the transient, but expire in 30 minutes.
        set_transient( 'wpa_105249_' . $key, $transient, 30 * 60 );
    }

    wp_cache_set( 'wpa_105249_number', $transient );
}
add_action( 'plugins_loaded', 'wpa_105249_check_cookie' );

平易な英語では、これは次のようになります。

  1. リクエスト内のwpa_105249_keyクッキーを確認してください
    • Cookieが存在しない場合は作成してください。
    • 次回ブラウザがクッキーを保持するように、ページのレスポンスヘッダーにクッキーを設定します。
  2. Cookieによって識別された一時的なものを取得しようとしています
    • トランジェントが存在しない場合は、関数を使用して新しい乱数を生成し、次回のためにトランジェントに保存します。
  3. リクエストキャッシュに乱数を設定する

これ以降に呼び出すコード - 基本的にコード内の別の場所にあるすべてのコード - 現在のユーザーの乱数を取得するには、次のように呼び出します。

$number = wp_cache_get( 'wpa_105249_number' );
7
EAMann

トランジェントは永続的なストレージメカニズムです。つまり、特定のキーを使ってトランジェントを保存することで、同じキーを使って同じトランジェントを取得できるようになります(有効期限が切れていないためキャッシュがフラッシュされていない場合)。

「パブリック」は実際には適用されません。これらは内部コードの概念であり、それらにアクセスするのはユーザーのブラウザではなくあなたのコードだけであるためです。

ユーザー固有のデータを一時的に格納したい場合は、おそらくそのためのユーザー固有のキーを考え出すのが難しいでしょう。

ユーザーのCookieに情報を保存したり、何らかの適切なセッションメカニズムを使用したりすることがおそらくより適しています。

5
Rarst