Las cookies fueron inventadas en el año de 1994 por un programador llamado Lou Montulli. Sin ellas, la red sería un lugar muy distinto. Sea que esté entrando al backend de su sitio de WordPress o cerrando una ventana de popup molesta, usted está interactuando todos los días con cookies (sin darse cuenta).

Creo que ya sabe de qué hablamos cuando decimos cookies, queremos decir las cookies guardan información importante del visitante en un sito web, no se trata de los dulces de chocolate. 🍪

Hoy nos enfocaremos en los temas más confusos sobre las cookies y las sesiones de PHP. Específicamente, todo lo que necesita saber sobre como WordPress las usa, junto con problemas comunes de los que debería estar al tanto (especialmente como un desarrollador) cuando se trata de hospedar su sitio web, el código personalizado, o el uso de plugins. En nuestra opinión, este tema no ha sido compartido lo suficiente.

Tipos de Cookies

Hay dos tipos distintos de cookies que son comúnmente establecidos: las cookies de sesión y las cookies persistentes.

Las Cookies de Sesión

Las cookies de sesión, también conocidas como cookies transitorias, son temporales. No tienen una fecha de expiración y solamente almacenan información sobre lo que hace el usuario durante una sola sesión. Una sesión es simplemente generada valor único asignado cuando alguien visita un sitio. Las cookies de sesión son almacenadas temporalmente en la memoria y son automáticamente eliminadas cuando el navegador es cerrado o la sesión termina.

Lectura recomendada ¿Cómo mejorar el límite de memoria de PHP en WordPress?.

Cookies Persistentes

Las cookies persistentes, como ya podría darse cuenta, son las que contienen una fecha de expiración. Estos duran mucho más y son almacenadas en el disco hasta que expiren o sean eliminadas manualmente por el usuario. También son conocidas como “tracking cookies” o cookies de rastreo, ya que estos son tipos de cookies que Google Analytics, AdRoll, Stripe, etc. utilizan.

Nuestro programa de afiliados de Kinsta es otro ejemplo. Se coloca una cookie de 60 días en el navegador del usuario en el momento que dan clic en el enlace de afiliado. Esto asegura que la referencia reciba el crédito correspondiente, incluso si la persona cerró y abrió de nuevo el navegador en múltiples ocasiones.

Cómo WordPress Core Utiliza los Cookies

Cuando nos referimos al core de WordPress, simplemente queremos decir los archivos que forman el proyecto open source, antes de instalar plugins o temas. Es WordPress en su estado más natural.

Ahora que ya conoce lo básico sobre lo que es una cookie y los diferentes tipos, demos un vistazo al por qué y cómo WordPress core las utiliza para crear toda la magia que sucede detrás de escenas. Dato curioso: La cookie originalmente se derivo del término “magic cookie.”

WordPress core utiliza cookies para dos propósitos distintos:

1. Login Cookies

Las cookies de inicio de sesión contienen detalles de autentificación y son usadas cuando un usuario inicia sesión al dashboard de admin de WordPress. De acuerdo al Codex de WordPress, un par de diferentes sesiones de cookies son establecidas:

  • Al iniciar sesión, WordPress utiliza wordpress_[hash] cookie para almacenar detalles de autentificación (limitada al área /wp-admin/).
  • Después de iniciar sesión, WordPress establece la cookie wordpress_logged_in_[hash]. Este indica cuándo usted ha iniciado sesión y quién es usted.
  • Después de login, WordPress configura la wordpress_logged_in_[hash] cookie. Esto indica cuando ha iniciado sesión y quién es usted.

Cuando usted intenta acceder al backend de su sitio de WordPress, se hace una revisión para ver si las dos cookies anteriores existen y no han expirado. Esto es lo que hace que mágicamente pueda saltarse la página de wp-login.php. 😉

WordPress también establece cookies wp-settings-{time}-[UID]. La ID siendo su ID de usuario de la tabla de la base de datos de usuarios de WordPress. Este almacena configuraciones personales del dashboard y de la interfaz del admin.

