# LLMs.txt & AEO Shopware — Guía completa

> Presentación DataFirefly LLMs.txt & AEO es un plugin Shopware 6.7 que hace su tienda visible y comprensible para los motores de respuesta IA (ChatGPT, Claude, Perplexity, Gemini). Actúa en tres…

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

## Presentación

DataFirefly LLMs.txt & AEO es un plugin Shopware 6.7 que hace su tienda visible y comprensible para los motores de respuesta IA (ChatGPT, Claude, Perplexity, Gemini). Actúa en tres planos complementarios:

- **llms.txt / llms-full.txt** — dos archivos conformes a la especificación [llmstxt.org](https://llmstxt.org), generados automáticamente en la raíz de cada sales-channel, en cada idioma activo.
- **Schema.org JSON-LD** — inyección automática de datos estructurados en todas las páginas: Organization, Product enriquecido, BreadcrumbList, FAQPage, HowTo y Speakable.
- **Pilotaje de crawlers IA** — un endpoint `/robots-ai.txt` con control individual de 9 bots (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Applebot-Extended, Bingbot, Meta-ExternalAgent, CCBot, cohere-ai).

**Requisitos:** Shopware 6.7.0+, PHP 8.2+, MySQL 8.0+ o MariaDB 10.6+. El plugin funciona con el storefront estándar y los temas personalizados (herencia Twig).

## Instalación

### Vía ZIP (recomendado)

1. Descargue `DataFireflyLlmsAeo.zip` desde su cuenta de cliente.
2. Administración Shopware → **Extensiones → Mis extensiones → Subir extensión**.
3. Haga clic en **Instalar**, luego **Activar**.
4. Vacíe la caché: **Ajustes → Sistema → Cachés e índices**, o vía CLI:

```
bin/console cache:clear
```

### Vía CLI

```
unzip DataFireflyLlmsAeo.zip -d custom/plugins/
bin/console plugin:refresh
bin/console plugin:install --activate DataFireflyLlmsAeo
bin/console cache:clear
```

En la activación, el plugin instala automáticamente el conjunto de campos personalizados `datafirefly_aeo` en productos, categorías, páginas CMS y fabricantes. No se requiere ninguna migración manual.

### Compilación de los assets de administración

Si el módulo de administración no aparece bajo Marketing tras la activación:

```
bin/console bundle:dump
./bin/build-administration.sh
bin/console cache:clear
```

## Configuración

La configuración se encuentra en **Ajustes → Sistema → Extensiones → DataFirefly llms.txt & AEO**. Está delimitada por sales-channel: seleccione un canal específico en el selector superior para sobrescribir los valores globales.

### Tarjeta «General»

- **Activar el módulo** — interruptor global (por sales-channel).
- **Autor del sitio** — usado en la cabecera del llms.txt.
- **Descripción del sitio** — blockquote de cabecera del llms.txt; describa su tienda en 1-2 frases orientadas a IA.
- **Duración de la caché** — TTL en segundos (por defecto: 3600).

### Tarjeta «llms.txt»

- Incluir las **páginas CMS**, **categorías**, **marcas** y/o **productos**.
- **Número máximo de productos** listados en el índice.
- **Incluir productos inactivos** — desactivado por defecto; manténgalo desactivado en producción.

### Tarjeta «AEO & Schema.org»

- Toggles individuales: Organization, Product enriquecido, BreadcrumbList, FAQPage, HowTo, Speakable.
- **Logo y URL de la organización** — sobrescriben los valores del sales-channel.
- **Teléfono, email de contacto, perfiles sociales** — alimentan el schema Organization (`contactPoint`, `sameAs`).

### Tarjeta «Crawlers IA»

Para cada uno de los 9 bots, tres modos:

- **Permitido** — acceso completo (sin directiva restrictiva).
- **Denegado** — `Disallow: /` para ese bot.
- **Selectivo** — `Disallow` en las rutas que liste (una por línea, ej. `/checkout/`, `/account/`).

El contenido de `/robots-ai.txt` no se fusiona automáticamente en su `robots.txt` principal. Copie su contenido en su robots.txt, o añada una regla de reescritura de servidor (ver [Integración robots.txt](#robots-integracion)).

## Los tres endpoints

| URL | Contenido | Cabeceras |
| --- | --- | --- |
| `/llms.txt` | Índice sintético: Páginas, Categorías, Marcas, Productos, Optional | `text/plain; charset=UTF-8`, `X-Robots-Tag: noindex`, caché pública |
| `/llms-full.txt` | Contenido íntegro: descripciones limpias, SKU, EAN, marca, características agrupadas, FAQ | ídem |
| `/robots-ai.txt` | Bloque de directivas User-agent para los 9 crawlers IA | ídem |

Verificación rápida tras la instalación:

```
curl -I https://su-tienda.tld/llms.txt
curl -I https://su-tienda.tld/llms-full.txt
curl -I https://su-tienda.tld/robots-ai.txt
```

Cada sales-channel expone sus propios archivos en su propio dominio, en cada idioma activo (las URL localizadas siguen la configuración de dominio del canal).

## Campos personalizados AEO

El conjunto `datafirefly_aeo` está disponible en **productos, categorías, páginas CMS y fabricantes**, en la pestaña Campos personalizados de cada entidad.

| Campo | Tipo | Uso |
| --- | --- | --- |
| `datafirefly_aeo_summary` | Texto | Resumen de 1-2 frases usado en el llms.txt en lugar de la descripción truncada |
| `datafirefly_aeo_faq` | JSON | FAQ estructurada, inyectada como FAQPage JSON-LD |
| `datafirefly_aeo_howto` | JSON | Tutorial estructurado, inyectado como HowTo JSON-LD |
| `datafirefly_aeo_speakable` | Texto | Texto corto para asistentes de voz (30-40 palabras pronunciables) |
| `datafirefly_aeo_exclude` | Booleano | Excluye la entidad del llms.txt y del llms-full.txt |

### Formato del campo FAQ

```
[
  {
    "q": "¿Cuánto tarda la entrega?",
    "a": "La entrega estándar tarda de 2 a 4 días laborables."
  },
  {
    "q": "¿Cuál es su política de devoluciones?",
    "a": "Dispone de 30 días para devolver un producto sin usar."
  }
]
```

### Formato del campo HowTo

```
{
  "name": "Cómo instalar el producto",
  "totalTime": "PT15M",
  "steps": [
    { "name": "Preparación", "text": "Desembale los componentes." },
    { "name": "Montaje", "text": "Siga el esquema proporcionado." },
    { "name": "Verificación", "text": "Pruebe el funcionamiento." }
  ]
}
```

Los campos personalizados de Shopware son traducibles: rellene la FAQ en cada idioma mediante el selector de idioma de la ficha de producto. El plugin lee el valor en el idioma del contexto de la petición.

## Datos estructurados Schema.org

El plugin inyecta JSON-LD en el `` mediante la plantilla `storefront/layout/meta.html.twig` (herencia Twig, compatible con temas personalizados). Schemas generados:

- **Organization** — en todas las páginas: nombre, logo, URL, `contactPoint`, `sameAs` (perfiles sociales).
- **Product enriquecido** — en las fichas de producto: `gtin13` (desde el EAN), `mpn`, `sku`, `brand` (fabricante), `additionalProperty` (características agrupadas por grupo de propiedades), `aggregateRating` (desde las reseñas nativas de Shopware cuando existen).
- **BreadcrumbList** — migas de pan completas de la página actual.
- **FAQPage** — si el campo `datafirefly_aeo_faq` está relleno en la entidad de la página.
- **HowTo** — si el campo `datafirefly_aeo_howto` está relleno.
- **Speakable** — selectores CSS `h1`, `.product-detail-name`, `.product-detail-description-text`, `.cms-element-text`, `[data-speakable]`, más el texto del campo dedicado.

Validación recomendada tras la puesta en producción:

- [Schema.org Validator](https://validator.schema.org/) — pegue la URL de una ficha de producto.
- [Google Rich Results Test](https://search.google.com/test/rich-results).

## Módulo de administración

Bajo **Marketing → DataFirefly llms.txt & AEO**:

- **Previsualización en vivo** del llms.txt o del llms-full.txt, con renderizado monoespaciado.
- **Selector de sales-channel** — previsualice cada canal de forma independiente.
- **Invalidación de caché** en un clic (por canal o global).
- **Apertura de la URL pública** y **copia al portapapeles**.

## Comandos CLI y automatización

### datafirefly:llms-txt:generate

```
# Generar el llms.txt de un sales-channel (mostrado en la salida estándar)
bin/console datafirefly:llms-txt:generate --sales-channel=<id>

# Versión completa, escrita en un archivo, sin pasar por la caché
bin/console datafirefly:llms-txt:generate --sales-channel=<id> --full --output=/tmp/llms-full.txt --no-cache
```

### datafirefly:llms-txt:warm

```
# Calentar la caché de todos los sales-channels x todos los idiomas activos
bin/console datafirefly:llms-txt:warm

# Forzar la regeneración aunque la caché siga siendo válida
bin/console datafirefly:llms-txt:warm --force

# Calentar solo el llms.txt (sin el llms-full.txt)
bin/console datafirefly:llms-txt:warm --skip-full
```

### Cron recomendado

```
# Calentamiento diario a las 03:15
15 3 * * * cd /var/www/shopware && php bin/console datafirefly:llms-txt:warm --quiet
```

Una **tarea programada Shopware** también se registra en la activación: si su worker Messenger y el scheduled task runner están en marcha, la caché se calienta automáticamente sin cron de sistema.

## Integración robots.txt

Dos enfoques para exponer las directivas IA en su robots.txt principal:

### Copia manual

Abra `/robots-ai.txt`, copie el bloque generado y péguelo en su robots.txt existente. Repita tras cada cambio de configuración de los bots.

### Reescritura de servidor (recomendada si el robots.txt está gestionado íntegramente por el plugin)

```
# nginx
location = /robots.txt {
    rewrite ^ /robots-ai.txt last;
}

# Apache (.htaccess)
RewriteRule ^robots.txt$ /robots-ai.txt [L]
```

Use la reescritura completa solo si no tiene otras directivas robots.txt que preservar (sitemap, exclusiones SEO existentes). En caso de duda, prefiera la copia manual del bloque IA.

## Caché y rendimiento

- Caché **PSR-6** sobre el pool `cache.object` de Shopware, etiquetada `datafirefly_llms_aeo`.
- Claves delimitadas por **sales-channel + idioma**: cada combinación tiene su propia entrada.
- TTL configurable (por defecto 3600 s).
- Invalidación: botón admin (por canal o global), comando `warm --force`, o expiración natural.
- Compatible con caché clusterizada (Redis): la invalidación por etiquetas funciona en todos los adaptadores etiquetables.

## Solución de problemas

### Los endpoints devuelven 404

1. Verifique que el plugin está **activado** (no solo instalado).
2. Vacíe la caché HTTP y la caché de aplicación: `bin/console cache:clear`.
3. Si usa un reverse proxy/CDN, púrguelo también.

### Error «Attempted to call an undefined method named getHeader» en páginas de navegación

Bug corregido en la **versión 1.0.1**: en algunas instalaciones Shopware 6.7, `NavigationPage` no expone `getHeader()`. Actualice a la 1.0.1 (extracción defensiva de la categoría activa). Si ya está en 1.0.1 y sigue viendo el error, vacíe la caché de opcode PHP (`opcache_reset` o reinicio de PHP-FPM).

### El módulo admin no aparece bajo Marketing

Compile los assets de administración (ver [Instalación](#instalacion-assets)) y fuerce la recarga del navegador (Ctrl+Mayús+R).

### El llms.txt está vacío o incompleto

1. Verifique los toggles de inclusión (páginas CMS / categorías / marcas / productos) en la tarjeta «llms.txt».
2. Verifique que el límite de productos no está en 0.
3. Controle el campo `datafirefly_aeo_exclude` en las entidades ausentes.
4. Invalide la caché y recargue.

### El JSON-LD no aparece en el código fuente

1. Verifique que «Activar el módulo» y los toggles Schema.org están activos para el sales-channel correcto.
2. Si su tema sobrescribe `storefront/layout/meta.html.twig` sin `{{ parent() }}` en el bloque correspondiente, la inyección se pierde: restaure la llamada al padre.

## Changelog

### 1.0.1 — 2026-05-21

- Corrección: extracción defensiva de la categoría activa en las páginas de navegación (error `getHeader()` en algunas instalaciones 6.7).

### 1.0.0 — 2026-05-21

- Versión inicial: llms.txt + llms-full.txt, 6 schemas JSON-LD, robots-ai.txt (9 bots), campos personalizados AEO, módulo admin Vue 3, 2 comandos CLI, tarea programada, snippets FR/EN/DE.
