Setarea cookie-urilor personalizate în WordPress

2 iul. 2011, 06:51:30
Vizualizări: 61.7K
Voturi: 15

Î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:

  1. Î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?
  2. Cum setez corect un cookie în WordPress? setcookie('cookie_name', 'cookie_value', time()+4000); nu pare să salveze niciun cookie în sistemul meu.
5
Comentarii

Ah, am realizat că trebuie să conectez asta la init(). SOLUȚIE: Am creat o funcție în functions.php care să seteze și să verifice cookie-ul. Pentru ca aceasta să funcționeze corect, după definirea funcției, în afara funcției apelează asta: add_action('init', 'nume-funcție');

User User
2 iul. 2011 07:07:04

Îți este permis să răspunzi singur la întrebarea ta...

40XUserNotFound 40XUserNotFound
2 iul. 2011 07:12:22

De fapt, este în mod explicit încurajat. Te rog să răspunzi singur. De asemenea, trimit acest lucru la WordPress.SE, deoarece pare mai potrivit acolo.

User User
2 iul. 2011 07:49:13

Mulțumesc băieți — nu am realizat că există o zonă WordPress. Și mulțumesc pentru pont să mă răspund singur :) Apreciat, +1.

Atticus Atticus
5 iul. 2011 07:34:13

Asigură-te că folosești constantele predefinite pentru cookie-uri pe care WordPress le oferă, verifică acest articol pentru mai multe informații despre cum să setezi, să obții și să ștergi cookie-urile corect https://benmarshall.me/setting-cookies-in-wordpress/

Ben Marshall Ben Marshall
31 iul. 2020 05:20:39
Toate răspunsurile la întrebare 5
5
21

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

16 iun. 2012 16:17:25
Comentarii

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

Damainman Damainman
27 oct. 2013 03:14:25

Pur și simplu adaugă mai multe setcookie()

Nabil Kadimi Nabil Kadimi
27 oct. 2013 03:33:20

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ă?

Damainman Damainman
27 oct. 2013 03:34:37

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

drzaus drzaus
11 dec. 2015 22:07:23

corectare: COOKIE_DOMAIN

drzaus drzaus
11 dec. 2015 23:13:14
0
14

Probabil ar trebui să folosești constantele COOIKEPATH și COOKIE_DOMAIN, care există începând cu WP 3.0

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

Ah, mi-am dat seama că trebuie să conectez asta la init().

SOLUȚIE: Am creat o funcție în functions.php care setează și verifică cookie-ul. Pentru ca aceasta să funcționeze corect, după definirea funcției, apelează în afara ei:

add_action('init', 'nume-functie');
5 iul. 2011 07:33:45
Comentarii

acesta nu este o soluție, te rog adaugă codul complet al funcției tale. în plus, liniuțele în numele funcțiilor nu vor funcționa.

Aurovrata Aurovrata
11 sept. 2020 11:36:27
3

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

    }
27 mai 2016 11:17:58
Comentarii

Te rog să corectezi formatarea codului.

Jevuska Jevuska
27 mai 2016 11:53:27

De asemenea, o scurtă descriere a sursei este foarte utilă.

bueltge bueltge
27 mai 2016 13:40:26

Liniuțe în numele funcțiilor cu siguranță nu vor funcționa.

alpipego alpipego
10 apr. 2020 07:03:52
0

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

28 nov. 2020 19:52:35