La beta de CachePilot está abierta. Participar gratis en la beta

Page Cache y WooCommerce: lo que nunca debe almacenarse en caché

Qué no debe guardar nunca un Page Cache en WooCommerce, cómo entran los filtros y los parámetros de seguimiento en la clave y cuándo purgar.

Un documento con un encabezado y una lista de cinco reglas sobre una cuadrícula oscura, una de ellas marcada en naranja

Una página en caché nunca debe contener los datos de un solo visitante. Eso excluye las páginas de usuarios con sesión iniciada, el carrito, el pago y la cuenta, las páginas generadas con una sesión o un carrito con productos, y las respuestas que establecen una cookie o están marcadas como privadas. Todo lo demás puede almacenarse en caché, siempre que los parámetros de filtro formen parte de la clave de caché, los parámetros de seguimiento queden fuera, los precios se purguen cuando cambian y ninguna página sobreviva a sus nonces.

Las reglas valen para cualquier Page Cache. Las cifras y los nombres de archivo son los del Page Cache de CachePilot, un ejemplo de cómo se plasman las reglas en código.

¿Qué nunca debe almacenarse en caché?

La guía de WooCommerce sobre cachés nombra las páginas de carrito, pago y cuenta y enumera las cookies que usa WooCommerce. Un Page Cache tiene que decidir dos veces: antes de responder a una petición y, una vez generada la página, antes de almacenarla.

Peticiones que omiten la caché

Peticiones que omiten el Page Cache
ReglaMotivo
Regla: Usuarios con sesión iniciada, entradas protegidas, autores de comentariosMotivo: Las cookies wordpress_logged_in, wp-postpass y comment_author indican contenido personal
Regla: Páginas de carrito, pago y cuentaMotivo: Su contenido pertenece a un solo visitante
Regla: Todo excepto GET y HEADMotivo: Los demás métodos modifican datos; los fragmentos del carrito son la única excepción
Regla: Administración, AJAX, cron, API REST, feeds, embeds, archivos XML y PHPMotivo: Estas respuestas no son páginas para visitantes
Regla: Parámetros de consulta desconocidosMotivo: Parámetros como add-to-cart o s cambian lo que hace la petición
Regla: La cookie woocommerce_recently_viewedMotivo: El widget muestra los productos de ese visitante
Regla: Una cookie de sesión cuando los impuestos dependen de la dirección del clienteMotivo: Los precios mostrados dependen del visitante
Fuente: pagecache-rules.php y PageCacheModule.php del plugin

Páginas que nunca se almacenan

Páginas que el Page Cache no almacena
ReglaMotivo
Regla: Un usuario con sesión iniciada o DONOTCACHEPAGEMotivo: Los plugins de WordPress usan esta constante para excluir una página
Regla: Un carrito con productos o una sesión de WooCommerceMotivo: La página puede mostrar avisos del carrito o precios para la dirección del visitante
Regla: Un precio generado con geolocalizaciónMotivo: El precio solo es válido para una ubicación
Regla: Una cabecera Set-Cookie, o Cache-Control con no-cache, no-store o privateMotivo: La propia respuesta se marca como personal
Regla: Resultados de búsqueda, páginas 404, feeds y embedsMotivo: Rara vez se solicitan dos veces
Regla: HTML incompletoMotivo: Con menos de 255 bytes o sin la etiqueta html de cierre, un fallo de generación llegaría a todos los visitantes
Fuente: PageCacheModule.php del plugin

Visitantes con un carrito con productos

La configuración sencilla omite la caché para todo visitante con una cookie de carrito. Es segura, pero esos visitantes no obtienen aciertos de caché. La otra configuración les sirve páginas en caché y rellena el minicarrito mediante fragmentos del carrito, mientras que las páginas generadas para ellos no se almacenan.

CachePilot usa la segunda configuración. Depende del tema: un tema que imprime el número de artículos del carrito en el HTML de la página necesita la primera.

¿Por qué importan los parámetros de seguimiento?

Los enlaces de boletines, anuncios y redes sociales llevan parámetros como utm_source, gclid o fbclid. No alteran la página. Si formaran parte de la clave de caché, cada enlace de campaña crearía su propia copia de la página, y casi todos los visitantes de una campaña obtendrían un fallo de caché.

