# DataFirefly All in One SEO — Documentación completa

> Documentación completa del módulo DataFirefly All in One SEO para PrestaShop 8 y 9: instalación, plantillas meta, esquemas JSON-LD, sitemap XML, redirecciones, monitoring 404, robots.txt, tracking GA4/GTM, analizador de contenido.

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

Suite SEO premium todo-en-uno para PrestaShop 8 y 9: plantillas meta dinámicas, esquemas JSON-LD completos, sitemap XML multilingüe, redirecciones, monitoring 404, Open Graph y Twitter Cards, GA4 y GTM, robots.txt inteligente con bloqueo de crawlers IA y analizador de contenido — todo en un único módulo.

## Requisitos

- **PrestaShop**: 8.0 a 9.x
- **PHP**: 8.1 o superior (8.2 y 8.3 recomendados)
- **MySQL**: 5.7+ o MariaDB 10.3+
- **Módulo productcomments** (oficial PrestaShop): opcional, requerido solo para AggregateRating en productos
- **mod_rewrite** activado en Apache (o equivalente Nginx) para las URL reescritas

El módulo es consciente del contexto multi-tienda de forma nativa: todas las tablas están limitadas por `id_shop`. Puede tener configuraciones totalmente diferentes por tienda.

## Instalación

1. Descargue `dfallinoneseo-vX.Y.Z.zip` desde su cuenta de cliente DataFirefly.
2. Inicie sesión en su back-office PrestaShop.
3. Vaya a **Módulos → Module Manager**.
4. Haga clic en **Subir un módulo** en la parte superior derecha.
5. Arrastre y suelte el archivo ZIP o haga clic en **Seleccionar un archivo**.
6. La instalación crea automáticamente las 11 tablas SQL, registra los hooks y añade el menú **Mejorar → DataFirefly SEO**.

Después de la instalación, abra el **Dashboard** del módulo para ver una vista general del score SEO global y los puntos a corregir con prioridad.

## Configuración inicial en 10 minutos

Este recorrido rápido le permite configurar lo esencial antes del primer crawl de Google.

1. **Ajustes → General**: active el módulo, indique el nombre del sitio y la etiqueta "Inicio" para el breadcrumb.
2. **Meta y plantillas**: defina como mínimo una plantilla _Producto_ y una plantilla _Categoría_ (consulte la sección dedicada).
3. **Schema → Identidad de la organización**: complete logo, teléfono, email, dirección y URLs de redes sociales (`sameAs`).
4. **Sitemap**: active el sitemap y haga clic en **Regenerar ahora**.
5. **Tracking**: añada su GA4 Measurement ID y/o GTM ID.
6. **Tracking → Verificaciones**: pegue el valor de verificación de Google Search Console.
7. **Robots.txt**: haga clic en **Cargar predeterminados (PS + bloqueo IA)** para partir de una base sana.

## Plantillas meta

El módulo reemplaza la entrada manual de `meta_title` y `meta_description` por plantillas dinámicas por tipo de entidad. Al guardar una ficha con metas vacías, la plantilla correspondiente se aplica automáticamente.

### Tipos de entidad soportados

- **Producto**: páginas de producto (todos los tipos, incluyendo virtuales y pack)
- **Categoría**: páginas de categoría
- **Página CMS**: páginas de contenido estático
- **Marca / Fabricante**: páginas de fabricante
- **Proveedor**: páginas de proveedor
- **Inicio**: página de inicio de la tienda
- **Páginas genéricas**: `/contact`, `/sitemap`, etc.

### Tokens disponibles

Los tokens se reemplazan con los valores reales al renderizar la página. No todos los tokens están disponibles para todos los tipos de entidad.

