LLMs.txt PrestaShop — SEO IA para ChatGPT, Claude y Perplexity
Genera automáticamente llms.txt y llms-full.txt para exponer tu catálogo PrestaShop a los LLM (ChatGPT, Claude, Perplexity, Gemini).
Visión general
LLMs.txt PrestaShop genera automáticamente los archivos estándar /llms.txt y /llms-full.txt en la raíz de tu tienda, siguiendo la especificación llmstxt.org. Estos archivos exponen tu catálogo de forma estructurada a los LLM (ChatGPT, Claude, Perplexity, Gemini) — es el equivalente del sitemap.xml, pero para la IA generativa.
Dos archivos, dos usos
/llms.txt— Índice condensado: título + URL + descripción corta de cada entrada. Formato Markdown, normalmente unos cientos de KB./llms-full.txt— Contenido íntegro y limpio de cada entrada. Markdown enriquecido, puede pesar varios MB según el tamaño del catálogo. Opcional desde la 1.0.0.
Instalación
- Sube el ZIP en Módulos → Gestor de módulos → Cargar un módulo.
- Haz clic en Instalar.
- Haz clic en Configurar para abrir el panel.
Al instalarse, el módulo:
- Crea 4 tablas SQL: caché, secciones personalizadas (+ lang + shop), logs.
- Añade 3 entradas en el menú admin bajo una categoría oculta
AdminDfLlmsTxtParent. - Se registra en los hooks de catálogo (creación/edición/eliminación de producto, categoría, CMS, fabricante, proveedor) para invalidar el caché automáticamente.
- Añade un bloque en el
.htaccessraíz de PrestaShop para servir los archivos en UTF-8 con los encabezados correctos. - Genera un token cron aleatorio de 32 caracteres.
Configuración
La pantalla de configuración está organizada en 5 secciones.
1. General
- Activar el módulo — Toggle global. Si está desactivado, las URL
/llms.txty/llms-full.txtdevuelven 404 y los archivos físicos se eliminan. - Nombre del sitio (multilingüe, multitienda) — Aparece como encabezado principal
# Nombre del sitioal inicio del archivo. - Descripción corta del sitio (multilingüe, multitienda) — 1–2 frases que resumen lo que ofrece la tienda. Se muestra como blockquote
> ...justo debajo del nombre. - Introducción (multilingüe, multitienda) — Texto libre Markdown. Útil para dar contexto adicional a los LLM (política de devoluciones, envío, valores de la marca).
- Formato de salida — Markdown enriquecido (recomendado, soportado por todos los LLM principales) o Texto plano.
- Generar también
llms-full.txt— Si está desactivado, solo se genera/llms.txt. Ahorra varios MB de almacenamiento y segundos de generación en catálogos grandes.
2. Fuentes de contenido
- Incluir páginas CMS — Páginas de contenido (Sobre nosotros, FAQ, Condiciones, etc.).
- Incluir categorías — Categorías activas con su descripción.
- Incluir productos — Productos activos.
- Incluir fabricantes — Marcas con descripción.
- Incluir proveedores — Lista de proveedores.
- Incluir precio de los productos — Formateado según la locale actual.
- Incluir características del producto — Features clave/valor.
- Incluir combinaciones — Variantes (talla, color, etc.) con diferencia de precio.
- Incluir productos sin stock — Desactivado por defecto.
- Campo de descripción del producto — Corta, larga o ambas.
- Límite de productos — Número máximo de entradas de producto en el archivo. 500 por defecto, súbelo según el tamaño del catálogo (1000–5000 es razonable).
3. Exclusiones
Listas de IDs separadas por coma. Permite excluir contenido específico sin tocar el resto del catálogo.
- IDs de categorías excluidas — Ej.: productos B2B, categorías internas, categorías obsoletas.
- IDs de productos excluidos — Productos en fin de vida, muestras, regalos.
- IDs de CMS excluidos — Páginas de servicio interno, borradores.
4. Caché y Cron
- Duración del caché (TTL en segundos) — 86400 (24 h) por defecto. El caché se sirve mientras no haya expirado.
- Invalidación automática en cambios de catálogo — Cuando modificas/añades/eliminas un producto, categoría, etc., el caché se invalida y el archivo se regenerará en la próxima petición (o en el próximo cron).
- Token cron — Cadena aleatoria de 32 caracteres. Regenerable desde el panel; las URL cron anteriores dejan de funcionar inmediatamente.
- URL cron lista para copiar — Formato:
https://tu-tienda.tld/index.php?fc=module&module=dfllmstxt&controller=cron&token=XXX
5. Avanzado
- Retención de logs — Número de días que se conservan los logs de generación. 30 por defecto.
- Respetar robots.txt — Para usos avanzados. Activado por defecto.
Configuración del cron
El cron pregenera el caché para todas las tiendas y todos los idiomas activos en una sola llamada. Ideal para catálogos grandes para evitar que un usuario final dispare la regeneración.
URL a llamar:
https://tu-tienda.tld/index.php?fc=module&module=dfllmstxt&controller=cron&token=TU_TOKEN
Ejemplo de crontab (cada día a las 4 h):
0 4 * * * curl -s "https://tu-tienda.tld/index.php?fc=module&module=dfllmstxt&controller=cron&token=TU_TOKEN" > /dev/null
Parámetros opcionales:
&id_shop=2— Limitar a una tienda concreta.&id_lang=1— Limitar a un idioma concreto.
La respuesta JSON detalla el resultado de cada generación (éxito, tamaño de los archivos, duración).
Secciones personalizadas
Más allá del catálogo bruto, puedes inyectar contenido libre en los archivos generados. Pestaña LLMs.txt → Secciones personalizadas en el menú admin.
Casos de uso típicos:
- Política de devoluciones resumida
- Valores y compromiso de la marca
- FAQ corta
- Condiciones de envío
- Instrucciones específicas para los LLM (ej.: «No comparar con [marca competidora]»)
Cada sección:
- Tiene un título y contenido multilingüe (Markdown soportado).
- Es multitienda: eliges en qué tiendas aparece.
- Tiene una posición: antes de las fuentes, después de las fuentes o en el pie del archivo.
- Tiene una orden ajustable por arrastrar y soltar.
- Se puede activar/desactivar sin eliminarla.
URLs de los archivos generados
Los archivos están accesibles en la raíz de tu tienda:
https://tu-tienda.tld/llms.txthttps://tu-tienda.tld/llms-full.txt(si la opción está activada)
Cómo se sirven
Para la tienda por defecto en su idioma por defecto, el módulo escribe un archivo físico en la raíz de PrestaShop. Apache lo sirve directamente, sin depender del dispatcher de PrestaShop, las URL amigables o el caché de las rutas. Es la misma mecánica que utiliza el módulo oficial gsitemap para /sitemap.xml.
Para las demás tiendas en una configuración multitienda (Host diferente, raíz compartida), los archivos son servidos por el hook moduleRoutes que enruta por el Host header.
Encabezados HTTP
El módulo añade automáticamente un bloque en el .htaccess raíz de PrestaShop para forzar los encabezados correctos:
# ~~ dfllmstxt-datafirefly start ~~
<Files "llms.txt">
ForceType "text/plain; charset=utf-8"
<IfModule mod_headers.c>
Header set Content-Type "text/plain; charset=utf-8"
Header set X-Robots-Tag "noindex, follow"
</IfModule>
</Files>
<Files "llms-full.txt">
ForceType "text/plain; charset=utf-8"
<IfModule mod_headers.c>
Header set Content-Type "text/plain; charset=utf-8"
Header set X-Robots-Tag "noindex, follow"
</IfModule>
</Files>
# ~~ dfllmstxt-datafirefly end ~~
Este bloque se coloca fuera del bloque PrestaShop # ~~ start ~~ ... # ~~ end ~~ y por tanto se preserva en las regeneraciones automáticas de PrestaShop. También se auto-repara en cada regeneración del caché (idempotente), en caso de que haya sido modificado.
llms.txt apunta a los crawlers de IA, no al índice de Google. Los LLM leen estos archivos directamente sin necesidad de que aparezcan en las SERP. Tu SEO clásico no se ve afectado.
Arquitectura extensible (para desarrolladores)
El módulo expone un sistema de Content Providers que otros módulos pueden enriquecer mediante un hook. Si tienes un módulo de blog, FAQ de producto, testimonios de clientes o glosario, puede publicar su contenido en el llms.txt sin modificar dfllmstxt.
Hook actionDfLlmsTxtRegisterProviders
En tu módulo externo:
public function hookActionDfLlmsTxtRegisterProviders($params)
{
require_once _PS_MODULE_DIR_ . 'mimodulo/classes/MyBlogProvider.php';
$params['registry']->register(new MyBlogProvider());
}
Tu clase debe extender DfLlmsTxtAbstractContentProvider (o implementar DfLlmsTxtContentProviderInterface) y proporcionar como mínimo:
getKey()— Identificador único (ej.:"blog").getSectionTitle()— Título de sección mostrado en el archivo (ej.:"Blog").isEnabled()— Booleano que indica si el provider debe producir entradas.getShortEntries()— Lista de entradas parallms.txt, formato['title', 'url', 'description'].getFullEntries()— Lista de entradas parallms-full.txt, formato['title', 'url', 'body'].
Hooks de generación
Dos hooks permiten filtrar o enriquecer el contenido justo antes de ser servido:
actionDfLlmsTxtBeforeGenerate— Antes de la generación. Permite modificar la configuración o los providers activos.actionDfLlmsTxtAfterGenerate— Después de la generación pero antes del cacheo. Permite transformar el contenido final.
Compatibilidad
- PrestaShop 8.0.0 — 8.99.99 (soporte PS 9 próximamente)
- PHP 7.4 mínimo, 8.1+ recomendado
- MySQL 5.7+ / MariaDB 10.4+
- Multitienda completo (configuración y caché aislados por tienda)
- Multilingüe completo (todos los idiomas activos)
- Apache 2.x con
mod_mime(universal).mod_headersopcional pero recomendado para encabezados HTTP limpios.
Resolución de problemas
El archivo no aparece en la raíz
Tres causas posibles, por orden de probabilidad:
- Permisos de escritura — La raíz de PrestaShop debe ser escribible por el usuario PHP. Verifica con
ls -la. Si el archivo/llms.txtno existe tras una regeneración, casi siempre es esto. - Módulo desactivado — Verifica el toggle «Activar el módulo» en la parte superior de la config.
- Multitienda con raíz compartida — Solo la tienda por defecto escribe en la raíz. Las demás tiendas son servidas vía
moduleRoutes(que requiere las URL amigables activadas en Preferencias → Tráfico y SEO).
Codificación rota (caracteres «Ã©» en lugar de «é»)
Síntoma clásico de UTF-8 servido sin charset HTTP. El módulo añade automáticamente las directivas .htaccess necesarias (ver sección Encabezados HTTP más arriba). Si el problema persiste tras una regeneración:
- Verifica que el bloque
# ~~ dfllmstxt-datafirefly start ~~esté presente en el.htaccessraíz de PrestaShop. - Si está ausente: desinstala y reinstala el módulo (esto fuerza la re-inserción del bloque).
- Verifica con
curl -I https://tu-tienda.tld/llms.txtque la respuesta contieneContent-Type: text/plain; charset=utf-8.
Generación exitosa pero URL en 404
Si la regeneración tiene éxito (tamaño de archivos correcto en los logs) pero la URL devuelve 404:
- Verifica que el archivo físico exista en la raíz:
ls -la /ruta/prestashop/llms.txt. - Si existe pero Apache devuelve 404, es probablemente un problema de
.htaccessque bloquea archivos.txt. Revisa las reglas del.htaccessraíz. - Si no existe, es un problema de permisos de escritura (ver más arriba).
El caché sigue obsoleto tras un cambio de producto
La invalidación automática está desactivada. Actívala en Caché y Cron → Invalidación automática en cambios de catálogo. También puedes forzar manualmente con el botón Vaciar caché del panel.
El archivo llms-full.txt pesa varios MB, es demasiado
Desactiva la opción Generar también llms-full.txt en la config General. Solo se generará /llms.txt (normalmente < 1 MB). Para la mayoría de casos de uso IA es suficiente: los LLM modernos saben seguir las URL y obtener las páginas individuales cuando lo necesitan.
Desinstalación
La desinstalación es limpia:
- Las 4 tablas SQL se eliminan.
- Los archivos físicos
/llms.txty/llms-full.txten la raíz se eliminan. - El bloque
.htaccessañadido se retira. - Todas las variables de configuración
DFLLMS_*se limpian. - Las pestañas admin se retiran.
Changelog
1.0.0 — Mayo 2026
- Lanzamiento inicial.
- Generación conforme a la spec llmstxt.org para
/llms.txty/llms-full.txt. - 5 Content Providers nativos: productos, categorías, CMS, fabricantes, proveedores.
- Caché TTL con invalidación automática.
- Cron asegurado por token.
- Secciones personalizadas multilingües, multitienda.
- Arquitectura extensible vía hook.
- Auto-gestión del
.htaccessraíz para Content-Type UTF-8 y X-Robots-Tag. - Opción para desactivar la generación de
llms-full.txt.