SetCookie no funciona correctamente en WordPress

19 ene 2012, 09:23:44
Vistas: 13.6K
Votos: 1

No puedo hacer que una cookie se establezca correctamente en un tema de WordPress. Estoy colocando el siguiente código al final de mi archivo functions.php del 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');

Incluso llegué al punto de usar JavaScript para alertar si el script alcanzaba la función (lo cual sí ocurría).

¿Por qué no se están estableciendo mis cookies? (El código funciona localmente - fuera de WordPress).

php
0
Todas las respuestas a la pregunta 2
9

Asegúrate de que las cabeceras HTTP no se hayan enviado ya en el momento en que deseas establecer la cookie. Así es como puedes probarlo:

function set_cookie() {
  var_dump(headers_sent()); // debería ser bool(false)
  ...

Activar WP_DEBUG en tu archivo config.php también puede ayudar durante la depuración.


Por cierto, realmente deberías aplicar algún filtro a $_GET['id']. Esta variable podría contener cualquier cosa. Convertirla a un entero (positivo) sería de gran ayuda:

$referrerID = absint($_GET['id']); // Nota: absint() es una función de WP
19 ene 2012 10:57:25
Comentarios

¿Puedo colocar esa función en cualquier lugar y cómo me hará saber los resultados? ¿Hace echo de la información?

Evan Evan
19 ene 2012 15:25:34

Sí, var_dump() hace echo de su salida.

Geert Geert
19 ene 2012 16:04:36

Devuelve bool(false) - la cookie todavía no se está estableciendo. ¿Hay alguna forma de que podamos hacer un chat privado si tienes un minuto libre?

Evan Evan
19 ene 2012 16:05:51

No es posible ahora. ¿Podrías inspeccionar los encabezados de respuesta HTTP? Busca el encabezado Set-Cookie.

Geert Geert
19 ene 2012 16:15:27

¿Cuál sería la mejor manera de recuperar esos encabezados? Usé este código recién pero no creo que sea lo que estabas buscando:

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

Evan Evan
19 ene 2012 16:21:30

Puedes usar una herramienta como Firebug para inspeccionar la solicitud HTTP. Una herramienta en línea como http://www.webpagetest.org/ también podría hacer el trabajo.

Geert Geert
19 ene 2012 17:01:55

Aquí están mis resultados de prueba - la cookie que estoy configurando es "referrerid" con el valor de "1". PARECE estar bien allí, ¿por qué crees que no se está configurando correctamente basándote en estos resultados?

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

Evan Evan
19 ene 2012 17:42:45

¿Estás seguro de que tu navegador está aceptando cookies del dominio de tu sitio?

Geert Geert
19 ene 2012 17:47:19

EDITO - Sí, Chrome está aceptando cookies.

Sé que puedo usar cookies (usé el mismo código fuera de WordPress y funcionó bien). ¿Cómo puedo determinar si están aceptando de un dominio particular? Lo buscaré en Google mientras tanto.

Evan Evan
19 ene 2012 17:49:54
Mostrar los 4 comentarios restantes
0

Otra opción es utilizar las funciones de PHP ob_start(); y ob_end_flush();.

Puedes encontrar la documentación sobre estas dos funciones aquí

La forma en que resolví mis problemas fue llamar a estas dos funciones antes y después de las etiquetas de apertura y cierre de HTML, así:

<?php ob_start(); ?>
<!DOCTYPE html>
<html>
  <head>
  </head>
<body>
  <?php /* Bucle de WordPress y otro código de plantilla aquí */ ?>
</body>
</html>
<?php ob_end_flush(); ?>

El problema que estaba enfrentando era al llamar a una función global que utilizaba setcookie(); de PHP, y debido a que WordPress procesa la página progresivamente, la cookie no podía crearse porque las cabeceras de la página ya habían sido enviadas.

La función de buffer de salida de PHP fuerza a que las cabeceras se envíen antes de que WordPress procese la página.

Espero que esto ayude.

29 oct 2015 23:48:54