2. Comment Cookies

Por defecto, se establecen cookies cuando alguien comenta en una publicación de un blog (con una expiración de 347 días). Esto es para que pueda regresar en otro momento y no tenga que llenar de nuevo toda la información. Las siguientes tres cookies son las que se almacenan:

  • comment_author_[hash]
  • comment_author_email_[hash]
  • comment_author_url_[hash]

Sin embargo, con los recientes cambios a la privacidad debido al GDPR, nuevas herramientas han sido introducidas al core de WordPress, para asegurar que usted le permita a los usuarios decidir si quieren recibir cookies. Esta opción, si no es que ya está establecida, puede ser activada en la parte de “Opciones -> Discusión” en el dashboard del admin de WordPress. Seleccione la opción de “Mostrar la casilla de opt-in de cookies en los comentarios.” El popular plugin de Akismet le permite mostrar un aviso de privacidad.

Cómo poner opt-in de cookies en los comentarios
Cómo poner opt-in de cookies en los comentarios

Cómo los Plugins y Temas Externos de WordPress Utilizan las Cookies

Al igual que WordPress utiliza cookies para ciertas funcionalidades, los plugins y temas externos que instale también establecen cookies. La mayoría de estos utilizan una combinación de cookies de navegador y filas de base de datos almacenadas en la tabla de wp_optionso en su propia tabla personalizada. Ya que WordPress es apátrida.

“Una app apátrida es una aplicación que no guarda los datos generados del cliente en una sesión para usarlo en otra sesión con ese mismo cliente. Cada sesión es llevada a cabo como si fuera la primera vez y las respuestas no son dependientes de los datos de la sesión previa.” – TechTarget

Con las nuevas leyes de privacidad, es mucho más importante que antes entender qué cookies están siendo establecidas y si proveen una forma para que los visitantes puedan negarse a recibirlas. Consejo: no todas las cookies requieren un opt-in. Lea nuestro detallado articulo sobre el GDPR para entender mejor los nuevos requerimientos.

Aquí tenemos un par de los muchos ejemplos de como se pueden usar las cookies:

  • Si tiene una casilla popup en su sitio de WordPress y un visitante la cierra. Esto típicamente establecerá una cookie para que no vuelva a ocurrir.
  • Los artículos agregados al carrito de compras de un sitio de ecommerce. Una cookie es almacenada para que su carrito de compra retenga todos los productos mientras sigue navegando en el sitio.
  • Las opciones de IP Geolocation podrían almacenar direcciones IP y coordenadas de latitud/longitud del visitante que se encuentre en el sitio. Esto es típicamente usado para mostrar contenido especifico a una región en especifico o quizás incluso para redirigir al usuario a un subsitio.
  • Rastrear actividad a través de clics con una herramienta para recortar enlaces como el plugin PrettyLinks.
  • Los plugins de noticias podrían establecer una cookie para los usuarios ya inscritos, esto les da la posibilidad de poder esconder la casilla de las noticias completamente.

Esencialmente cualquier acción u opt-in en un sitio de WordPress, típicamente involucra establecer una cookie en el navegador detrás de escenas. El objetivo de todo esto, por supuesto, es intentar mejorar la experiencia de navegación o brindar funcionalidad adicional a través de la verificación.

WooCommerce Cookies

Los plugins de WooComerce típicamente tienen su propias cookies adicionales, para que los compradores puedan agregar fácilmente cosas a su carrito, almacenarlo para otro momento cuando decidan pagar, y cuando inician sesión o se salen de su cuenta.

Para llevar un registro de los datos del carrito, WooCommerce establece las siguientes tres cookies (ninguna información personal es almacenada en dichas cookies):

  • woocommerce_cart_hash
  • woocommerce_items_in_cart
  • wp_woocommerce_session_

