Impostazione di cookie personalizzati in WordPress

2 lug 2011, 06:51:30
Visualizzazioni: 61.7K
Voti: 15

Sto cercando di impostare dei cookie per reindirizzare gli utenti di ritorno a una pagina specifica all'interno del mio sito WordPress.

Vorrei un consiglio su questi 2 aspetti:

  1. In quali file PHP di WordPress dovrebbero essere controllati i cookie prima di caricare qualsiasi contenuto per gestire un reindirizzamento? C'è un file più appropriato di altri dove inserire questo codice?
  2. Come posso impostare correttamente un cookie in WordPress? setcookie('cookie_name', 'cookie_value', time()+4000); non sembra salvare alcun cookie nel mio sistema.
5
Commenti

Ah, ho capito che dovevo collegarlo all'init(). SOLUZIONE: ho creato una funzione in functions.php che imposta e controlla il cookie. Per farlo funzionare correttamente, dopo aver definito la funzione, al di fuori della funzione chiama questo: add_action('init', 'nome-funzione');

User User
2 lug 2011 07:07:04

Ti è permesso rispondere alla tua stessa domanda...

40XUserNotFound 40XUserNotFound
2 lug 2011 07:12:22

In effetti, è esplicitamente incoraggiato. Per favore, rispondi tu stesso. Lo sto anche inviando a WordPress.SE, dato che sembra più appropriato lì.

User User
2 lug 2011 07:49:13

Grazie ragazzi -- non mi ero reso conto che ci fosse un'area dedicata a WordPress. E grazie per il suggerimento di rispondere da solo :) Apprezzato, +1.

Atticus Atticus
5 lug 2011 07:34:13

Assicurati di utilizzare le costanti per i cookie predefinite che WordPress offre, dai un'occhiata a questo articolo per maggiori informazioni su come impostare, ottenere ed eliminare correttamente i cookie https://benmarshall.me/setting-cookies-in-wordpress/

Ben Marshall Ben Marshall
31 lug 2020 05:20:39
Tutte le risposte alla domanda 5
5
21

1 - Puoi verificare i cookie e fare il redirect utilizzando hook che vengono chiamati prima di qualsiasi output come l'hook 'init':

<?php

// Aggancia la funzione "redirect()" all'azione "init"
add_action('init', 'redirect');

// redirect() può reindirizzare l'utente in base ai cookie che possiede
function redirect(){
  /* CODICE */
}

?>

2 - Il modo migliore per impostare i cookie è utilizzare l'hook 'init' in questo modo:

<?php

add_action('init', 'my_setcookie');

// my_setcookie() imposta il cookie sul dominio e directory dove è installato WP
function my_setcookie(){
  $path = parse_url(get_option('siteurl'), PHP_URL_PATH);
  $host = parse_url(get_option('siteurl'), PHP_URL_HOST);
  $expiry = strtotime('+1 month');
  setcookie('my_cookie_name_1', 'my_cookie_value_1', $expiry, $path, $host);
  /* altri cookie */
  setcookie('my_cookie_name_2', 'my_cookie_value_2', $expiry, $path, $host);
}

?>

Questo approccio è più coerente, se hai un blog su www.example.com/blog, il/i cookie non saranno disponibili su

  • www.example.com
  • www.example.com/store
  • example.com
  • www2.example.com
  • ...

Aggiornamento

potresti anche utilizzare le costanti COOKIE_PATH e COOKIEDOMAIN invece di calcolarle autonomamente, cosa che ho notato solo ora nella risposta di Andre R Kohl – drzaus

16 giu 2012 16:17:25
Commenti

Come puoi inserire più variabili, ad esempio Firstname, LastName, Random1, Random2 invece della singola variabile 'my_cookie_1'?

Damainman Damainman
27 ott 2013 03:14:25

Devi semplicemente aggiungere più setcookie()

Nabil Kadimi Nabil Kadimi
27 ott 2013 03:33:20

Oh, non sapevo che i cookie possono contenere solo una variabile per cookie. C'è un modo per impostare più cookie senza dover ripetere il codice per il tempo e l'URL ogni volta, in modo da avere meno codice? Possono essere inseriti in una variabile?

Damainman Damainman
27 ott 2013 03:34:37

dovresti anche poter utilizzare le costanti COOKIEPATH e COOKIEDOMAIN invece di doverle calcolare da solo, cosa che ho appena notato nella risposta di Andre R Kohl

drzaus drzaus
11 dic 2015 22:07:23

correzione: COOKIE_DOMAIN

drzaus drzaus
11 dic 2015 23:13:14
0
14

Probabilmente dovresti utilizzare le costanti COOIKEPATH e COOKIE_DOMAIN, esistenti da WP 3.0

setcookie("your_cookie", $your_value, time()+3600, COOKIEPATH, COOKIE_DOMAIN);
19 apr 2014 10:32:01
1

