web-dev-qa-db-fra.com

Les personnes en transit sont-elles privées ou publiques?

Est-ce que WP transitoires est spécifique à la session utilisateur ou est-il accessible depuis n'importe quelle session?

Comme ils sont écrits dans la base de données, j'imagine qu'ils sont publics et accessibles partout, mais existe-t-il un moyen de limiter leur étendue à une seule session d'utilisateur?

Le site Web que je construis ne propose pas d'option de connexion/membre. Par utilisateur je veux dire toute personne qui consulte le site Web - je pas parle de wp_users!

Exemple:

  • Je charge la page d'accueil qui génère un nombre aléatoire et le stocke dans un transitoire qui devrait être accessible au cours de la même session.

  • Cependant, même à partir du même ordinateur, mais à partir d'un navigateur différent, ou d'une adresse IP différente, je ne devrais pas pouvoir accéder à ce transitoire ...

Est-ce possible?

5
Daniel Boccato

Les transitoires ne sont que des clés de base de données qui expirent. C'est comme dire à WordPress que vous voulez qu'il se souvienne d'une certaine information, mais pour une durée limitée. En général, les transitoires sont accessibles à PHP via toute requête.

Mais comme ils sont côté serveur, les transitoires ne sont exposés aux utilisateurs frontaux que si vous, en tant que développeur, les exposez.

Une solution

Compte tenu de votre question spécifique:

Je charge la page d'accueil qui génère un nombre aléatoire et le stocke dans un transitoire qui devrait être accessible au cours de la même session.

Je recommanderais de coupler les transitoires avec des cookies. Généralement, générez une clé unique pour chaque demande (peut-être un hachage de time() et un nombre aléatoire) et utilisez-la comme clé de session de l'utilisateur. Ensuite, vous pouvez stocker un transitoire pour uniquement cet utilisateur . Assurez-vous de transmettre cette clé unique au navigateur sous forme de cookie, et la prochaine fois que ce même utilisateur actualisera la page, il obtiendra le même numéro.

Pour vous donner un peu de non testé pseudo-code ...

/**
 * 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' );

En clair, cela va:

  1. Recherchez le cookie wpa_105249_key dans la demande
    • Si le cookie n'existe pas, créez-en un.
    • Définissez le cookie dans les en-têtes de réponse de la page afin que le navigateur l’ait pour la prochaine fois.
  2. Tentative d'attraper un transitoire identifié par le cookie
    • Si le transitoire n'existe pas, générez un nouveau nombre aléatoire à l'aide de votre fonction et enregistrez-le dans le transitoire pour la prochaine fois.
  3. Définir le nombre aléatoire dans le cache de demandes

N'importe quel code que vous appelez après cela - essentiellement n'importe où ailleurs dans votre code - vous pouvez récupérer le numéro aléatoire de l'utilisateur actuel en appelant simplement:

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

Les transitoires sont un mécanisme de stockage persistant. Cela signifie qu'en enregistrant les éléments transitoires avec certaines clés, vous pourrez récupérer le même éléments transitoires avec cette clé (si elle n'a pas expiré et si le cache n'a pas été vidé depuis).

"Public" ne s'applique pas vraiment à eux, car ils sont un concept de code interne et la seule chose qui y accède est votre code, pas le navigateur de l'utilisateur.

Si vous souhaitez stocker des données spécifiques à l'utilisateur dans des éléments transitoires, il sera probablement difficile de fournir des clés spécifiques à l'utilisateur.

Stocker des informations dans les cookies de l'utilisateur ou utiliser un mécanisme de session approprié conviendra probablement mieux.

5
Rarst