Setarea cookie-urilor personalizate în WordPress
Încerc să setez cookie-uri pentru a redirecționa utilizatorii care revin către o pagină specifică în cadrul site-ului meu WordPress.
Aș dori câteva sfaturi pentru aceste 2 aspecte:
- În care dintre fișierele PHP din WordPress ar trebui să fie verificate cookie-urile înainte de încărcarea oricărui conținut pentru a gestiona o redirecționare? Există un fișier mai potrivit decât altele pentru acest lucru?
- Cum setez corect un cookie în WordPress?
setcookie('cookie_name', 'cookie_value', time()+4000);
nu pare să salveze niciun cookie în sistemul meu.

1 - Poți verifica cookie-urile și face redirecționarea folosind hook-uri care sunt apelate înainte de orice output, cum ar fi hook-ul 'init':
<?php
// Legăm funcția "redirect()" la acțiunea "init"
add_action('init', 'redirect');
// redirect() poate redirecționa utilizatorul în funcție de cookie-urile pe care le are
function redirect(){
/* COD */
}
?>
2 - Cea mai bună metodă de a seta cookie-uri ar fi folosind hook-ul 'init' astfel:
<?php
add_action('init', 'my_setcookie');
// my_setcookie() setează cookie-ul pe domeniul și directorul în care este instalat WordPress
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);
/* mai multe cookie-uri */
setcookie('my_cookie_name_2', 'my_cookie_value_2', $expiry, $path, $host);
}
?>
Această metodă este mai consistentă, dacă ai un blog la www.example.com/blog, cookie-urile nu vor fi disponibile la
- www.example.com
- www.example.com/store
- example.com
- www2.example.com
- ...
Actualizare
de asemenea, poți folosi constantele COOKIE_PATH și COOKIEDOMAIN în loc să le determini manual, lucru pe care tocmai l-am observat în răspunsul lui Andre R Kohl – drzaus

Cum poți adăuga mai multe variabile, de exemplu Firstname, LastName, Random1, Random2 în loc de doar variabila 'my_cookie_1'?

Oh, nu știam că cookie-urile pot stoca doar o singură variabilă per cookie. Există vreo modalitate de a seta mai multe cookie-uri fără a fi nevoie să repeti codul pentru timp și URL de mai sus, astfel încât să ai mai puțin cod? Ar putea fi puse într-o variabilă?

ar trebui să poți folosi și constantele COOKIEPATH
și COOKIEDOMAIN
în loc să le calculezi singur, lucru pe care tocmai l-am observat în răspunsul lui Andre R Kohl

corectare: COOKIE_DOMAIN

Această metodă a funcționat:
add_action( 'init', 'functie-pentru-setare-cookie' );
function functie-pentru-setare-cookie(){
//folosește o condiție aici, pentru a specifica pe ce pagină dorești să setezi cookie-ul
//alege pagina unde dorești să fie setat cookie-ul
$pageurl = get_option('siteurl').'/setare-cookie-pagina';
// folosește o funcție pentru a obține URL-ul paginii curente și verifică dacă se potrivește
// cu pagina dorită unde dorești să setezi cookie-ul
if ( $pageurl === current_page_url() ) {
setcookie( 'nume_cookie', 'valoare_cookie', $expiryTime, $cale_cookie, $siteurl );
}
}

Vei dori să ștergi cookie-ul înainte ca orice conținut să fie scris pe pagină (înainte ca antetele să fie trimise).
Pentru a seta cookie-ul, include calea, domeniul și recomand să setezi ultimii 2 parametri la true ($secure
și $httponly
). De asemenea, va trebui să furnizezi aceiași parametri funcției setcookie()
când ștergi cookie-ul, cu excepția $expiry
(care ar trebui să fie negativ) și $value
(care ar trebui să fie gol '').
Dacă transmiți JSON prin cookie, se pare că trebuie să-l și base64_encode
, altfel nu va fi decodat corect.
Toate acestea ar trebui făcute într-o clasă, astfel încât să poți accesa valoarea cookie-ului mai târziu în cod. Clasa poate fi adăugată într-un plugin sau în functions.php.
Iată un exemplu în care folosim un cookie pentru a stoca un răspuns de acțiune și apoi îl afișăm utilizatorului după ce îl redirecționăm:
class my_custom_class {
const MY_COOKIE_NAME_JSON = 'my_cookie_name_json';
const COOKIE_LIFETIME = 3600;
private $cookie_value;
function __construct() {
// asigură-te că ștergi cookie-ul înainte ca antetele să fie trimise
add_action('init', [$this, 'process_cookie_json'], 10);
// folosește alerta bootstrap pentru a formata mesajul de return
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;
Poți seta cookie-ul apoi prin:
my_custom_class::some_action_that_sets_the_cookie('mesajul');
