IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WordPress PHP Discussion :

Gestion d'un cookie de session - Passage de valeur


Sujet :

WordPress PHP

  1. #1
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 80
    Points
    80
    Par défaut Gestion d'un cookie de session - Passage de valeur
    Bonjour,

    J'utilisais une session php, tout fonctionnait simplement et bien. La vie était belle.
    Mais j'avais des alertes WP concernant un conflit avec l'API REST que j'ai prises au sérieux.

    Donc j'ai entrepris d'utiliser un cookie de session et cela fait trois jours que je galère.
    Je vous passe les millions de problèmes que j'ai du régler avant de le faire "marchoter" (pb samesite : modification du php_ini et du wpconfig, initialisation avec valeur obligatoire, unserialize ne renvoie pas la valeur sérialisée, etc...)

    De ce que j'ai compris.

    Le cookie ne fonctionne que s'il est appelé avant l'en-tête.
    Donc j'ai fait cela dans "simple-demand.php" (c'est mon plugin) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    add_action('init', 'add_article_cookie');
     
    function add_article_cookie($param)
    {
        if(empty($param) || is_null($param) || $param=''){
    		var_dump("param : " . $param);
            var_dump("nul ou vide ou ''");
            return;
        }
     
            $SD_tableau_REFS = unserialize($param);
     
        if (!isset($_COOKIE['Simple_Demande_cookie']) && is_array($SD_tableau_REFS)) {
            $SD_tableau_REFS=[]; // Ce cookie m'oblige à l'initialiser avec une valeur alors qu'il n'y a aucun contexte 
     
            $Articles = serialize($SD_tableau_REFS); 
     
            setcookie( 'Simple_Demande_cookie', $Articles,['samesite' => 'Lax']);
            $_COOKIE['Simple_Demande_cookie'] = $Articles; // Forcer l'inscription
     
     
        } else if(is_array($SD_tableau_REFS)){
     
            $returnValue = preg_replace('\'\\\\\'', '', $_COOKIE['Simple_Demande_cookie'], -1, $count);
            $Tableau_articles = unserialize($returnValue);
     
     
            if(!is_null($Tableau_articles)){ 
                $Tableau_articles= array_merge($Tableau_articles,$SD_tableau_REFS);
                $Tableau_articles=array_unique($Tableau_articles);
            }
            $Articles = serialize($Tableau_articles);
     
            setcookie( 'Simple_Demande_cookie', $Articles,['samesite' => 'Lax']);
            $_COOKIE['Simple_Demande_cookie'] = $Articles; // Forcer l'inscription
     
        var_dump($_COOKIE); 
     
        }
     
            return $param;
     
    }
    Où $param est un tableau sérialisé (dans le doute, car je ne savais pas si un tableau pouvait être passé en paramètre).
    preg_replace est présent car (en plus) entre serialize et unserialise la valeur n'est pas identique ! Des caractères "\" traînent.

    Quand je dis "marchoter" c'est juste que je vois ma fonction être appelée sans cesse. Un cookie se crée.
    Placé dans 'init', la fonction est donc appelée quasi tout le temps, à chaque changement de page.
    Ce qui n'était pas prévu au départ, car je n'en ai besoin qu'en cas de modification de la valeur.
    Elle est appelée sans valeur pour l'argument $param, j'ai donc dû imaginer des contournements à l'initialisation (quand le cookie n'est pas déjà déclaré).

    Cependant, je ne parviens pas à passer les arguments $param.
    Je les génère dans une page "single.php".
    Quand les arguments sont prêts, la fonction n'est pas appelable , et quand la fonction est appelée les arguments ont périmé.

    J'ai essayé mille façons d'appeler la fonction.
    Avec ou sans utiliser le hook 'init', des fois que...
    Rien ne passe.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if (function_exists('add_article_cookie')) {
        add_article_cookie($param);
       }
    Ça je ne comprends pas comment ça peut fonctionner (vu sur un site)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    do_action('init, $param);
    En appel de fonction simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    do_action('add_article_cookie, $param);
    en fonction anonyme dans la page
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    add_filter('init', function () use ($param) {
    // le corps de la fonction ici
    }
    et j'en passe...

    J'ai même essayé de passer $param en Globale, sans résultat (mais ça c'est une autre histoire).
    Ma fonction n'est jamais appelée, sauf quand elle est dans 'init' et que je ne peux lui passer aucun paramètre.
    C'est à dire appelée intempestivement et sans argument.

    Il y a forcément un truc important que je ne comprends pas concernant la gestion d'un cookie.
    Celui-ci me sert à enregistrer le nombre d'articles ajoutés dans un panier.
    Je crois que tous les paniers fonctionnent avec des cookies.
    Donc, un jour, pour quelqu'un, ça a fonctionné.

    Merci pour votre aide.

  2. #2
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 80
    Points
    80
    Par défaut
    Bon, déjà, première erreur.

    quand j'écris
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if(empty($param) || is_null($param) || $param=''){
    je ne teste pas si $param='', j'assigne une valeur '' à $param !

    Correction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
        if(empty($param) || is_null($param) || $param===''){

  3. #3
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    juin 2003
    Messages
    8 107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 8 107
    Points : 12 623
    Points
    12 623
    Par défaut
    je pense que vous n'êtes pas parti sur le bon chemin.
    le but principal de l'API REST est de dialoguer avec un autre serveur. et le but des sessions est de garder des informations pendant un dialogue avec le navigateur.

    donc au lieu de lancer la session dans l'action "init" (qui est aussi utilisée par REST), vous devez juste déplacer la session pour la lancer seulement quand elle est nécessaire.

  4. #4
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 80
    Points
    80
    Par défaut
    Bonjour Mathieu,

    J'aimerais tellement ne pas passer par 'init' !
    J'ai lu de nombreuses fois qu'un cookie devait être placé dans 'init', longtemps après avoir essayé de me servir de mon cookie à la manière d'une bête session php (qui, elle, fonctionne partout).
    Je vais donc ré-essayer de ne pas le mettre dans 'init'.
    Merci !

  5. #5
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    juin 2003
    Messages
    8 107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2003
    Messages : 8 107
    Points : 12 623
    Points
    12 623
    Par défaut
    je ne parlais pas du cookie, je parlais de la session. repartez du code qui fonctionne avec la session, je pense que ça sera plus simple.

  6. #6
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 80
    Points
    80
    Par défaut
    Oui, ok. Je vais rétropédaler.
    Et s'il y a un moyen d'éviter le conflit avec l'API REST en utilisant une session php je serais preneur.
    Utiliser un cookie me semble compliqué, il y a beaucoup de choses que je ne maitrise pas encore.

  7. #7
    Membre régulier
    Homme Profil pro
    autre
    Inscrit en
    janvier 2015
    Messages
    83
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : autre

    Informations forums :
    Inscription : janvier 2015
    Messages : 83
    Points : 80
    Points
    80
    Par défaut
    Je suis revenu à une gestion par session php. Tout fonctionne bien.

    Bizarrement l’alerte concernant le conflit avec l'API REST dans 'init' a disparu.
    Cela apparaissait à la fois dans ma console et dans le plugin 'Query Monitor'.

    Entretemps, j'ai installé, activé puis désactivé "Classic Editor". Je ne sais pas si cela a un lien.

    Pour revenir sur cette histoire de cookie, le truc que j'avais lu est que le cookie doit être implémenté avant 'send_headers'.
    C'est pourquoi tout le monde le plaçait par défaut dans 'init'.

    Or je vois ici :
    "Actions exécutées pendant une demande typique"
    https://codex.wordpress.org/Plugin_API/Action_Reference
    Qu'il y a de la place avant 'send_header'. Le placer dans 'init' n'est donc pas une fatalité.

    J'ai gardé de côté mon code type "cookie", j'y reviendrai à l'occasion.

    J'hésite à mettre "résolu" pour un problème dont je me suis débarrassé en l'abandonnant.
    Merci

Discussions similaires

  1. [Cookies] probleme gestion cookie de session
    Par cyberyan dans le forum Langage
    Réponses: 1
    Dernier message: 13/11/2006, 10h58
  2. Réponses: 4
    Dernier message: 20/06/2006, 13h12
  3. [Sécurité] Gestion du cache / cookies
    Par dug dans le forum Langage
    Réponses: 4
    Dernier message: 25/01/2006, 21h17
  4. [Cookies] PB sessions php et navigation sous imode
    Par hardkmel dans le forum Langage
    Réponses: 8
    Dernier message: 23/12/2005, 12h22
  5. [Cookies] Récupération de cookie de session...
    Par Tizard dans le forum Langage
    Réponses: 1
    Dernier message: 07/12/2005, 14h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo