# LLMs.txt PrestaShop — SEO IA para ChatGPT, Claude y Perplexity

> Documentación completa del módulo DataFirefly LLMs.txt Generator para PrestaShop: instalación, configuración, cron, secciones personalizadas, hooks para desarrolladores y resolución de problemas.

- Página: <https://www.datafirefly.com/es/documentation/llms-txt-prestashop-seo-ia-chatgpt/>
- Idioma: es
- Actualizado el: 2026-07-22
- Otros idiomas: [fr](https://www.datafirefly.com/documentation/llms-txt-prestashop-seo-ia-chatgpt/index.md), [en](https://www.datafirefly.com/en/documentation/llms-txt-prestashop-seo-ia-chatgpt/index.md), [de](https://www.datafirefly.com/de/documentation/llms-txt-prestashop-seo-ia-chatgpt/index.md), [it](https://www.datafirefly.com/it/documentation/llms-txt-prestashop-seo-ia-chatgpt/index.md), [pl](https://www.datafirefly.com/pl/documentation/llms-txt-prestashop-seo-ia-chatgpt/index.md), [pt](https://www.datafirefly.com/pt/documentation/llms-txt-prestashop-seo-ia-chatgpt/index.md), [nl](https://www.datafirefly.com/nl/documentation/llms-txt-prestashop-seo-ia-chatgpt/index.md)
- Índice: <https://www.datafirefly.com/es/documentation/llms.txt>

## 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](https://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.

**A recordar:** los LLM leen estos archivos para entender tu tienda sin tener que rastrear cada página de producto. Cuanto mejor expuesto esté tu catálogo, mejor será citado y recomendado en sus respuestas.

### 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

1. Sube el ZIP en **Módulos → Gestor de módulos → Cargar un módulo**.
2. Haz clic en **Instalar**.
3. 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 `.htaccess` raí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.txt` y `/llms-full.txt` devuelven 404 y los archivos físicos se eliminan.
- **Nombre del sitio** (multilingüe, multitienda) — Aparece como encabezado principal `# Nombre del sitio` al 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.

**Consejo:** para encontrar los IDs, ve a la lista correspondiente (Catálogo → Categorías, etc.); el ID está en la primera columna o en la URL de edición.

### 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.txt`
- `https://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.

**X-Robots-Tag noindex:** añadido voluntariamente. `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 para `llms.txt`, formato `['title', 'url', 'description']`.
- `getFullEntries()` — Lista de entradas para `llms-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_headers` opcional 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:

1. **Permisos de escritura** — La raíz de PrestaShop debe ser escribible por el usuario PHP. Verifica con `ls -la`. Si el archivo `/llms.txt` no existe tras una regeneración, casi siempre es esto.
2. **Módulo desactivado** — Verifica el toggle "Activar el módulo" en la parte superior de la config.
3. **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:

1. Verifica que el bloque `# ~~ dfllmstxt-datafirefly start ~~` esté presente en el `.htaccess` raíz de PrestaShop.
2. Si está ausente: desinstala y reinstala el módulo (esto fuerza la re-inserción del bloque).
3. Verifica con `curl -I https://tu-tienda.tld/llms.txt` que la respuesta contiene `Content-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:

1. Verifica que el archivo físico exista en la raíz: `ls -la /ruta/prestashop/llms.txt`.
2. Si existe pero Apache devuelve 404, es probablemente un problema de `.htaccess` que bloquea archivos `.txt`. Revisa las reglas del `.htaccess` raíz.
3. 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.txt` y `/llms-full.txt` en la raíz se eliminan.
- El bloque `.htaccess` añ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.txt` y `/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 `.htaccess` raíz para Content-Type UTF-8 y X-Robots-Tag.
- Opción para desactivar la generación de `llms-full.txt`.