- `{shop_name}` — nombre de la tienda
- `{sep}` — separador (por defecto `|`)
- `{product_name}` — nombre del producto (idioma actual)
- `{product_reference}` — referencia interna
- `{product_sku}` — alias de referencia
- `{product_ean13}` — código de barras EAN13
- `{product_brand}`, `{brand}` — marca/fabricante
- `{category}` — categoría por defecto (producto) o nombre de la categoría (página de categoría)
- `{category_parent}` — nombre de la categoría padre
- `{category_description}` — descripción corta (160 car. máx.)
- `{short_description}` — descripción corta del producto (160 car. máx.)
- `{price}` — precio con IVA formateado con moneda
- `{price_tax_excl}` — precio sin IVA formateado
- `{title}` — título de la página CMS
- `{summary}` — extracto del contenido CMS (160 car. máx.)

### Bloques condicionales

Para no mostrar un token vacío, use la sintaxis condicional:

```
{?product_brand}{product_brand} | {/?}{product_name} - {shop_name}
```

Si `product_brand` está vacío (producto sin marca), todo el bloque entre `{?token}` y `{/?}` se elimina. De lo contrario, su contenido se renderiza y los tokens internos se reemplazan normalmente.

### Ejemplos de plantillas recomendadas

**Producto**:

```
Title: {?product_brand}{product_brand} {/?}{product_name} - {category} | {shop_name}
Description: Descubra {product_name}{?product_brand} de {product_brand}{/?}. {short_description} Envío rápido en {shop_name}.
```

**Categoría**:

```
Title: {category} - {?category_parent}{category_parent} - {/?}{shop_name}
Description: Todos los productos de la categoría {category} en {shop_name}. {category_description}
```

**Inicio**:

```
Title: {shop_name} - Tienda online
Description: Bienvenido a {shop_name}. Descubra nuestro catálogo, envío rápido, pago seguro.
```

### Sobrescritura por entidad

Para sobrescribir una ficha específica (por ejemplo un producto destacado), haga clic en el icono **Sobrescritura meta** en el menú **Edición masiva** o use la URL:

```
?controller=AdminDfSeoMeta&entity=product&entity_id=42
```

La página de sobrescritura le permite definir `meta_title`, `meta_description`, la directiva robots (por ejemplo `noindex,follow`) y un canonical personalizado por idioma.

La directiva robots definida en una entidad específica tiene prioridad sobre los ajustes globales de indexación. Úsela con moderación para evitar desindexar accidentalmente sus mejores páginas.

## Esquemas JSON-LD

El módulo genera un bloque `@graph` único que agrupa todos los esquemas de la página actual, validado por Google Rich Results Test.

### Esquemas generados automáticamente

- **Organization** — en todas las páginas, identidad de la empresa
- **WebSite** — en la home, con `SearchAction` para activar el sitelinks search box
- **LocalBusiness** — si se ha indicado una dirección física
- **BreadcrumbList** — breadcrumb
- **Product** — en las fichas de producto, con `offers`, `priceValidUntil`, `gtin13`/`isbn`/`mpn`
- **AggregateRating** — agregado desde el módulo productcomments oficial
- **Article** — en las páginas CMS
- **FAQPage** — desde los bloques FAQ de producto o página

### Identidad de la organización

Pestaña **Schema → Identidad de la organización**. Campos a completar:

- **Tipo**: Organization, Corporation, LocalBusiness, Store, OnlineStore, OnlineBusiness
- **Logo**: URL absoluta (recomendado 600x60 mínimo, ratio cuadrado o paisaje)
- **Teléfono**, **Email**: usados en `contactPoint`
- **Dirección postal**: calle, código postal, ciudad, país (ISO-2)
- **sameAs**: una URL por línea (Facebook, Instagram, LinkedIn, Twitter/X, etc.)

### Validez de las ofertas de producto

El campo _Validez de las ofertas de producto (días)_ controla el valor de `priceValidUntil` en `Product.offers`. Por defecto: 60 días. Google requiere este campo para mostrar el precio en los resultados enriquecidos.

### Esquemas personalizados

