Seguro que sabes qué es un sistema de caché o, al menos, lo has oído alguna vez. En cualquier caso, sabes que hace que tu web cargue más rápido, lo cual se traduce en una mejor experiencia de usuario, mejor posicionamiento en buscadores y menos consumo de recursos del servidor. La panacea.
El problema viene cuando lo implementas y, ¡sorpresa! comienzan a aparecer problemas con WooCommerce: el enlace del checkout no funciona en móviles, o los precios no cambian en función del tipo de cliente, o los stocks no se muestran correctamente y algunos usuarios ven un producto en stock, cuando resulta que se agotó hace dos horas.
¿Te ha pasado algo así? Si estás asintiendo con cara triste ya sabes la frustración que produce. Pero no te preocupes, vamos a intentar solucionar todas estas incidencias. Vamos a ver cómo hacer que WooCommerce se lleve bien con nuestro plugin de caché.
Tabla de contenidos
WooCommerce y la caché
Para entender lo que está pasando, una explicación muy breve (a ver si soy capaz de hacerlo en menos de cien palabras) de cómo funciona un sistema de caché:
WordPress está creado en PHP, un lenguaje que es interpretado por el servidor en cada petición. Para cada página que visitas el servidor interpreta los archivos PHP en función de los datos que contiene la base de datos de WordPress, y envía el resultado a tu navegador de forma que él lo pueda interpretar: en HTML. Un HTML recién generado, de forma dinámica.
Eso lleva su tiempo. Un sistema de caché sin embargo genera ese HTML y lo almacena. Cuando tú visitas una página el servidor sólo tiene que servir ese HTML generado previamente, así todo es mucho más rápido.
¡Cien palabras justas! Bien, ahora estás en disposición de entender lo que pasa. Imagina que tu plugin de caché genera el HTML de la ficha del producto cuando aún quedaban 2 unidades en stock, pero un comprador viene y las compra. Después llega otro cliente al mismo producto, y tu plugin de caché le sirve el HTML que tiene generado.
La base de datos dice que quedan cero unidades del producto, pero da igual porque nadie le ha consultado. Simplemente se ha mostrado el HTML que estaba almacenado en caché, el cual mostraba dos unidades en stock. ¡Ya tenemos el lío montado!
Páginas de WooCommerce excluidas de la caché
Antes era mucho peor. Imagina añadir un producto al carrito, pero que WooCommerce te muestre un carrito cacheado, sin productos, da igual cuántas veces lo añadas, siempre verás el carrito vacío. O realizar el pedido y no verlo en tu cuenta, sin saber si ha ido bien o no…
WooCommerce ya solucionó todas esas incidencias hace mucho tiempo, desde la versión 1.4.2 (febrero de 2012). ¿Cómo? Pues sencillamente activando la constante de WordPress DONOTCACHEPAGE para las páginas:
- Mi cuenta
- Carrito
- Checkout
Eso soluciona cualquier tipo de incidencia en estas páginas, ya que evita que cualquier plugin de caché (medianamente bien hecho) las almacene de forma estática, así que tanto el carrito, como el checkout como la página de cuenta se generan siempre dinámicamente.
Pero eso no evita otro tipo de problemas como los que he ido mencionando a lo largo del artículo (stocks o precios que no cambian cuando deberían haber cambiado, incompatibilidades en algunos dispositivos, etcétera). Así que no me enrollo más y, establecidas las bases teóricas, nos remangamos y entramos al meollo del asunto.
¿Estás construyendo tu tienda online o eres implementador WordPress?
¿Necesitas plugins de calidad y con soporte para implementar funcionalidades concretas?
Consigue todos los plugins a la venta en la sección de plugins de esta web y todos los que siga añadiendo. Acceso a los 96 plugins (y subiendo) con soporte directo del desarrollador, actualizaciones y uso ilimitado: úsalos en tantas webs como lo necesites.
Resolviendo los problemas de caché en WooCommerce
Si has prestado atención ya lo sabes. Si te has saltado todo el rollo teórico te lo resumo en una frase: todos los problemas en WooCommerce generados por tu plugin de caché se resuelven de una forma muy sencilla: excluyendo a WooCommerce de la caché.
O sea, diciendo a tu plugin de caché que no se le ocurra acercarse a tu tienda. Que a los archivos de WooCommerce ni los mire, y que se le ves rondando tus productos se va a enterar de lo que vale un peine.
Y ahora es cuando dices: Pero hombre, entonces la tienda no va a ganar velocidad con la caché si se queda fuera. Efectivamente, pero es que no se puede tener todo. Como decimos en mi tierra, pescado gordo y que pese poco no puede ser.
Aún así, puedes beneficiarte de un buen sistema de caché en todo el resto de la web, así que vamos a ver cómo podemos configurar los plugins de caché más utilizados para que no tengan conflictos con WooCommerce.
WooCommerce y WP Super Cache
Con WP Super Cache el problema se resuelve fácil: tienes que ir a Ajustes > WP Super Cache y en la pestaña Avanzado bajar hacia abajo hasta que veas el cuadro de texto con la leyenda Añada aquí las cadenas (no el nombre del fichero) que forzará que una página no entre en caché…, como el de la imagen:
Ahí tendrás que poner las URL que correspondan a tu tienda, en función de la configuración que le hayas hecho. Una configuración típica puede ser:
/tienda*
/producto*
/categoria-producto*
/etiqueta-producto*
Se entiende, ¿verdad? Se trata de adaptar las URLs de tu tienda para excluirlas de la caché (puedes consultar la configuración que tienes para esto en Ajustes > Enlaces permanentes). Como decía más arriba, por las páginas de mi cuenta, carrito y checkout no te tienes que preocupar.
Pero, ¿y si tienes configurado WooCommerce para que la página de la tienda sea la página de inicio de tu web? Bien, la solución la tienes un poco más arriba, justo encima de la opción que acabamos de ver. Concretamente en esta otra:
En el caso de que en Ajustes > Lectura hayas establecido la página Tienda como la página de inicio del sitio, tendrás que marcar la opción Página principal (is_front_page). Ojo, no te confundas y marques la opción Home (is_home), recuerda que para WordPress la página Home (designada con el condicional is_home) es la página donde se muestran las entradas del blog. La página de inicio se designa siempre con is_front_page.
WooCommerce y W3 Total Cache
En el caso de W3 Total Cache el sistema es parecido. No vuelvo a explicar qué URLs tienes que «sacar» de la caché porque es lo mismo (si te has saltado el apartado anterior, el de WP Super Cache, lo puedes consultar).
Esta vez tendrás que ir a Performance > Page Cache y poner las URLs excluidas bien abajo, en el cuadro que dice Never cache the following pages:
Y cuidado, porque con este plugin hay que tomar una precaución extra. Deberías ir también a la opción Performance > Minify y comprobar si tienes habilitada la minimización de HTML (en ese caso en la opción HTML minify settings estaría marcada la casilla Enable).
Si la tienes habilitada, deberías añadir mfunc en el cuadro Ignored comment stems, así:
Y asunto resuelto.
WooCommerce y WordPress Fastest Cache
Con WP Fastest Cache el tema es algo distinto debido a la interfaz, pero la base es la misma. Para ello nos vamos a la pestaña Exclude del menú WP Fastest Cache, y nos encontramos con esto:
Sólo hay que utilizar el botón de arriba Add New Rule, a la derecha de Exclude Pages, tantas veces como sea necesario para excluir de la cache las URLs que nos interesan, eligiendo en If REQUEST_URI las opciones que nos interesan (empezando por Home si tenemos configurada la tienda como página principal de la web.
El resultado puede ser bastante similar a la siguiente imagen, aunque adaptado a tu caso concreto, como te indicaba más arriba:
Conclusiones
Ya ves qué sencillo es resolver las incidencias entre WooCommerce y el plugin de caché que estés usando en WordPress. Recuerda siempre, una vez adaptada la nueva configuración, vaciar la caché para que se regenere, esta vez excluyendo las URLs correspondientes a WooCommerce.
Y si aún así sigues teniendo problemas, habrá que buscar al culpable. Quizá tengas también un sistema de caché a nivel de servidor, o quizá haya una incidencia en algún otro sitio. Si te encuentras con cualquier problema, ya sabes que me puedes contactar a través del formulario de contacto.
Renato dice
Excelente artigo, dicas valiosas! 🙂 Obrigado Enrique! 🙂
Enrique J. Ros dice
Gracias a ti, Renato 🙂
Un saludo.
Jose dice
Yo estoy intentando hacer ir el wp rocket, que se supone que funciona perfectamente con woocommerce, y me da muchos problemas de todo tipo. Le das a añadir a carrito y en vez de a la cesta te envía a la home, no sé, mil chorradas.
Parece que es imposible hacer que un sistema de chaché funcione con woocommerce.
Saludos.
Jose
Fernando Díaz Gascón dice
Gran contenido. Muchas gracias.
Una duda. Si por ejemplo tienes el típico icono de carrito donde pone la cantidad de euros que llevas en el carrito, y eso aparece en todas las páginas… entonces si no he entendido mal, deberías dejar de cachear todas las páginas si quieres que eso funcione?
Y otra. Dices que no cacheemos la home si se está usando la página de tienda. Pero si simplemente en la home tenemos un shortcode que muestra los productos destacados, por ejemplo, ¿estamos en las mismas? ¿No se debería cachear?
Mil gracias por adelantado.
Enrique Ros dice
Hola Fernando
Gracias por tu comentario. En realidad, eso depende de muchas cosas. El icono del carrito suele estar hecho en jQuery para que se actualice sin recargas de página, así que en muchos casos no se verá afectado. Igualmente hay cachés más persistentes que otras, cachés más «duras» y más «blandas», por así decirlo.
En cuanto al tema de la visualización de la tienda, es lo mismo. El peligro en las cachés es que puede estar mostrando al usuario una visualización que no le corresponde: precios que han cambiado, impuestos de otra zona, stocks sin actualizar… Son mil cosas las que pueden cambiar en WooCommerce en función del momento y el usuario, y que una caché se puede cargar.
De todas formas siempre hay muchas cosas que hacer para optimizar la velocidad y el rendimiento de una web antes de recurrir a cachear el contenido, y en un ecommerce esto debería evitarse siempre que sea posible.
Un saludo.
Fernando Díaz Gascón dice
Hola Enrique,
En el blog de Raiola Networks comentan que una forma de configurar el W3 Total Caché para el cacheo de la base de datos, en el caso de tiendas WooCommerce, es poner en DataBase caché -> Ignored query sistems: _wc_session_
A lo mejor de esa forma no hace falta excluir las páginas de tienda, producto y categoría. ¿Qué opinas?
Es que está claro que se pueden hacer muchas cosas para optimizar un WooCommerce, pero el caché es una bastante efectiva y como WooCommerce carga tanto, hay que poner toda la carne en el asador. Ya me cuentas, mil gracias.
Enrique Ros dice
Hola Fernando
Puede ser, no he leído el artículo que mencionas. En cualquier caso prefiero seguir las recomendaciones de WooThemes, que especifican precisamente esto.
De todos modos las últimas versiones de WooCommerce establecen la constante DONOTCACHEPAGE donde es requerido, así que, aunque es preferible hacerlo, ya no es tan importante.
Un saludo.
cristo dice
Hola, quisiera hacerte una consulta por favor, tengo un pequeño problema con mi tienda en WooCommerce donde al hacer una compra no me muestra el correspondiente impuesto( IGIC 7%) para un producto digital. Me han revisado la configuración y me dicen que seguro es la caché. Los plugin de caché que comentas no logro localizarlos, seguramente porque no están. Como podría solucionarlo? Muchas gracias por tu ayuda.
Enrique Ros dice
Hola Cristo
Busca qué cachés tienes activas (tanto plugins como las que tengas activadas a nivel de servidor o de CDN) y desactívalas para comprobar si es esa la causa.
Un saludo.
Jonay dice
Pero si excluyes la página de inicio no tendrá caché. Todas las urls que pones no tendrán cache, entonces para qué usar un plugin cache si vas a quitarle el cache a casi todo?
La mejor solución para esto en mi opinión es cargar los datos más importantes como el nº en stock con ajax. Así puedes cachear las páginas sin el problema de que no muestre el nº real de stock, etc.
Jordi dice
Estoy utilizando WP Fastest Cache, y no noto que la web vaya mucho mejor que antesd e velocidad… anteriormente tenia el W3 Total Cache y la verdad es que mucho mas rápida la web, pero ahí me econtré con un problema gordo. Resulta qeu al tener la web con WPML la pagina tienda me la carga en español en los dos idiomas ESPAÑOL e INGLES. Cuando desactivo este plugin la web funciona.
La verdad es que pese lo complicado que parece W3… parecia ir mejor para mi gusto, pero no puedo tenerlo activo porque no me funciona la web y el Fastest, no me da muy buen resultado de velocidad.
Podria indicarme quizas algo que deba hacer en W3 pero no veo ningun apartado actualmente donde ingresar la información que nos dejas respecto a producto, pagina, categoria,et…
Un saludo y muy buen post..
Carlos dice
Hola Enrique, yo estoy usando el plugin Humminbird para el caché en un WordPress con Woocommerce.
Quiero excluir del caché algunas páginas como «carrito» «mi-cuenta» y «checkout».
Cuando añado /carrito/ a la lista de exclusiones y guardo, el plugin me añade las barras «\» y deja la expresión así: \/carrito\/
Sabes por qué puede ser que se añadan esas barras y si se estarán excluyendo correctamente esas páginas del caché?
¡Muchas gracias!
Enrique J. Ros dice
Hola Carlos
Son simplemente barras de escape que usa el plugin en los ajustes, está correcto.
Un saludo
Toño Ruiz dice
Excelente como siempre Don Enrique
J Andrés B dice
Hola Enrique, gracias por el artículo. Yo tengo un problema que no sé cómo solucionar en este momento entre W3 Total Caché y WooCommerce. Al activar el pluguin de caché todas las páginas de WooCommerce se me ‘desmontan’, cambia su apariencia o mejor dicho, la distribución y ordenación de los distintos elementos, Utilizo el constructor de páginas WPBakery, por si esto sirve de algo.
¿Alguna sugerencia?
Muchas gracias nuevamente,
Saludos,