SetCookie nu funcționează deloc
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).
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
Pot plasa acea funcție oriunde și cum mă va anunța despre rezultate? Returnează informația prin echo?
Evan
Da, var_dump() afișează rezultatul prin echo.
Geert
a returnat bool(false) - cookie-ul tot nu este setat. Există vreo posibilitate să facem un chat privat dacă ai un minut liber?
Evan
Nu este posibil acum. Poți inspecta antetele de răspuns HTTP? Caută antetul Set-Cookie.
Geert
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
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
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
Ești sigur că browserul tău acceptă cookie-uri de la domeniul site-ului tău?
Geert
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ă.