Las primeras dos cookies contienen información sobre el carrito y simplemente le ayudan a WooCommerce a conocer cuando los datos del carrito cambien. La tercera cookie wp_woocommerce_session_ contiene un código único por cada cliente, el cual corresponde a una entrada en la tabla personalizada de wp_woocommerce_sessions en la base de datos.

Tabla de wp_woocommerce_sessions
Tabla de wp_woocommerce_sessions

Los datos wp_commerce_session_previamente almacenados en la tablawp_options, fue trasladado a su propia tabla personalizada en WooCommerce 2.5, cuando introdujeron un nuevo controlador de sesión. Esto fue para mejorar el desempeño, escalabilidad, y control de sesiones. Si no fuera así, rápidamente terminaría con una tabla de wp_options repleta, y tendría que limpiarla.

Easy Digitial Downloads Cookies

Easy Digital Downloads por defecto utiliza WP Session, el cual es una combinación de cookies de navegador y filas de base de datos almacenadas en la tabla de wp_options. Abajo podrá ver la cookie que establece:

  • edd_items_in_cart

Cookies y WordPress Caching

Cuando se trata de la WordPress caching, es cuando se ponen complejas las cosas. La cache esencialmente es el proceso de almacenar recursos de una petición y reusar esos mismos recursos para peticiones subsecuentes. Básicamente, reduce la cantidad de trabajo requerido para generar una página. Mientras que esto es fantástico para el desempeño, esto causa un problema cuando se trata de las cookies.

¿Por qué? Porque las cookies están ahí para llevar a cabo cierta acción, como mantener el carrito de compras activo mientras sigue navegado en el mismo sitio de WooCommerce. Sin embargo, si una página es servida de la cache, ni PHP ni la base de datos hará algo, el servidor simplemente servirá una copia estática de la página.

Así que, ¿Qué puede hacer?

1. Utilizar JavaScript

La primera opción sería utilizar JavaScript y actualizar dinámicamente el contenido en una página. Básicamente, usted tiene sus marcadores de HTML y utiliza JavaScript para recibir información vía una API o llamada ajax.

Un ejemplo sería cargar la lista de publicación en la barra lateral de WordPress al usar JavaScript para obtener listas de publicaciones sobre la wp-api y luego hacerles visualizar en la barra lateral. En este escenario usted podría actualizar la lista de publicaciones sin limpiar la página desde la cache, ya que los datos son dinámicamente generados.

La verdad, esto no es ideal, siempre es mejor cachear los datos si es posible en términos de desempeño. Pero si necesita que un poco de contenido se mantenga dinámico mientras que la página se mantiene estática (servida desde la cache), hay una forma de hacer esto – utilice JavaScript para jalar dinámicamente el contenido para esa parte de la página a través de la API/llamada ajax. Sin embargo, al menos que quiera contratar a un desarrollador de WordPress para construirle una solución de Java Script o una extensión de un plugin, esta opción realmente no es muy práctica.

2. Usar Llamadas Admin-Ajax

Admin-ajax.php no puede ser almacenado en la cache, así que, usted podría utilizar admin-ajax calls. Un buen ejemplo de esto es el plugin de No Cache AJAX Widgets. Hace llamadas admin-ajax y por lo tanto no tiene que preocuparse sobre tener conflictos a nivel servidor o buscar soluciones de cache externas.

Sin embargo, como con JavaScript, elegir esta ruta no es siempre viable para el usuario promedio. Ya que puede causar otros problemas de desempeño, como alto uso de admin-ajax y muchas peticiones no almacenadas en la cache.

3. Excluir Páginas de la Cache (Cuando la Cookie Está Presente)

Al menos de que pueda tomar la ruta de JavaScript o de admin-ajax, excluir páginas de la cache cuando hay una cookie especifica presente es la mejor ruta a tomar. Esto es típicamente lo que se recomienda, especialmente para aquellos que tengan sitios altamente dinámicos como WooCommerce y Easy Digital Downloads.

