Impostazione di cookie personalizzati in WordPress
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:
- 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?
- Come posso impostare correttamente un cookie in WordPress?
setcookie('cookie_name', 'cookie_value', time()+4000);
non sembra salvare alcun cookie nel mio sistema.
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

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

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?

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

correzione: COOKIE_DOMAIN

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

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 );
}
}

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