Ah, ho capito che dovevo agganciare questo all'init().

SOLUZIONE: Ho creato una funzione in functions.php che imposta e verifica il cookie. Per farlo funzionare correttamente, dopo aver definito la funzione, all'esterno della funzione chiama questo:

add_action('init', 'nome-funzione');
5 lug 2011 07:33:45
Commenti

questa non è una soluzione, per favore aggiungi il codice completo della tua funzione, inoltre i trattini nei nomi delle funzioni non funzioneranno.

Aurovrata Aurovrata
11 set 2020 11:36:27
3

Questo metodo ha funzionato:

    add_action( 'init', 'function-to-setcookie' ); 

    function function-to-setcookie(){

        //usa una condizione qui per specificare in quale pagina vuoi impostare il cookie
        //scegli una pagina dove desideri che il cookie venga impostato
        $pageurl = get_option('siteurl').'/set-cookie-page'; 

       // usa una funzione per ottenere l'URL corrente e applica una condizione
       //per confrontarlo con la pagina desiderata dove vuoi impostare il cookie
       if ( $pageurl === current_page_url() ) {
           setcookie( 'cookie_name', 'cookie_value', $expiryTime, $cookiepath, $siteurl );
         }

    }
27 mag 2016 11:17:58
Commenti

Per favore, correggi la formattazione del tuo codice.

Jevuska Jevuska
27 mag 2016 11:53:27

Inoltre, una breve descrizione della sorgente è davvero utile.

bueltge bueltge
27 mag 2016 13:40:26

I trattini nei nomi delle funzioni sicuramente non funzioneranno.

alpipego alpipego
10 apr 2020 07:03:52
0

Dovrai eliminare il tuo cookie prima che qualsiasi contenuto venga scritto nella pagina (prima che gli header siano inviati).

Per impostare il cookie, includi il percorso, il dominio e ti consiglio anche di impostare gli ultimi 2 parametri a true ($secure e $httponly). Dovrai fornire gli stessi parametri a setcookie() anche quando elimini, ad eccezione di $expiry (che dovrebbe essere negativo) e $value (che dovrebbe essere vuoto '').

Se stai passando json attraverso il cookie, sembra che tu debba anche utilizzare base64_encode, altrimenti non verrà decodificato correttamente.

Tutto questo dovrebbe essere fatto in una classe così da poter accedere al valore del cookie successivamente nel tuo codice. La classe può essere aggiunta a un plugin o al functions.php.

Ecco un esempio in cui usiamo un cookie per memorizzare una risposta di azione per poi mostrarla all'utente dopo averlo reindirizzato:

class my_custom_class {

    const MY_COOKIE_NAME_JSON = 'my_cookie_name_json';
    const COOKIE_LIFETIME = 3600;

    private $cookie_value;

    function __construct() {
        // assicurati di eliminare il cookie prima che gli header siano inviati
        add_action('init', [$this, 'process_cookie_json'], 10);
        // usa l'alert di bootstrap per formattare il messaggio di ritorno
        add_filter('the_content', [$this, 'filter_the_content_in_the_main_loop'], 1);
    }
    
    static function some_action_that_sets_the_cookie($message, $response_type = 'success') {
        $responses = [];
        if (isset($_COOKIE[self::MY_COOKIE_NAME_JSON]))
            $responses = json_decode(base64_decode($_COOKIE[self::MY_COOKIE_NAME_JSON]));
        $responses[$response_type][] = $message;
        self::set_cookie_json($responses);
    }
    
    static function set_cookie_json(array $cookie_value) {
        setcookie(self::MY_COOKIE_NAME_JSON, base64_encode(json_encode($cookie_value)), time() + self::COOKIE_LIFETIME, "/", $_SERVER['HTTP_HOST'], true, true);
    }
    
    function process_cookie_json() {
        if (!isset($_COOKIE[self::MY_COOKIE_NAME_JSON]))
            return false;
        $this->cookie_value = json_decode(base64_decode($_COOKIE[self::MY_COOKIE_NAME_JSON]), true);
        setcookie(self::MY_COOKIE_NAME_JSON, '', -1, "/", $_SERVER['HTTP_HOST'], true, true);
        unset($_COOKIE[self::MY_COOKIE_NAME_JSON]);
    }

    function filter_the_content_in_the_main_loop($content) {
        if (!$this->cookie_value || !is_array($this->cookie_value))
            return $content;
        $alerts = [];
        foreach ($this->cookie_value as $response_type => $messages)
            $alerts[] = '<div class="alert alert-' . $response_type . '" role="alert">' . implode(PHP_EOL, $messages) . '</div>';
        return implode(null, $alerts) . $content;
    }

}

$my_custom_class = my_custom_class;

Puoi quindi impostare il cookie tramite:

my_custom_class::some_action_that_sets_the_cookie('il messaggio');

28 nov 2020 19:52:35