SetCookie semplicemente non funziona
Non riesco a impostare correttamente un cookie attraverso il tema WordPress. Sto inserendo il seguente codice in fondo alla pagina functions.php
del mio tema.
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');
Sono arrivato persino a usare JavaScript per verificare se lo script raggiungeva la funzione (cosa che faceva).
Perché i miei cookie non vengono impostati?? (Il codice funziona localmente - al di fuori di WordPress).

Assicurati che gli header HTTP non siano già stati inviati nel momento in cui vuoi impostare il cookie. Ecco come puoi verificarlo:
function set_cookie() {
var_dump(headers_sent()); // dovrebbe restituire bool(false)
...
Attivare WP_DEBUG
nel tuo file config.php può essere d'aiuto durante il debug.
A proposito, dovresti applicare qualche filtro a $_GET['id']
. Questa variabile potrebbe contenere qualsiasi cosa. Convertirla in un intero (positivo) sarebbe già un buon passo avanti:
$referrerID = absint($_GET['id']); // Nota: absint() è una funzione di WordPress

Posso posizionare quella funzione ovunque e come mi farà sapere i risultati? Restituirà le informazioni tramite echo?

Sì, var_dump()
restituisce il suo output tramite echo.

ha restituito bool(false) - il cookie però non viene ancora impostato. C'è un modo per fare una chat privata se hai un minuto libero?

Non è possibile al momento. Potresti controllare gli header della risposta HTTP? Cerca l'header Set-Cookie
.

Quale sarebbe il modo migliore per recuperare questi header? Ho usato questo codice proprio ora ma non credo sia quello che cercavi:
foreach (getallheaders() as $name => $value) { echo "$name: $value\n"; }

Puoi usare uno strumento come Firebug per ispezionare la richiesta HTTP. Anche uno strumento online come http://www.webpagetest.org/ potrebbe fare al caso tuo.

Ecco i risultati del mio test - il cookie che sto impostando è "referrerid" con il valore "1". SEMBRA corretto lì, perché non si sta impostando correttamente secondo te in base a questi risultati?
http://www.webpagetest.org/result/120119_V7_2XVFT/1/details/cached/

Sei sicuro che il tuo browser stia accettando cookie dal dominio del tuo sito?

Un'altra opzione è utilizzare le funzioni PHP ob_start();
e ob_end_flush();
.
Puoi trovare la documentazione sulle due funzioni qui
Il modo in cui ho risolto i miei problemi è stato chiamare le due funzioni prima e dopo i tag di apertura e chiusura html in questo modo:
<?php ob_start(); ?>
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<?php /* Ciclo di Wordpress e altro codice del template qui */ ?>
</body>
</html>
<?php ob_end_flush(); ?>
Il problema che stavo riscontrando era la chiamata a una funzione globale che utilizzava setcookie();
di PHP e poiché WordPress elabora la pagina progressivamente, il cookie non poteva essere creato a causa degli header della pagina già inviati.
La funzione di buffering dell'output di PHP forza l'invio degli header prima che WordPress elabori la pagina.
Spero sia utile.
