Estoy trabajando en WordPress y tengo lo siguiente en mi página functions.php.
Tengo una variedad de 3 estilos diferentes. Mi cookie está haciendo la aleatorización.
if (isset($_COOKIE['style'])){
$style = $_COOKIE['style'];
}
else {
$style = ($rand[$stylearray]);
setcookie('style',$style,time(),COOKIEPATH,COOKIE_DOMAIN,false);
}
Quiero configurarlo para que mi cookie SOLAMENTE caduca cuando se cierra el navegador. Sin embargo, parece que en la actualización de la página (F5) la cookie caduca.
¿Hay alguna manera de configurarlo para que mi cookie solo caduque al cerrar el navegador?
los http://www.w3schools.com/php/func_http_setcookie.asp dice
Optional. Specifies when the cookie expires. The value: time()+86400*30,
will set the cookie to expire in 30 days. If this parameter is omitted
or set to 0, the cookie will expire at the end of the session
(when the browser closes). Default is 0
Asi que
setcookie('style',$style, 0 , ...);
o
setcookie('style',$style, '', ...);
debe trabajar.
-
Wow, eso funcionó totalmente. Seguí haciendo time()+0. ¡Gracias por tu ayuda!
– Sándwich de chuletas de cerdo
29 mayo 2015 a las 15:45
Debe usar session.cookie, el problema es que debe modificar php.ini, dependiendo de la configuración de su servidor web, debe crear un php.ini/php5.ini/.user.ini y poner lo siguiente:
session.cookie_lifetime = 0
0 = significa hasta que se cierre el navegador.
Felipe
No puede detectar si el navegador estaba cerrado o no.
La mejor opción que me viene a la mente es verificar el valor de referencia de la solicitud http.
Si el referente está vacío, entonces el usuario abrió su sitio web directamente (ya sea a través del campo de dirección del navegador o usando un enlace de favoritos guardado, etc.) Si el referente es diferente a su propio dominio, entonces el usuario vino a través de otro sitio, por ejemplo, Google .
$recreate_cookie = false;
$my_domain = '://example.com';
$referer = $_SERVER['HTTP_REFERER'];
if ( ! $referer ) {
// Website opened directly/via favorites
$recreate_cookie = true;
}
if ( false === strpos( $referer, $my_domain ) ) {
// User arrived from a link of some other website
$recreate_cookie = true;
}
if ( $recreate_cookie ) {
// Only name and value are required in your case.
setcookie( 'style', $style );
}
Pero tenga en cuenta que este método tampoco es 100% confiable ya que el usuario puede manipular o deshabilitar la referencia http (por ejemplo, algún complemento del navegador o tal vez mientras usa el modo de incógnito de los navegadores)
Además de la dificultad para detectar si el navegador estaba cerrado, sugiero usar sesiones de PHP para esto.
Las sesiones tienen la ventaja de que puedes almacenar tantos datos como quieras sin ralentizar el sitio web. Cuando abre su sitio web, todos sus las cookies se envían al servidor. Entonces, si tiene muchos datos almacenados en cookies, cada página que se carga transfiere muchos datos de un lado a otro. Por otro lado, una sesión solo transferir una identificación valor para el servidor. El servidor almacenará todos los datos conectados con esa ID en el servidor, ahorrando mucho volumen de transferencia.
if ( ! session_id() ) { session_start(); }
// do the referer check here
if ( $recreate_cookie ) {
$_SESSION['style'] = $style;
}
Tal vez tenga sentido agregar un temporizador que no actualice el estilo durante 15 minutos, de modo que cuando el usuario cierre el navegador y abra su página nuevamente dentro de los 15 minutos, tendrá el mismo estilo que antes.
// do the session start and referer check here
if ( $recreate_cookie ) {
$expires = intval( $_SESSION['style_expire'] );
if ( $expires > time() ) { $recreate_cookie = false; }
}
if ( $recreate_cookie ) {
$_SESSION['style'] = $style;
// Style will not change in the next 15 minutes
$_SESSION['style_expire'] = time() + 15 * 60;
}
(Todo este código no está probado, por lo que es posible que no funcione tal como está, pero supongo que entiende la idea)
Pregunta potencialmente estúpida: ¿por qué no usar
$_SESSION
¿en cambio?– Andrei
29 mayo 2015 a las 15:14