En Kinsta, ciertas páginas de WooCommerce y de Easy Digital Downloads como el carrito, mi cuenta y de pago, son automáticamente excluidas de la cache. Hay una regla a nivel servidor para que los usuarios puedan saltarse la cache cuando la cookie woocommerce_items_in_cart o la cookie edd_items_in_cart sea detectada, para asegurar un proceso de pago grato y sincronizado.

También pensamos sobre las cookies asociadas al inicio de sesión y establecemos la cache para saltarse esto cuando detectamos que alguien ha iniciado sesión con WordPress. Esto previene que el dashboard del back accidentalmente sea almacenado en la cache.

Por defecto, no excluimos la cookie wp_woocommerce_session_ del caché. La mayoría de los sitios WooCommerce en nuestra experiencia no tienen ningún problema. Esto también mejora el rendimiento al aumentar la relación de HIT de su caché, a la vez que utiliza menos PHP workers.

Sin embargo, debido a que hay muchas configuraciones diferentes de temas y plugins de WordPress, podemos excluir la cookie wp_woocommerce_session_ del caché si es necesario. Simplemente comuníquese con nuestro equipo de soporte. El resultado es que una vez que un usuario agrega un producto a su carrito de compras, todas las solicitudes subsiguientes no serán servidas desde el caché, aumentando el uso de los PHP workers.

Si necesita que algunas páginas personalizadas sean excluidas de la cache, siéntase libre de abrir un ticket con nuestro equipo de soporte. De nuevo, usted debe ser muy cuidadoso cuando se trata de las exclusiones. Si tiene demasiadas páginas sin cache podría deteriorar el desempeño. Cheque nuestra lista de lo que se debe hacer y no hacer para hospedar sitios de membresías de WordPress.

Cómo Ver y Limpiar Cookies

Es fácil ver y limpiar cookies en un sitio. Para ver qué cookies han sido establecidas en un sitio en especifico, entre a ese sitio y haga clic en el pequeño candado en la parte superior. Luego de clic en “Cookies.”

Cookies en uso
Cookies en uso

Luego vaya al folder del sitio. En el ejemplo de abajo puede que tengamos establecidas algunas cookies de WooCommerce, al igual que la cookie de wordpress_logged_in_[hash]. También podrá ver el tiempo de expiración y si la cookie es persistente o de sesión (cuando la sesión de navegación termine).

Cookies de WordPress
Cookies de WordPress

Para eliminar una cookie, simplemente de clic en una cookie individual y luego de clic en el botón de “Remover”. También puede hacer esto a nivel del folder o con Chrome DevTools.

Limpiar cookies también puede ayudarte a solucionar el error 304.

De forma alternativa, puede buscar la opción de limpiar todas las cookies en su navegador.

GDPR y Cookies

GDPR es una nueva ley de privacidad que entró en efecto el 25 de Mayo de 2018. Fue diseñada para darle de vuelta a los ciudadanos el control de sus datos personales. Recomendamos ampliamente leer este detallado articulo: la verdad sobre el cumplimiento del GDPR si aún no lo ha leído. ¡Esto no es un tema que no puede ser resumido en un párrafo!

Aquí tenemos un ejemplo de un cambio que hicimos en Kinsta para ayudar a cumplir con la nueva ley. Cuando usted visita por primera vez nuestro sitio es posible que ya lo haya visto, usted se encontrará con la opción de “Aceptar Cookies” en la parte inferior de la pantalla. Esto es porque ahora legalmente requerimos darles a los usuarios una forma para decidir si quieren recibir cookies o no. Los días en los que uno recolectaba toda la información sin problema alguna ya se han terminado.

Aceptando las cookies

Si usted da clic en “Aceptar Cookies”, todas las cookies son establecidas para el usuario. Si da clic en “Opciones de Cookie,” ahora brindamos una forma de decidir si uno quiere recibir cookies o no.

Opciones de cookies
Opciones de cookies