Un Page Cache debería dejar estos parámetros fuera de la clave. La lista de CachePilot sigue la de WP Rocket 3.24 y tiene 61 entradas, cuatro de ellas prefijos de una familia completa: utm_*, mtm_*, pk_* y hsa_*.

¿Cómo se almacenan en caché los filtros de la tienda?

Los parámetros de filtro, orden y paginación sí cambian la página, así que pertenecen a la clave con sus valores. Ordenarlos antes hace que ?orderby=price&paged=2 y ?paged=2&orderby=price compartan una misma entrada. La lista de CachePilot tiene 14 entradas, entre ellas orderby, paged, min_price, max_price y los prefijos filter_*, query_type_* y attribute_*.

Un límite evita que los rastreadores que combinan todos los filtros llenen Redis con páginas que nadie vuelve a solicitar. En CachePilot, una petición con más de 6 parámetros almacenables en caché omite la caché.

Las cookies de moneda requieren el mismo tratamiento, de modo que un visitante que haya elegido otra moneda reciba la página en esa moneda. La página de sitios multiidioma trata los idiomas y las monedas.

¿Qué pasa con los fragmentos del carrito?

WooCommerce actualiza el minicarrito con una petición POST a ?wc-ajax=get_refreshed_fragments. Cada una de estas peticiones inicia WordPress, y para un visitante con el carrito vacío la respuesta es siempre la misma.

CachePilot almacena en caché esta petición mientras las dos cookies del carrito, woocommerce_cart_hash y woocommerce_items_in_cart, estén vacías. En cuanto el carrito tiene productos, la petición llega a WooCommerce como de costumbre.

¿Cuándo hay que purgar las páginas en caché?

Los cambios realizados mediante la API de WooCommerce, REST, WP-CLI, importaciones y ofertas programadas no disparan un guardado normal de entrada. Una caché que solo atiende a las entradas guardadas conserva los precios antiguos tras ellos. CachePilot purga de la siguiente manera:

  • Existencias. Un cambio de existencias o del estado de existencias purga la página del producto junto con sus páginas de tienda y de categoría.
  • Precios. Un cambio de precio, de fechas de oferta, de estado fiscal o de clase de impuesto vacía todo el Page Cache, porque los productos relacionados, las ventas cruzadas y los bloques de producto muestran ese precio en otras páginas.
  • Ajustes de la tienda. La moneda, el formato de precio, los ajustes de impuestos, los tipos impositivos y los precios de WCML vacían el Page Cache una vez al final de la petición, de modo que una edición masiva cuesta un solo vaciado.
  • Contenido. Guardar una entrada purga su paginación, las entradas contiguas, el autor, la fecha y las páginas superiores, los términos y las traducciones de WPML. Los menús, los widgets, el título del sitio y los enlaces permanentes vacían toda la caché.

¿Por qué como máximo 12 horas?

Muchas páginas de tienda contienen nonces, por ejemplo para la Store API o para peticiones REST desde la propia página. Un nonce de WordPress es válido entre 12 y 24 horas, según el momento de su ciclo en que se creó. Una página en caché con más de 12 horas puede llevar un nonce caducado, y un botón o formulario de ella falla.

CachePilot limita la duración de la página a 43.200 segundos, es decir, 12 horas, sea cual sea el ajuste. Autopilot usa 10 horas.

¿Cómo compruebo qué ocurrió con una página?

Tres pruebas en una copia de staging cubren los principales riesgos de cualquier Page Cache:

  1. Añada un producto en un navegador y abra después la misma página en otro navegador distinto. El segundo debe mostrar el carrito vacío.
  2. Cambie un precio y recargue la página del producto y la de su categoría.
  3. Cargue una página dos veces con ?utm_source=test. La segunda petición debería ser un acierto.

En CachePilot, el módulo Debug añade a las páginas HTML un comentario con el estado del Page Cache y el motivo de una omisión, por ejemplo “WooCommerce page” o “Cart not empty”.

La página de WooCommerce describe cómo trabaja CachePilot en una tienda.

Fuentes


Artículos relacionados