Descubre cómo funciona un carrito WooCommerce por dentro: sesiones, base de datos, hooks y puntos clave para optimizar la experiencia de compra.
Tabla de contenidos
- El carrito de WooCommerce no es solo una lista de productos
- La sesión: el núcleo invisible del carrito
- El objeto WC_Cart: dónde vive la lógica
- Hooks del carrito: dónde interviene el código personalizado
- El flujo completo: desde «Añadir al carrito» hasta el checkout
- Cómo afecta la caché al carrito
- Fragmentos de carrito: la magia del mini-carrito
- Carrito persistente: cuando el usuario vuelve días después
- Personalización del carrito: qué se puede y qué se debe evitar
- Diagnóstico rápido: por qué el carrito deja de funcionar
- Preguntas frecuentes sobre el carrito WooCommerce
El carrito de WooCommerce no es solo una lista de productos
Cuando un usuario hace clic en «Añadir al carrito» en una tienda WooCommerce, parece un gesto trivial. Pero detrás de esa acción hay un sistema técnico bastante más complejo de lo que aparenta. Entender cómo funciona un carrito WooCommerce en profundidad permite tomar mejores decisiones de desarrollo, diagnosticar problemas con rapidez y evitar personalizaciones que rompan la experiencia de compra. Esta guía cubre el funcionamiento interno del carrito: desde el almacenamiento de sesión hasta los hooks que permiten modificarlo, pasando por los datos que gestiona y los puntos donde más frecuentemente falla.
La sesión: el núcleo invisible del carrito
El carrito de WooCommerce se apoya en un sistema de sesiones propio que no depende del mecanismo de sesiones nativo de PHP, aunque puede utilizarlo como fallback. Por defecto, WooCommerce usa la clase WC_Session_Handler, que almacena los datos del carrito en la tabla wp_woocommerce_sessions de la base de datos, identificando cada visitante mediante una cookie llamada woocommerce_cart_hash junto con woocommerce_session_{hash}.
Esto tiene implicaciones directas. Si el servidor o el plugin de caché interfiere con estas cookies, el carrito aparecerá vacío al redirigir al usuario, porque el servidor no puede asociar la sesión con el visitante. Es el problema más habitual en instalaciones con caché agresiva mal configurada: la página se sirve desde caché pero la sesión de usuario no viaja con ella.
Los datos que se guardan en sesión incluyen:
- IDs de productos y variaciones seleccionadas
- Cantidades por línea de pedido
- Datos de cupones aplicados
- Totales calculados (subtotal, impuestos, envío)
- Metadatos personalizados añadidos por plugins o código propio
Cada vez que el usuario modifica el carrito, WooCommerce actualiza esta entrada en base de datos y regenera el hash del carrito. Ese hash se usa también para detectar cambios y refrescar el mini-carrito via AJAX.
El objeto WC_Cart: dónde vive la lógica
La clase central que orquesta todo es WC_Cart, accesible en tiempo de ejecución a través de WC()->cart. Este objeto se inicializa cuando se carga la sesión y contiene todos los métodos que añaden, eliminan o modifican ítems. Los más relevantes desde el punto de vista del desarrollo son:
add_to_cart(): añade un producto y devuelve la clave única del ítem en el carrito.remove_cart_item(): elimina un ítem por su clave.get_cart(): devuelve el array completo de ítems con toda su información.calculate_totals(): recalcula precios, impuestos y envíos según el estado actual.get_cart_contents_count(): devuelve el número de unidades en el carrito, útil para actualizar el contador en la cabecera.
Comprender esta estructura es clave cuando se trabaja en personalizaciones: cualquier lógica que modifique precios o añada campos extra debe engancharse correctamente a este flujo para no generar inconsistencias entre lo que ve el usuario y lo que se procesa en el pedido.
Hooks del carrito: dónde interviene el código personalizado
WooCommerce expone un sistema de hooks de WordPress (actions y filters) que permiten modificar el comportamiento del carrito sin tocar el núcleo. Este es el mecanismo correcto para personalizar: no modificar archivos del plugin directamente, sino engancharse a los puntos de extensión diseñados para ello.
Algunos hooks fundamentales del carrito:
- woocommerce_add_to_cart: se dispara justo después de añadir un producto. Útil para lógica de seguimiento o notificaciones.
- woocommerce_cart_item_price: filter que permite modificar el precio mostrado por línea de ítem. Se usa para descuentos dinámicos o precios por usuario.
- woocommerce_cart_item_subtotal: similar al anterior, pero para el subtotal por línea.
- woocommerce_before_calculate_totals: se ejecuta antes del cálculo de totales. Es el hook correcto para modificar precios antes de que WooCommerce los procese, por ejemplo en reglas de precios por volumen.
- woocommerce_cart_item_removed: permite ejecutar lógica cuando se elimina un ítem, como actualizar un registro de inventario externo.
- woocommerce_cart_is_empty: filter que controla si WooCommerce considera el carrito vacío, útil para casos de carritos condicionales.