Genial, ¿no? Nuestra solución a las cookies fue hecha en casa por nuestros desarrolladores, pero hay un par de plugins útiles de GDPR para WordPress que podrán ser de ayuda para conseguir algo similar. De nuevo, las cookies son una pequeña parte de lo necesario para cumplir con todo requerido por el GDPR.

Sesiones de PHP

Las sesiones PHP es un enfoque alternativo al clásico uso de cookies. Sigue siendo una cookie, pero es llamada PHPSESSID y es normalmente almacenada en el directorio /tmp/ del mismo servidor web. La forma en que el servidor sabe que tiene que asociar una sesión con una petición es que también es almacenada en una HTTP cookie.

PHPSESSID HTTP cookie
PHPSESSID HTTP cookie

Este también puede ser visto debajo del encabezado HTTP para un sitio.

Cookie PHPSESSID para encabezado HTTP
Cookie PHPSESSID para encabezado HTTP

Una sesión PHP es como cualquier sesión normal la cual termina cuando el usuario cierra el navegador.

El problema con las sesiones de PHP es el desempeño y los problemas de cach. La información que está almacenada en la cookie del navegador tiene que rebotar de vuelta una y otra vez con cada petición, para que el servidor sepa quién es ese usuario. Esto quiere decir, para sitios que utilizan PHPSESSID, que el host tendría que establecer el PHPSESSID para saltarse la cache. Sin embargo, el resultado es que este PHPSESSID tendría que ser establecido para saltarse todo esto el 100% de las veces, porque a diferencia del wordpress_logged_in, el PHPSESSID está establecido en una sola petición PHP.

Así que imagínese que el wordpress_logged_in tenga que ser establecido el 100% de las veces para permitir que trabaje la funcionalidad de inicio de sesión. Queriendo decir que incluso los usuarios que no tengan sesión tendrían que tener la cookie y tendría que ser únicamente para ellos. Imagine que esto fuese necesario para poder lograr que funcione el sistema de inicio de sesión de WordPress. En este escenario, cada visita de página tendría que saltarse la cache para el que la cookie de wordpress_logged_in fuese establecida de forma correcta para los usuarios en sesión y fuera de sesión.

Este es el problema al usar PHPSESSID. Porque es generado en cada petición de PHP, si un sitio depende de cookies PHPSESSID, el host tendría que establecer PHPSESSID para saltarse la cache siempre. Si no es así, el PHPSESSID terminaría en la cache y desorganizaría cualquier funcionalidad que depende del mismo.

No recomendamos utilizar sesiones de PHP y usualmente estos no funcionarán en nuestros entornos de Kinsta. Las sesiones de PHP también tienen otras implicaciones de seguridad que deberían ser consideradas.

Si usted ve código utilizando session_start en su sitio, esto quiere decir que está utilizando sesiones de PHP.

Muchos desarrolladores de temas y de plugins han empezado a usar una combinación de cookies de navegador y filas de bases de datos (sea en la tabla de wp_options o en su propia tabla personalizada). Si usted necesita datos de sesión, esto termina siendo el mejor enfoque.

Siéntase libre de ponerse en contacto con el equipo de soporta si tiene más preguntas sobre las sesiones de PHP.

Resumen

Es probable que ahora ya sepa un poco más sobre cómo funcionan las cookies de WordPress y sobre las sesiones de PHP. Las cookies actualmente son lo que hace que funcione el mundo y son demasiado importantes para casi todo lo que sucede en un sitio de WordPress. Desde mantenernos dentro de una sesión, asegurar que tengamos una buena experiencia de compra e incluso para asegurar que una ventana de popup se mantenga cerrada.

¿Tiene otra pregunta sobre las cookies? 🍪 Por favor comparta en la parte de comentarios.

Brian Jackson

Brian tiene una gran pasión por WordPress, lo ha estado utilizando durante más de 10 años e incluso ha desarrollado un par de plugins premium. Brian disfruta de los blogs, las películas y el senderismo. Conéctese con Brian en Twitter.