3 votes

La session WordPress/WC n'est pas transférée à la page suivante

J'essaie simplement de stocker et de récupérer les données des clients non enregistrés d'une page à l'autre dans un modèle de paiement personnalisé. Je l'ai réduit à sa plus simple expression pour essayer de cerner le problème.

Le présent

<?php
    $customer = WC()->customer;
    $customer->set_billing_first_name("WORKING!!!");
    $customer->save();
    var_dump($customer->get_billing());
?>

Produit ceci

array (size=2)
'country' => string 'US' (length=2)
'first_name' => string 'WORKING!!!' (length=10)

Mais ensuite, cette

<?php
    $customer = WC()->customer;
    //$customer->set_billing_first_name("WORKING!!!");
    //$customer->save();
    var_dump($customer->get_billing());
?>

Produit ceci

array (size=1)
'country' => string 'US' (length=2)

Même si je devrais toujours être fermement dans la même session, et donc obtenir les données stockées avant les commentaires. Tout ce que j'ai fait, c'est rafraîchir la page après avoir commenté ces deux lignes.

Est-ce que je me trompe complètement sur ces méthodes ?


Vérifié

  1. L'environnement est configuré de manière tout à fait correcte. J'ai même demandé à quelqu'un d'autre de le vérifier pour moi. URLs, caches, etc.

  2. Il semble fonctionner lorsqu'on est connecté, mais la grande majorité des utilisateurs ne le sont jamais, ce qui n'est pas très utile.

  3. J'ai essayé sur deux serveurs différents (un local, un distant) et j'ai rencontré le même problème.

  4. Je suis reparti sur une nouvelle installation de WP+WC, j'ai créé un thème vierge, functions.php qui fait ce qui précède dans le code d'initialisation. Même problème.

9voto

Sally CJ Points 10317

Si $customer->save() ne conserve pas les modifications que vous avez apportées aux données du client (par ex. $customer->set_billing_first_name('Test') ), c'est probablement parce que le client n'est pas inscrit sur le site ou qu'il n'est pas connecté. $customer->get_id() es 0 .

C'est normal, car l'identifiant de l'utilisateur ou de la session est nécessaire pour enregistrer correctement les modifications et les rendre persistantes sur plusieurs pages.

Ainsi, lorsque l'utilisateur n'est pas enregistré/connecté, WooCommerce ne démarre pas sa session tant que l'utilisateur ne s'est pas connecté, ou qu'il n'a pas ajouté un produit dans son panier.

Mais vous pouvez démarrer manuellement la session, comme suit : (ajoutez le code à la section functions.php fichier)

add_action( 'woocommerce_init', function(){
    if ( ! WC()->session->has_session() ) {
        WC()->session->set_customer_session_cookie( true );
    }
} );

Ensuite, les modifications apportées aux données du client sont répercutées sur d'autres pages, pour autant que biscuits sont activés sur le navigateur, car tout comme WordPress, WooCommerce stocke son ID de session (l'ID de l'utilisateur ou un ID/hash auto-généré) dans les cookies - et l'ID de session est utilisé pour définir/récupérer les données de session dans la base de données - le nom de la table est woocommerce_sessions s'il n'y a pas de préfixe de table.

Essayez ceci après avoir démarré la session WooCommerce :

$customer = WC()->customer;
// Change 'Test' if necessary - e.g. 'Something unique 123'
if ( 'Test' !== $customer->get_billing_first_name() ) {
    $customer->set_billing_first_name( 'Test' );
    echo 'First name added to session<br>';
} else {
    echo 'First name read from session<br>';
}

Et celle-ci - vous devriez voir une nouvelle date à chaque chargement de page : (enfin, celle que vous avez définie précédemment)

echo WC()->session->get( 'test', 'None set' ) . '<br>';
WC()->session->set( 'test', current_time( 'mysql' ) );
echo WC()->session->get( 'test', 'It can\'t be empty' );

0voto

Utilisez-vous le jeu d'url dans Wordpress ? Il semble qu'il stocke le cookie sur la base de l'url configurée dans l'application plutôt que sur la base de l'url réelle.

J'espère que cela vous aidera.

Source : https://en.blogpascher.com/wordpress-tutorial/How-correct-the-loss-of-session-on-wordpress

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X