Solucionar problemas

Portada lenta con Polylang: detección del idioma del navegador y LiteSpeed Cache

Revisado el 7 min de lectura WordPress rendimiento traducciones

Si tienes un WordPress multiidioma con Polylang y has activado la detección automática del idioma del navegador, es probable que la página principal cargue bastante más lenta que el resto, aunque LiteSpeed Cache esté bien configurado.

El motivo: para decidir a qué idioma enviar a cada visitante, Polylang tiene que ejecutar PHP en cada visita a la portada, así que la marca como no cacheable. Cada visita carga WordPress completo y consulta la base de datos, en vez de recibir la copia en caché que se sirve al instante en las demás páginas.

La solución es quitar la detección de Polylang y hacerla con reglas en el .htaccess. Esas reglas las resuelve el servidor antes de llegar a WordPress, así que mantienes la redirección por idioma y LiteSpeed Cache vuelve a guardar la portada.

Comprobar que te pasa esto

Abre una terminal y mira las cabeceras de la portada y de otra página cualquiera (repite cada comando dos veces, porque la primera visita nunca sale de la caché):

curl -sI https://tudominio.com/ | grep -i x-litespeed-cache
curl -sI https://tudominio.com/contacto/ | grep -i x-litespeed-cache

Si la página interior devuelve x-litespeed-cache: hit y la portada no devuelve nada o devuelve miss siempre, la portada no se está cacheando. También puedes verlo en el navegador: F12 > Red, recarga y pulsa en la primera petición para ver sus cabeceras.

1. Desactivar la detección en Polylang

En el escritorio de WordPress ve a Idiomas > Ajustes, busca el apartado Detectar el idioma del navegador («Detect browser language», que se describe como «establecer el idioma según la preferencia del navegador al visitar la portada») y desactívalo. Guarda los cambios.

2. Añadir las reglas al .htaccess

Edita el .htaccess de WordPress desde el Administrador de archivos de cPanel o por FTP y añade estas reglas al principio del fichero, antes de cualquier otro bloque. Así quedan fuera del bloque de LiteSpeed Cache, que el plugin reescribe cada vez que cambias su configuración.

Este ejemplo es para una web en inglés (idioma predeterminado, en la raíz /), francés (/fr/) e italiano (/it/):

RewriteEngine On

# Francés
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_COOKIE} !pll_language= [NC]
RewriteCond %{HTTP:Accept-Language} ^fr [NC]
RewriteRule ^$ /fr/ [R=302,L,CO=pll_language:fr:.tudominio.com:525600:/]

# Italiano
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_COOKIE} !pll_language= [NC]
RewriteCond %{HTTP:Accept-Language} ^it [NC]
RewriteRule ^$ /it/ [R=302,L,CO=pll_language:it:.tudominio.com:525600:/]

# Inglés (predeterminado): no redirige, solo guarda la cookie
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_COOKIE} !pll_language= [NC]
RewriteRule ^$ - [CO=pll_language:en:.tudominio.com:525600:/]

Cambia .tudominio.com por tu dominio en todas las líneas, manteniendo el punto inicial para que la cookie valga también para www.

Cómo funcionan

Cada bloque redirige solo si se cumplen tres condiciones:

  1. %{REQUEST_URI} ^/$: el visitante entra en la portada, no en una página interior.
  2. %{HTTP_COOKIE} !pll_language=: no tiene aún la cookie de idioma, es decir, es su primera visita o no ha elegido idioma. Si ya lo eligió con el selector de Polylang, se respeta.
  3. %{HTTP:Accept-Language} ^fr: el idioma preferido de su navegador es el francés.

Si se cumplen, lo envía a /fr/ y guarda la cookie durante un año (525600 minutos), así que en las siguientes visitas no se vuelve a comprobar. Quien no encaja en ninguna regla se queda en la portada en el idioma predeterminado.

Adaptarlas a tus idiomas

Crea un bloque por cada idioma que tengas en Polylang y borra los que no uses. Por ejemplo, para añadir el alemán:

# Alemán
RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_COOKIE} !pll_language= [NC]
RewriteCond %{HTTP:Accept-Language} ^de [NC]
RewriteRule ^$ /de/ [R=302,L,CO=pll_language:de:.tudominio.com:525600:/]

Solo cambian tres cosas:

  1. ^de en Accept-Language: el código del idioma (es español, pt portugués, de alemán…).
  2. /de/: la carpeta del idioma tal como aparece en tus URL de Polylang.
  3. pll_language:de: el mismo código que la carpeta.

El bloque del idioma predeterminado (el que no redirige) debe ir siempre el último y llevar su código en la cookie.

Si en Polylang tienes desactivado Ocultar el código de idioma de la URL para el idioma predeterminado y tu portada principal es, por ejemplo, /en/, cambia ese último bloque para que también redirija:

RewriteCond %{REQUEST_URI} ^/$
RewriteCond %{HTTP_COOKIE} !pll_language= [NC]
RewriteRule ^$ /en/ [R=302,L,CO=pll_language:en:.tudominio.com:525600:/]

Comprobar que funciona

  1. En LiteSpeed Cache > Caja de herramientas, pulsa Purgar todo.
  2. Abre una ventana de incógnito y entra en la portada: deberías ir a la versión del idioma de tu navegador.
  3. Cambia de idioma con el selector y vuelve a la portada: debe respetar el idioma elegido.
  4. Repite los comandos curl del principio: la portada debe devolver x-litespeed-cache: hit desde la segunda visita.

Tienes más ajustes para acelerar WordPress en la guía de LiteSpeed Cache para WordPress.

También te puede ayudar

¿Algo no cuadra o ha cambiado? Cuéntanoslo y lo revisamos.