web-dev-qa-db-fra.com

Comment stocker ou mettre en cache des données de panier personnalisées pour la session de chaque utilisateur

Je développe un panier d'achat et je ne souhaite utiliser aucun plugin, car aucun ne peut répondre à mes besoins. Je vais donc créer mon propre panier.

Ma question est la suivante: comment stocker ce que l'utilisateur a ajouté à son panier?

J'ai lu sur wp_cache et sur l'API transitoire.

Sont-ils suffisamment en sécurité?

Y a-t-il une autre meilleure façon?

1
Samer Massad

Les transitoires peuvent être utilisés, mais vous devez vous assurer qu'ils n'expirent pas plus tôt que vous le souhaitez.

J'ai répondu à une question similaire avec un objectif différent ici , mais j'ai essayé de garder la réponse légèrement différente ci-dessous.

Option 1 - PHP sessions

J'ai stocké des paniers au sein d'une session PHP, ce qui est correct, mais présente parfois quelques problèmes. Donc, même si cela fonctionne, je recommanderais quelque chose de plus robuste.

Mon code de plugin utilise un objet Basket. Sur le crochet d'action init, je démarre la session PHP et s'il y a un objet Panier sérialisé dans la session, je le désérialise en global, sinon j'instancie un nouveau panier dans le global.

Sur le hook shutdown, je sérialise mon objet dans la session.

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

Cela fonctionne bien, mais sur un site, je rencontre quelques problèmes de paniers vides qui sont probablement un conflit avec le code de session pour un plugin de connexion personnalisé.

Option 2 - Meilleures sessions

Il existe un WP Session framework écrit par Eric Mann et bien expliqué par Pippin, qui l’utilise dans son bien connu plug-in Easy Digital Downloads, ici . Vous utilisez une $ wp_session globale exactement comme vous le feriez avec $ _SESSION, mais il existe également des fonctions d'assistance pour gérer les sessions. Cela utilise les transitoires de WP pour le stockage, mais gère également correctement l'extension des délais d'expiration afin que vos paniers ne soient pas nettoyés trop tôt.

J'y reviendrai sur mes propres sites lorsque j'aurai bien examiné comment cela fonctionne pour moi.

Nous essayons de ne pas vous faire fuir en suivant d'autres liens dans les réponses ici, car ils ne durent peut-être pas, mais les insérer tous les deux ici donnerait une réponse un peu longue.

Option 3 - Connexions utilisateur

Si vous n'avez pas besoin d'un client pour créer un compte, cette approche ne vous convient pas, sauf si vous souhaitez coder pour le concept d'utilisateur anonyme, puis convertir son panier en panier pour un utilisateur connecté lors de la création de son compte. Si vous avez besoin de comptes d'utilisateurs, c'est la voie à suivre, car vous pouvez confier la gestion de la session aux connexions d'utilisateur intégrées de WP. Ensuite, sur init & shutdown, vous pouvez désérialiser et sérialiser votre panier dans un champ méta utilisateur, qui persistera entre les sessions de connexion.

Alors que update_user_meta gérera la sérialisation pour vous, soyez conscient de ce bogue de longue date lorsque vous essayez de stocker un objet.

0