SetCookie nu funcționează deloc

19 ian. 2012, 09:23:44
Vizualizări: 13.6K
Voturi: 1

Nu reușesc să setez corect un cookie prin tema WordPress. Am introdus următorul cod la sfârșitul fișierului functions.php din tema mea.

function set_cookie() {
    if (isset($_GET['id'])) {
        $referrerID = $_GET['id'];
        setcookie('referrerid', $referrerID, time() + 3600 * 24, COOKIEPATH, COOKIE_DOMAIN, false);
    }
}
add_action('init', 'set_cookie');

Am încercat chiar să folosesc JavaScript pentru a verifica dacă funcția este executată (și este).

De ce nu se setează cookie-urile mele? (Codul funcționează local - în afara WordPress).

php
0
Toate răspunsurile la întrebare 2
9

Asigurați-vă că antetele HTTP nu au fost deja trimise în momentul în care doriți să setați cookie-ul. Iată cum puteți testa acest lucru:

function set_cookie() {
  var_dump(headers_sent()); // ar trebui să fie bool(false)
  ...

Activarea WP_DEBUG în fișierul config.php vă poate ajuta și în timpul depanării.


Apropo, ar trebui să faceți o filtrare pe $_GET['id']. Această variabilă ar putea conține orice. Convertirea acesteia într-un număr întreg (pozitiv) ar fi o soluție bună:

$referrerID = absint($_GET['id']); // Notă: absint() este o funcție WordPress
19 ian. 2012 10:57:25
Comentarii

Pot plasa acea funcție oriunde și cum mă va anunța despre rezultate? Returnează informația prin echo?

Evan Evan
19 ian. 2012 15:25:34

Da, var_dump() afișează rezultatul prin echo.

Geert Geert
19 ian. 2012 16:04:36

a returnat bool(false) - cookie-ul tot nu este setat. Există vreo posibilitate să facem un chat privat dacă ai un minut liber?

Evan Evan
19 ian. 2012 16:05:51

Nu este posibil acum. Poți inspecta antetele de răspuns HTTP? Caută antetul Set-Cookie.

Geert Geert
19 ian. 2012 16:15:27

Care ar fi cea mai bună metodă de a prelua astfel de antete? Am folosit acest cod acum, dar nu cred că este ceea ce căutai:

foreach (getallheaders() as $name => $value) { echo "$name: $value\n"; }

Evan Evan
19 ian. 2012 16:21:30

Poți folosi un instrument precum Firebug pentru a inspecta cererea HTTP. Un instrument online precum http://www.webpagetest.org/ ar putea face și el treaba.

Geert Geert
19 ian. 2012 17:01:55

Iată rezultatele mele de test - cookie-ul pe care îl setez este "referrerid" cu valoarea "1". SE VEDE bine acolo, de ce crezi că nu se setează corect pe baza acestor rezultate?

http://www.webpagetest.org/result/120119_V7_2XVFT/1/details/cached/

Evan Evan
19 ian. 2012 17:42:45

Ești sigur că browserul tău acceptă cookie-uri de la domeniul site-ului tău?

Geert Geert
19 ian. 2012 17:47:19

EDIT - Da, Chrome acceptă cookie-uri.

Știu că pot folosi cookie-uri (am folosit același cod în afara WordPress și a funcționat bine). Cum pot determina dacă sunt acceptate de la un anumit domeniu? Voi căuta asta între timp.

Evan Evan
19 ian. 2012 17:49:54
Arată celelalte 4 comentarii
0

O altă opțiune este să folosești ob_start(); și ob_end_flush(); din PHP.

Puteți găsi documentație pentru aceste două funcții aici

Modul în care am rezolvat problema mea a fost să apelez aceste două funcții înainte și după tag-urile de deschidere și închidere HTML, astfel:

<?php ob_start(); ?>
<!DOCTYPE html>
<html>
  <head>
  </head>
<body>
  <?php /* Bucla Wordpress și alte coduri de șablon aici */ ?>
</body>
</html>
<?php ob_end_flush(); ?>

Problema întâlnită de mine era apelarea unei funcții globale care folosea setcookie(); din PHP, iar deoarece WordPress procesează pagina progresiv, cookie-ul nu putea fi creat din cauza faptului că antetele paginii fuseseră deja trimise.

Funcția de bufferizare a ieșirii din PHP forțează trimiterea antetelor înainte ca WordPress să proceseze pagina.

Sper că această informație vă este utilă.

29 oct. 2015 23:48:54