Pestaña **Schema → Esquemas personalizados**. Permite añadir bloques JSON-LD a medida (HowTo, Recipe, Event, JobPosting, VideoObject, Course, etc.) con un alcance preciso:

- **global**: todas las páginas
- **home**: solo home
- **product**: todas las páginas de producto
- **product_id**: un producto específico (usa el campo ID)
- **category**, **category_id**: idem categoría
- **cms**, **cms_id**: idem página CMS

Variables disponibles en el JSON personalizado: `{shop_name}`, `{base_url}`, `{entity_id}`, `{entity_type}`.

El JSON-LD personalizado se inserta tal cual en el `@graph`. Valídelo con el [Rich Results Test](https://search.google.com/test/rich-results) antes de publicar. Un JSON inválido se rechaza silenciosamente.

## Sitemap XML

El módulo genera un sitemap XML conforme a la [especificación sitemaps.org](https://www.sitemaps.org/protocol.html), con hreflang en cada URL y soporte de imágenes. Arquitectura: un _sitemap index_ por tienda, luego un sitemap por tipo de entidad × idioma, dividido en chunks.

### Configuración

Pestaña **Sitemap**. Active el sitemap y luego marque el contenido a incluir:

- Productos (por defecto todos los productos activos)
- Categorías
- Páginas CMS
- Marcas / Fabricantes
- Proveedores
- Imágenes (añade `image:image` a cada URL de producto)
- Vídeos (si están presentes en las fichas)

Opciones adicionales:

- **Excluir ruptura de stock**: elimina los productos sin stock
- **Gzip**: también genera las variantes `.xml.gz` (reduce 5 a 10x el tamaño descargado por los crawlers)
- **URLs por archivo**: tamaño de chunk (recomendado 5000-10000, máx 50000 por spec XML)

### Regeneración

La regeneración es manual desde el admin para evitar carga imprevista del servidor. Haga clic en **Regenerar ahora**.

Para automatizar, programe un cron que llame al siguiente script (cada 6 o 12 horas según la frecuencia de actualización de su catálogo):

```
0 */6 * * * php /var/www/html/index.php fc=module&module=dfallinoneseo&controller=sitemap&action=rebuild
```

### Envío a motores de búsqueda

Haga clic en **Pingear motores** para notificar a Google y Bing (endpoints legacy pero todavía activos). Para Google Search Console, envíe la URL del sitemap index una vez en GSC → Sitemaps. GSC vuelve a crawlear automáticamente con cada modificación.

URL del sitemap index: `https://su-tienda.com/sitemap.xml`

## Sitemap HTML público

Un sitemap HTML legible por humanos se genera automáticamente en `/plan-du-site`. Agrega categorías (árbol), páginas CMS, marcas, proveedores y los 200 productos más recientes. Útil para enlazado interno y accesibilidad.

## Redirecciones

El módulo gestiona las redirecciones HTTP 301 (permanente), 302 (temporal), 307, 308 y 410 (Gone) con tres tipos de match.

### Tipos de match

- **Exacto**: la URL fuente debe coincidir exactamente (sin query string)
- **Prefijo**: la URL fuente es un prefijo de la URL solicitada. El sufijo se conserva en el destino si _Conservar query string_ está marcado. Útil para migrar carpetas enteras (`/carpeta-antigua/` → `/carpeta-nueva/`).
- **Regex**: expresión regular PHP (modo `~...~i` sensible/insensible). Los grupos de captura están disponibles en el destino vía `$1`, `$2`, etc.

### Creación manual

Pestaña **Redirecciones → Nueva redirección**. Campos:

- **URL fuente**: ruta sin el dominio (ej: `/pagina-antigua`)
- **URL destino**: ruta o URL absoluta. Deje vacío para código 410.
- **Tipo de match**, **Código HTTP**, **Conservar query string**

### Importación / exportación CSV

Formato CSV esperado (con header):

```
source,destination,type,code
/producto-antiguo,/producto-nuevo,exact,301
/carpeta-antigua/,/carpeta-nueva/,prefix,301
/old-(.*),/new-$1,regex,301
```

La exportación CSV recoge las redirecciones actualmente filtradas en la lista.

### Redirección automática al cambiar slug

Si la opción **Ajustes → Monitoring → Redirección 301 auto al cambiar URL** está marcada, el módulo crea una 301 automáticamente al modificar el slug de un producto, categoría, página CMS, marca o proveedor. El `created_by` se marca como `auto:urlchange` para distinguirlo.

Esta opción evita la mayoría de los 404 SEO clásicos relacionados con la refactorización de contenido. Actívela desde la instalación.

## Monitoring 404

Pestaña **Monitor 404**. Captura todas las URLs en error 404 servidas por PrestaShop, con deduplicación, conteo de hits, detección de bots y hash de direcciones IP (sal `COOKIE_KEY` de PrestaShop para conformidad RGPD).

### Filtros disponibles

- **No resueltas**: URLs sin redirección cubridora (vista por defecto)
- **Resueltas**: URLs para las que se creó una redirección a posteriori
- **Bots**: hits provenientes de user-agents identificados como bots
- **Todas**

### Crear una redirección con un clic

En cada línea, el botón **Redirigir** abre un formulario inline que pre-rellena la fuente. Indique el destino, elija el código HTTP, valide. La 404 se marca automáticamente como resuelta.

### Purga y mantenimiento

El menú **Ajustes → Monitoring** expone un umbral _Número máximo de entradas 404 conservadas_ (por defecto 5000). Más allá, el botón **Purgar 404 antiguos** elimina las entradas no resueltas más antiguas.

## Robots.txt dinámico

El módulo sirve un archivo `/robots.txt` generado dinámicamente en cada solicitud, basado en las reglas definidas en **Robots.txt**.

### Preajustes PrestaShop + bloqueo IA

El botón **Cargar predeterminados (PS + bloqueo IA)** sobrescribe todas las reglas actuales y carga un preajuste sano que:

- Bloquea los directorios sensibles de PrestaShop (`/admin*/`, `/cache/`, `/classes/`, etc.)
- Bloquea las páginas técnicas (`/cart`, `/order`, `/my-account`, etc.)
- Bloquea los principales crawlers IA no respetuosos: **GPTBot**, **ClaudeBot**, **CCBot**, **Google-Extended**, **anthropic-ai**
- Apunta al sitemap (`Sitemap: /sitemap.xml`)

### Reglas personalizadas

Cada regla tiene un user-agent, una directiva (`Allow`, `Disallow`, `Crawl-delay`), un valor y una posición (orden en el archivo). Active/desactive una regla sin eliminarla mediante la pastilla ON/OFF.

### Vista previa en directo

El bloque **Vista previa del archivo generado** en la parte inferior renderiza el robots.txt tal como se servirá, antes de publicar.

## Archivo llms.txt nativo

El módulo sirve un archivo `/llms.txt` conforme a la [especificación llmstxt.org](https://llmstxt.org/). Este archivo lista, en markdown, las secciones principales del sitio para los crawlers IA respetuosos que desean una vista estructurada en lugar de scrapear todo el HTML.

No se requiere configuración — el módulo genera automáticamente el archivo desde su árbol de categorías, páginas CMS y marcas.

## Open Graph y Twitter Cards

Pestaña **Social**. El módulo inyecta las etiquetas `og:*` y `twitter:*` en todas las páginas.

### Ajustes

- **Activar Open Graph y Twitter Cards**: master switch
- **og:locale automático**: calculado desde el idioma del contexto (ej: `es_ES`)
- **Imagen OG por defecto**: URL absoluta de una imagen 1200×630 (usada cuando la página no tiene imagen dedicada)
- **og:site_name**, **og:type** por defecto
- **Twitter @handle** y tipo de tarjeta (`summary` o `summary_large_image`)
- **fb:app_id**: Facebook App ID

Para las fichas de producto, el módulo usa automáticamente la imagen principal de la ficha. Para las demás páginas, se usa la imagen OG por defecto si no hay imagen definida.

## Tracking: GA4, GTM, píxeles

### GA4 y Enhanced Ecommerce

Campo **GA4 Measurement ID**: formato `G-XXXXXXXXXX`. Validación automática del formato.

Marque **Enhanced Ecommerce** para activar los eventos `view_item`, `view_item_list`, `add_to_cart`, `remove_from_cart`, `begin_checkout`, `add_payment_info`, `purchase`.

Marque **Respetar Consent Mode v2** para anonimizar los hits hasta el consentimiento explícito (compatible con las CMP estándar).

### Google Tag Manager

Campo **GTM ID**: formato `GTM-XXXXXXX`. El módulo inyecta el snippet GTM en el `head` y el fallback `noscript` justo después de la apertura del `body`.

### Píxeles publicitarios

- **Facebook Pixel ID**: 15 dígitos
- **TikTok Pixel ID**: alfanumérico

Si Consent Mode v2 está activo, estos píxeles solo se activan tras el consentimiento.

### Verificaciones de propiedad

Pegue los valores de las etiquetas de verificación (sin la etiqueta `meta` completa, solo el contenido del atributo `content`):

- Google Search Console
- Bing Webmaster Tools
- Yandex Webmaster
- Pinterest
- Baidu

### Código personalizado head y body-end

Dos campos libres aceptan HTML/JS arbitrario:

- **Código inyectado en head**: para scripts de terceros, metas complementarias
- **Código inyectado justo antes del cierre del body**: ideal para widgets de chat, retargeting tardío, scripts asíncronos

Estos campos no efectúan validación. Un error de sintaxis HTML puede romper el renderizado de la página. Pruebe en pre-producción antes de publicar.

## Analizador de contenido

Pestaña **Analizador**. Envíe un producto, una categoría, una página CMS o HTML bruto al analizador para obtener un score SEO global y un desglose detallado de métricas.

### Métricas calculadas

- **Score SEO global** (0-100) — ponderación weighted de los checks
- **Legibilidad Flesch** — aproximación multilingüe (vowel-group syllable count)
- **Número de palabras**, **número de frases**
- **Densidad de la palabra clave principal** (en %)
- **Enlaces internos / externos / nofollow**
- **Imágenes sin atributo alt**
- **Estructura de títulos H1 a H6**
- Presencia de la palabra clave en **slug** y **primer párrafo**

### Verificaciones (checks)

El analizador devuelve una lista de checks con estado `good` / `warn` / `bad`:

- Longitud del title (50-60 caracteres)
- Longitud de la meta description (140-160 caracteres)
- Presencia y longitud del slug
- Longitud del cuerpo (mínimo 300 palabras)
- Presencia de al menos una imagen con alt
- Palabra clave en title, en primer párrafo, en slug
- Densidad de palabra clave entre 0,5% y 2,5%
- Al menos un H1 y varios H2/H3

El analizador es una guía, no una verdad absoluta. Un score de 80+ es excelente. Por debajo de 50, revise la estructura y la redacción. Nunca sacrifique la calidad editorial por un score.

## Edición masiva

Pestaña **Edición masiva**. Grilla paginada (30 entradas/página) con filtros para modificar rápidamente `meta_title`, `meta_description` y `link_rewrite` en productos, categorías o páginas CMS.

### Filtros disponibles

- **Todas**
- **Sin title**: solo entradas con meta_title vacío
- **Sin descripción**: solo entradas con meta_description vacío
- **Búsqueda por nombre**

### Aplicar plantillas en masa

El botón **Aplicar plantillas** aplica automáticamente la plantilla definida para el tipo de entidad actual a las fichas que coinciden con los filtros. Marque **Aplicar solo a campos vacíos** para evitar sobrescribir metas ya rellenadas.

## Metabox SEO en la ficha de producto

En la página de edición de un producto en el back-office, se añade un encart **DataFirefly SEO** con:

- Un **score SEO en directo** (7 checks: longitud title, descripción, slug, body, imagen, EAN13, marca)
- Una **vista previa SERP Google** renderizada fielmente
- La palabra clave principal detectada

## Ajustes avanzados

### Indexación

Pestaña **Ajustes → Indexación**:

- **hreflang multilingüe**: genera las etiquetas `link rel="alternate"` en todas las páginas
- **Estrategia x-default**: _Idioma por defecto_ (recomendado), _Inglés_, o _Desactivado_
- **URL canonical**: inyecta `link rel="canonical"`
- **Canonical en paginación**: _En la página actual_ (recomendado), _Siempre en página 1_, o _Sin canonical_
- **noindex automáticos**: páginas /search, carrito, mi cuenta, novedades, mejores ventas, promociones, facetas
- **Canonical hacia la página padre en facetas**: evita el duplicate content de la navegación por facetas

### Imágenes

- **Generación automática de atributos alt**: al guardar una imagen sin alt, aplica la plantilla
- **Plantilla alt**: por defecto `{product_name} - {shop_name}`
- **Lazyload imágenes nativo**: añade `loading="lazy"` y `decoding="async"` a todas las imágenes, con fallback IntersectionObserver para imágenes `data-src`

### Mantenimiento

- **Vaciar la caché**: purga la caché Smarty + caché PrestaShop
- **Purgar 404 antiguos**: aplica el umbral configurado
- **Exportar todos los datos (JSON)**: descarga un archivo JSON con todas las tablas SEO de la tienda actual (útil para migración entre entornos o backup antes de desinstalar)

## Multi-tienda

Todas las funcionalidades están limitadas por `id_shop`. Al pasar de una tienda a otra mediante el selector de contexto PrestaShop, ve y modifica únicamente los datos de esa tienda.

Casos particulares a conocer:

- **Plantillas**: una plantilla por par (tipo de entidad, tienda). Defina explícitamente las plantillas para cada tienda.
- **Sitemap**: un sitemap_index distinto por tienda, accesible en `https://tienda-1.com/sitemap.xml`, `https://tienda-2.com/sitemap.xml`, etc.
- **Robots.txt**: reglas por tienda, servidas en el dominio correspondiente
- **Redirecciones**: por tienda
- **Esquemas personalizados**: por tienda

## Solución de problemas

### El sitemap no se genera

- Verifique que la carpeta `modules/dfallinoneseo/sitemaps/` tiene permisos de escritura para PHP
- Verifique los permisos: `chmod 755 modules/dfallinoneseo/sitemaps/`
- Aumente `max_execution_time` en php.ini si tiene más de 50.000 productos

### Los esquemas JSON-LD no aparecen

- Verifique que el módulo está activado (**Ajustes → General**)
- Verifique que el tipo de esquema correspondiente está activado (**Schema → Tipos de esquemas generados**)
- Vacíe la caché PrestaShop
- Inspeccione el código fuente HTML: los esquemas se inyectan en un bloque `script type="application/ld+json"`

### Las redirecciones 301 no funcionan

- Verifique que el módulo está instalado y activado
- Verifique que las redirecciones están marcadas como **activas** (pastilla ON)
- Para regex, pruebe su expresión en [regex101.com](https://regex101.com/) en modo PCRE
- El orden de prioridad es: exacto → prefijo → regex (por `hit_count` descendente)

### GA4 / GTM no se inyecta

- Verifique el formato del ID (`G-XXXXXXX` o `GTM-XXXXXXX`)
- Si Consent Mode v2 está activo, el snippet está en modo "denied" por defecto hasta el consentimiento. Verifique la capa CMP.
- Inspeccione el `head` de la página: el snippet GA4/GTM se inyecta justo antes del cierre

### El robots.txt no cambia

- Verifique que no exista un archivo `robots.txt` estático en la raíz del sitio (tendría prioridad sobre el módulo). Elimínelo.
- El módulo sirve robots.txt vía una ruta PrestaShop — verifique que las _URL amigables_ están activadas

### Error al crear las tablas SQL en la instalación

- Verifique que el usuario MySQL tiene los permisos `CREATE` y `ALTER`
- Verifique la codificación: MySQL debe soportar `utf8mb4` con collation `utf8mb4_unicode_ci`
- Si el prefijo de tabla personalizado de PrestaShop supera 5 caracteres, algunos nombres de índice pueden superar el límite MySQL de 64 caracteres. Contacte con soporte.

## Referencia técnica

### Hooks utilizados

El módulo registra 18 hooks:

- `displayHeader` — inyección de etiquetas meta, canonical, hreflang, OG, Twitter, JSON-LD, GA4/GTM, verificaciones
- `displayBeforeBodyClosingTag` — inyección GTM noscript, FB Pixel noscript, custom body-end code
- `displayBackOfficeHeader` — CSS/JS del back-office
- `displayAdminProductsExtra` — metabox SEO en ficha de producto
- `actionDispatcherBefore`, `actionDispatcherAfter` — routing de redirecciones y captura 404
- `actionObjectProductAddAfter`, `actionObjectProductUpdateAfter` — auto-fill meta + auto-301
- `actionObjectCategoryAddAfter`, `actionObjectCategoryUpdateAfter` — idem categoría
- `actionObjectCmsAddAfter`, `actionObjectCmsUpdateAfter` — idem CMS
- `actionObjectManufacturerUpdateAfter`, `actionObjectSupplierUpdateAfter` — auto-301 al cambiar slug
- `actionAdminControllerSetMedia`, `actionFrontControllerSetMedia` — assets CSS/JS
- `displayProductExtraContent` — reservado para usos futuros
- `moduleRoutes` — rutas `/sitemap.xml`, `/plan-du-site`, `/robots.txt`, `/llms.txt`

### Tablas SQL añadidas

Todas las tablas usan el prefijo `df_seo_`, charset `utf8mb4`, collation `utf8mb4_unicode_ci`:

- `df_seo_meta`, `df_seo_meta_lang` — sobrescrituras meta por entidad
- `df_seo_template`, `df_seo_template_lang` — plantillas por tipo
- `df_seo_redirect` — redirecciones 301/302/307/308/410
- `df_seo_404` — diario de 404
- `df_seo_score` — snapshots de score (analizador)
- `df_seo_keyword` — focus keywords
- `df_seo_robots_rule` — reglas robots.txt
- `df_seo_schema_custom` — esquemas JSON-LD personalizados
- `df_seo_log` — log diagnóstico interno

### Desinstalación

La desinstalación elimina los hooks y las pestañas del back-office, pero **conserva las tablas SQL y los datos**. Para purgar completamente:

```
DROP TABLE ps_df_seo_meta, ps_df_seo_meta_lang, ps_df_seo_template, ps_df_seo_template_lang,
           ps_df_seo_redirect, ps_df_seo_404, ps_df_seo_score, ps_df_seo_keyword,
           ps_df_seo_robots_rule, ps_df_seo_schema_custom, ps_df_seo_log;
DELETE FROM ps_configuration WHERE name LIKE 'DFSEO_%';
```

Antes de desinstalar, use **Ajustes → Mantenimiento → Exportar todos los datos (JSON)** para conservar un archivo completo. El formato JSON permite reimportar redirecciones, plantillas y esquemas en otra instalación.

## Actualizaciones y soporte

- **Actualizaciones**: 12 meses incluidos desde la compra. Renovación anual opcional a 49 €.
- **Soporte**: 12 meses por email, respuesta en 48h hábiles.
- **Changelog** y descarga de las últimas versiones en [su cuenta de cliente DataFirefly](https://www.datafirefly.com/es/producto/dfallinoneseo/).