Usar estos hooks correctamente es la diferencia entre una personalización robusta y una que rompe en la siguiente actualización de WooCommerce.
El flujo completo: desde «Añadir al carrito» hasta el checkout
Vale la pena recorrer paso a paso qué ocurre técnicamente desde que el usuario pulsa el botón hasta que llega a la página de pago:
- Petición AJAX o recarga: según la configuración y el tema, añadir al carrito puede funcionar via AJAX (sin recarga de página) o con redirección directa a la página de carrito. WooCommerce llama al endpoint
/?wc-ajax=add_to_cart. - Validación del producto: WooCommerce comprueba que el producto existe, tiene stock disponible, y que las variaciones seleccionadas son válidas.
- Generación de la clave del ítem: se genera un hash único (cart item key) que identifica esa combinación de producto, variación y metadatos. Dos ítems iguales con el mismo metadato comparten clave y suman cantidad; si los metadatos difieren, se crean líneas separadas.
- Escritura en sesión: el array del carrito se actualiza en
wp_woocommerce_sessionscon los nuevos datos. - Respuesta al navegador: si es AJAX, WooCommerce devuelve el fragmento del mini-carrito actualizado y el contador de ítems. El tema recibe este fragmento y lo reemplaza en el DOM.
- Cálculo de totales: cuando el usuario visita la página de carrito,
calculate_totals()procesa impuestos según la geolocalización del cliente, aplica cupones activos, consulta las reglas de envío y actualiza todos los subtotales. - Paso al checkout: al ir al checkout, WooCommerce transfiere los datos del carrito activo al objeto de pedido temporal, desde donde se gestionará el pago y la confirmación.
Cómo afecta la caché al carrito
Este es quizá el punto donde más proyectos tienen problemas. Las páginas de carrito y checkout no deben ser cacheadas. WooCommerce añade la cookie woocommerce_items_in_cart cuando hay productos en el carrito, precisamente para que los plugins de caché puedan excluir automáticamente estas páginas.
Sin embargo, cada plugin de caché gestiona esto de forma diferente. WP Rocket, por ejemplo, tiene configuración nativa para WooCommerce que excluye automáticamente carrito, checkout y «Mi cuenta». LiteSpeed Cache y W3 Total Cache requieren configuración manual más cuidadosa. El problema típico: el servidor sirve una versión cacheada de la página de carrito que no refleja los ítems reales del usuario, generando confusión y abandonos.
Además, los plugins de caché de objetos (Redis, Memcached) pueden interferir con el almacenamiento de sesiones si no se configuran para distinguir entre caché de página y caché de datos de usuario. Un desarrollador que no entiende este punto puede pasar horas buscando un bug que en realidad es un problema de caché.
Fragmentos de carrito: la magia del mini-carrito
WooCommerce usa un sistema llamado «cart fragments» para actualizar el mini-carrito (ese pequeño icono con el contador en la cabecera) sin recargar la página. Funciona así: en cada carga de página, WooCommerce hace una petición AJAX a /?wc-ajax=get_refreshed_fragments para obtener el HTML actualizado del mini-carrito.
Este comportamiento, aunque conveniente para la experiencia de usuario, puede generar problemas de rendimiento en sitios con mucho tráfico: cada visita dispara una petición AJAX extra, lo que aumenta la carga del servidor. Hay soluciones para esto, como desactivar los fragmentos en páginas donde no hay carrito visible, o diferir la petición hasta que el usuario interactúa con el sitio.
El sistema de fragmentos también es extensible: se pueden añadir elementos propios al array de fragmentos usando el filter woocommerce_add_to_cart_fragments, lo que permite actualizar cualquier elemento del DOM (no solo el mini-carrito) cuando el carrito cambia.
Carrito persistente: cuando el usuario vuelve días después
WooCommerce incluye una funcionalidad de carrito persistente para usuarios registrados. Cuando un usuario con sesión iniciada añade productos al carrito y cierra el navegador, al volver a entrar encuentra sus productos guardados. Esto se almacena en la meta del usuario (wp_usermeta), no en la tabla de sesiones temporal.
Para usuarios anónimos, el carrito se mantiene mientras la cookie de sesión esté vigente. Por defecto, la sesión dura 48 horas de inactividad, pero este valor es configurable mediante el filter wc_session_expiring y wc_session_expiration.
El carrito persistente para usuarios registrados puede activarse o desactivarse desde WooCommerce > Ajustes > Cuentas y privacidad. Para tiendas B2B con listas de pedido complejas, mantenerlo activo es fundamental para no frustrar al comprador habitual que construye pedidos durante días.
Personalización del carrito: qué se puede y qué se debe evitar
Una duda frecuente en proyectos WooCommerce es hasta dónde personalizar el carrito y cómo hacerlo correctamente. Las opciones principales son:
Personalización via hooks (recomendada)
Como se ha descrito, los hooks de WooCommerce son el método correcto. Permiten añadir columnas a la tabla del carrito, mostrar metadatos personalizados por ítem (como grabados, dedicatorias o configuraciones de producto), modificar precios dinámicamente, o añadir mensajes contextuales según los productos en el carrito.
Personalización del template
WooCommerce permite sobrescribir sus plantillas copiando los archivos de woocommerce/templates/ a tu-tema/woocommerce/. El template del carrito es cart/cart.php. Este enfoque da control total sobre el HTML, pero implica mantenimiento: cada vez que WooCommerce actualiza ese template, hay que revisar si los cambios deben incorporarse a la copia personalizada.
Constructores de páginas (con cautela)
Algunos page builders ofrecen bloques específicos de carrito WooCommerce. El bloque nativo de WooCommerce en el editor de bloques es la opción más estable. Los constructores de terceros pueden crear dependencias problemáticas o generar conflictos con plugins de carrito avanzados. Es un camino que requiere pruebas exhaustivas antes de llevarlo a producción.
Diagnóstico rápido: por qué el carrito deja de funcionar
Cuando el carrito falla en un proyecto WooCommerce, los síntomas más comunes y sus causas suelen seguir un patrón predecible:
- Carrito siempre vacío: problema con cookies (HTTPS incorrecto, dominio mal configurado) o caché sirviendo páginas sin sesión.
- El carrito no se actualiza al añadir productos: conflicto de JavaScript entre el tema y WooCommerce, o petición AJAX bloqueada por un plugin de seguridad.
- Los totales no cuadran: un plugin modifica precios via
woocommerce_before_calculate_totalscon lógica incorrecta, o hay conflicto entre plugins de precios y cupones. - El mini-carrito no se actualiza: el tema no incluye el hook
woocommerce_cart_link_fragmentcorrectamente, o un plugin elimina la petición de fragmentos. - Pérdida de datos de carrito entre páginas: sesiones no persistidas correctamente, a veces causado por balanceadores de carga sin sticky sessions en entornos de hosting compartido con múltiples nodos.
Preguntas frecuentes sobre el carrito WooCommerce
¿El carrito WooCommerce guarda datos en cookies o en base de datos?
Ambas cosas. La cookie identifica al visitante, pero los datos del carrito se almacenan en la tabla wp_woocommerce_sessions de la base de datos. La cookie actúa como llave; la base de datos contiene el contenido.
¿Puedo tener varios carritos simultáneos para el mismo usuario?
No de forma nativa. WooCommerce gestiona un único carrito activo por sesión. Para casos de uso como carritos múltiples o listas de compra, se necesitan plugins específicos o desarrollo personalizado.
¿Qué ocurre con el carrito si el usuario no completa la compra?
La sesión expira tras 48 horas de inactividad (configurable). Para usuarios registrados, el carrito se guarda en su perfil. Los plugins de recuperación de carrito abandonado capturan el email del usuario durante el checkout y envían recordatorios si no completa la compra, antes de que la sesión expire.
¿Afecta el número de productos en el carrito al rendimiento?
Con decenas de ítems distintos, sí puede haber impacto, especialmente en el cálculo de totales con impuestos complejos o reglas de envío elaboradas. En catálogos B2B con pedidos de 50-100 líneas, optimizar el proceso de calculate_totals() puede ser necesario.
¿Cómo funciona el carrito con productos variables?
Cada combinación de variación (talla, color, etc.) genera una clave de carrito diferente. Si el usuario añade la misma variación dos veces, WooCommerce suma la cantidad en lugar de crear una línea nueva. Si añade dos variaciones distintas del mismo producto, aparecen como líneas separadas.
Si estás evaluando cómo estructurar o mejorar el carrito de tu tienda WooCommerce, en mi página de servicios puedes ver con qué tipo de proyectos trabajo habitualmente y qué enfoque aplico en cada caso.
Mi opinión como desarrollador WordPress
Lo que más me encuentro en proyectos heredados es que nadie documentó cómo se configuraron las sesiones o qué hooks modifican los precios del carrito. Cuando algo falla meses después de la puesta en marcha, reconstruir esa lógica desde cero consume mucho más tiempo que haberla documentado bien desde el principio. El carrito parece una pieza sencilla, pero es donde convergen caché, sesiones, JavaScript y lógica de negocio al mismo tiempo. Entender cómo funciona ese sistema por dentro no es un detalle técnico menor: es lo que permite mantener una tienda estable a largo plazo sin depender de prueba y error cada vez que algo deja de funcionar.
¿Necesitas ayuda con tu proyecto? Trabajo con negocios y agencias en WordPress, WooCommerce, IA e integraciones. Escríbeme y lo vemos juntos.
