SetCookie semplicemente non funziona

19 gen 2012, 09:23:44
Visualizzazioni: 13.6K
Voti: 1

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).

php
0
Tutte le risposte alla domanda 2
9

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
19 gen 2012 10:57:25
Commenti

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

Evan Evan
19 gen 2012 15:25:34

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

Geert Geert
19 gen 2012 16:04:36

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

Evan Evan
19 gen 2012 16:05:51

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

Geert Geert
19 gen 2012 16:15:27

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

Evan Evan
19 gen 2012 16:21:30

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.

Geert Geert
19 gen 2012 17:01:55

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/

Evan Evan
19 gen 2012 17:42:45

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

Geert Geert
19 gen 2012 17:47:19

MODIFICA - Sì, Chrome sta accettando i cookie.

So che posso usare i cookie (ho usato lo stesso codice al di fuori di WordPress e ha funzionato bene). Come posso determinare se li sta accettando da un dominio particolare? Nel frattempo lo cercherò su Google.

Evan Evan
19 gen 2012 17:49:54
Mostra i restanti 4 commenti
0

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.

29 ott 2015 23:48:54