# DF Faceted SEO — Búsqueda por facetas y SEO PrestaShop

> DF Faceted SEO convierte la búsqueda por facetas de PrestaShop en una palanca SEO duradera y acelera las páginas de categoría de 10 a 30 veces gracias a un índice…

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

DF Faceted SEO convierte la búsqueda por facetas de PrestaShop en una palanca SEO duradera y acelera las páginas de categoría de 10 a 30 veces gracias a un índice desnormalizado. Esta documentación cubre la instalación, la configuración de las reglas de indexación, la creación de landings SEO y la explotación de las estadísticas de combinaciones populares.

## Presentación

El módulo nativo `ps_facetedsearch` genera mecánicamente una URL para cada combinación de filtros posible. En un catálogo de unos miles de productos con cinco facetas, eso representa millones de URLs que Google explora, diluyendo tu presupuesto de crawl y tu PageRank entre páginas casi idénticas.

DF Faceted SEO resuelve este problema de dos maneras paralelas:

- **Indexación inteligente**: reglas de negocio deciden qué combinaciones son indexables, cuáles reciben `noindex follow`, y dónde apunta el canonical.
- **Landings SEO dedicadas**: para combinaciones con fuerte potencial comercial (por ejemplo «zapatos rojos talla 42»), crea landings con URL limpia, H1 personalizado, meta personalizados y contenido editorial por idioma.

Como bonus, el motor de búsqueda del módulo reemplaza el motor nativo por un sistema mucho más rápido basado en un índice desnormalizado y una caché de dos niveles.

## Requisitos

- PrestaShop 8.0 a 9.x
- PHP 8.1 o superior
- MySQL 5.7 o MariaDB 10.3 mínimo
- URLs amigables activadas (_Preferencias → SEO y URLs_)
- Permisos estándar para crear tablas MySQL

## Instalación

1. Sube el archivo ZIP vía _Módulos → Module Manager → Subir un módulo_.
2. Pulsa **Instalar**. El módulo crea automáticamente 10 tablas `ps_dffacetedseo_*` y 5 pestañas bajo _Mejorar_.
3. Ve a _Mejorar → DF Faceted SEO → Panel_.
4. Pulsa **Reconstruir el índice**. _Este paso es obligatorio la primera vez_: sin índice, el motor de búsqueda no tiene datos.
5. Vacía la caché de PrestaShop: _Parámetros avanzados → Rendimiento → Vaciar la caché_.

En un catálogo de 50 000 productos, la reconstrucción del índice tarda típicamente entre 2 y 5 minutos. El módulo inserta filas por lotes de 500.

## Primeros pasos — Panel

El panel (_Mejorar → DF Faceted SEO_) muestra seis tarjetas estadísticas:

- **Reglas activas**: número de reglas de indexación habilitadas
- **Landings**: número de landings SEO creadas
- **Productos en el índice**: número de productos indexados (debería estar cerca del total del catálogo)
- **Filas en el índice**: número de pares (producto, valor de filtro) — la tabla desnormalizada
- **Entradas en caché**: número de consultas en caché
- **Combinaciones populares**: número de combinaciones observadas

Debajo de las tarjetas, dos bloques de operaciones:

- **Reconstruir el índice**: útil tras un gran cambio de catálogo (importación masiva, cambio de estructura de atributos)
- **Vaciar la caché**: útil tras un cambio de regla o de ajuste

## Reglas de indexación

Las reglas deciden, para cada combinación de filtros visitada, qué etiqueta `robots` y qué `canonical` se envían al navegador y a Google. Una regla tiene un **scope** (zona de aplicación) y una **política** (decisión).

### Scopes disponibles

- **Global**: se aplica a todas las páginas facetadas del catálogo
- **Categoría específica**: se aplica solo a páginas de una categoría dada
- **Grupo de atributos**: se aplica a combinaciones que contienen un grupo específico (por ejemplo todas las páginas filtradas por Color)
- **Característica**: ídem, para una característica de producto
- **Marca**: ídem, para una marca
- **Rango de precio**: se aplica a páginas filtradas por una franja tarifaria dada

### Políticas disponibles

- **Index, follow**: página indexable, canonical apuntando a sí misma normalizado
- **Noindex, follow**: página no indexada, pero los enlaces se siguen (recomendado para combinaciones raras)
- **Canonical parent**: página accesible pero el canonical apunta a la categoría padre (se transfiere el valor SEO)
- **Canonical self normalizado**: canonical sobre la página misma con los filtros ordenados y agrupados (elimina duplicados de URL para la misma combinación)

### Cadena de prioridad

El módulo evalúa las reglas **de la más específica a la más genérica**. Concretamente, para una página de la categoría Zapatos filtrada por color:

1. El módulo busca primero una regla scope `category` sobre Zapatos
2. Si existe y matchea, se aplica
3. Sino busca una regla scope `attribute_group` sobre Color
4. Sino remonta a la regla global
5. Si ninguna regla matchea, se aplica la política por defecto del panel

### Campos avanzados de una regla

- **Máximo de filtros indexables**: si la combinación contiene más filtros que este límite, la política cae automáticamente a `noindex follow`. Ejemplo: 2 filtros máximo en zapatos (color + talla indexables, pero no color + talla + material + temporada).
- **Whitelist de valores**: IDs de valores permitidos (separados por comas). Una combinación que contenga solo valores de la whitelist es indexable. Ejemplo: whitelist colores rojo, negro, blanco, azul — colores raros como «verde manzana» no se indexarán.
- **Blacklist de valores**: lo opuesto. Toda combinación que contenga un valor en la blacklist cae automáticamente a `noindex`.
- **Mínimo de productos**: si la combinación no devuelve al menos este número de productos, pasa a `noindex`. Evita indexar páginas casi vacías.
- **Prioridad**: entero. En caso de conflicto entre dos reglas del mismo scope, gana la prioridad más alta.

Estrategia de inicio recomendada: crea una regla _global_ con política `canonical parent` y máximo 1 filtro indexable, luego añade progresivamente reglas más específicas para abrir la indexación de combinaciones con fuerte potencial.

## Landings SEO

Las landings son páginas dedicadas a combinaciones de filtros estratégicas. Tienen su propia URL limpia, su propio H1, sus propios meta y contenido editorial por idioma.

### Crear una landing

1. Ve a _Mejorar → DF Faceted SEO → Landings_
2. Pulsa **Añadir**
3. Sección **Targeting**: elige la categoría y eventualmente la marca
4. Sección **Visualización**: orden por defecto, dirección, activación, indexación, prioridad
5. Sección **Combinación de filtros**: añade los filtros que componen la combinación (grupo de atributos y valores, característica o marca). Ejemplo: Color = Rojo Y Talla = 42.
6. Pestañas multilingües: para cada idioma rellena el nombre interno, el slug, el H1, el meta title, la meta description, el contenido intro y outro.
7. Guarda

### Estructura de URL

La URL de una landing sigue el patrón:

```
https://tu-dominio.com/landing/tu-slug
https://tu-dominio.com/en/landing/tu-slug
https://tu-dominio.com/fr/landing/tu-slug
```

El prefijo de idioma lo gestiona automáticamente el router de PrestaShop en cuanto las URLs amigables están activas y varios idiomas están habilitados en la tienda.

Si recibes un 404 sobre la URL de una landing, comprueba en este orden: URLs amigables activas, `.htaccess` regenerado (botón Guardar al final de SEO y URLs), caché vaciada, landing activa en el formulario, hook `moduleRoutes` correctamente vinculado al módulo en _Módulos → Posiciones_.

### Contenido editorial

Para cada idioma dispones de dos bloques HTML enriquecidos:

- **Intro**: se muestra encima de la cuadrícula de productos. Ideal para un párrafo SEO de 150 a 300 palabras con tus palabras clave objetivo.
- **Outro**: se muestra debajo de la cuadrícula. Ideal para elementos de reaseguro, guías de compra, FAQs.

### JSON-LD automático

Cada landing inyecta automáticamente dos bloques JSON-LD en la página:

- **BreadcrumbList**: Inicio → Categoría → Landing
- **Product**: un bloque Product por producto mostrado (nombre, precio, imagen, URL, disponibilidad)

Obtienes automáticamente los rich snippets de Google sin configuración adicional.

## Estadísticas de combinaciones populares

El módulo registra automáticamente, en la tabla `ps_dffacetedseo_combination_log`, cada combinación de filtros realmente visitada por tus clientes: firma, número de hits, última vez vista.

### Explotar las estadísticas

1. Ve a _Mejorar → DF Faceted SEO → Estadísticas_
2. Filtra por categoría, mínimo de hits, límite de visualización
3. Ordena por hits descendentes
4. Identifica las combinaciones con más de 50 hits semanales
5. Pulsa **Promover** en la columna acción
6. El formulario de landing se abre **prerellenado** con la combinación de filtros
7. Solo te queda rellenar el contenido editorial y guardar

### Mantenimiento

Al final de la página Estadísticas hay un botón _Purgar datos antiguos_ con un campo «días a conservar». Recomendado: purgar cada 90 días para evitar un crecimiento ilimitado de la tabla.

## Parámetros globales

El panel ofrece 11 parámetros globales agrupados en 3 secciones.

### Indexación

- **Política por defecto**: política aplicada cuando ninguna regla matchea
- **Máximo de filtros indexables**: valor global (puede ser sobrescrito por regla)
- **Mínimo de productos por combinación**: umbral global para considerar una página indexable

### Rendimiento

- **TTL de la caché (segundos)**: vida útil de una entrada en caché. Por defecto: 3600 (1 hora). Aumenta a 86400 (24 h) en producción estable.
- **Ocultar filtros vacíos**: si está activado, los valores con 0 resultados se ocultan
- **Límite de resultados por página**: paginación de productos

### URLs

- **Prefijo de URLs de landings**: por defecto `landing`. El patrón de ruta se define en duro en el hook `moduleRoutes` y usa este prefijo.

## Canonical inteligente

En cada página facetada, el módulo calcula el canonical óptimo:

- Combinación que matchea una landing existente: canonical = URL pretty de la landing
- Combinación indexable según las reglas: canonical = self normalizado
- Combinación no indexable según las reglas: canonical = categoría padre
- Página de categoría sin filtro: canonical = self estándar

## Motor de filtros de alto rendimiento

El motor se apoya en la tabla `ps_dffacetedseo_index`: una fila por par (producto, tipo de filtro, valor). La consulta se transforma en una intersección de conjuntos de identificadores de producto.

### Caché de dos niveles

- **Nivel 1: memoria (in-process)**. Evita repetir la misma consulta dos veces en la misma página.
- **Nivel 2: base de datos (tabla ps_dffacetedseo_cache)**. Persiste los resultados entre peticiones con TTL.

### Invalidación automática

El módulo escucha los hooks `actionProductSave`, `actionProductDelete` y `actionCategoryUpdate`. Cada vez que se guarda un producto, su entrada en el índice se regenera y todas las entradas en caché relacionadas se invalidan.

### AJAX y UX

El panel de filtros front está totalmente gestionado en AJAX:

- Debounce de 250 ms en los cambios de filtros
- `pushState` para actualizar la URL sin recargar
- Actualización en tiempo real de las etiquetas `canonical` y `robots`
- Scroll suave hacia la cuadrícula de productos tras la actualización
- Chips activos clicables para quitar un filtro individual
- Slider de precio con campos numéricos y botón Aplicar
- Swatches de color visibles en atributos de tipo Color

## Multitienda y multilingüe

El módulo es nativamente multitienda y multilingüe:

- Cada landing tiene traducciones por idioma (tabla `ps_dffacetedseo_landing_page_lang`)
- Cada landing puede restringirse a una o varias tiendas (tabla `ps_dffacetedseo_landing_page_shop`)
- Las reglas de indexación se aplican por defecto a todas las tiendas
- El índice está particionado por tienda
- Las traducciones de la interfaz se entregan en francés e inglés (XLIFF en `translations/`)

## Arquitectura técnica

### Hooks utilizados

- `displayHeader`: canonical y meta robots dinámicos
- `actionFrontControllerSetMedia`: CSS y JS frontend
- `moduleRoutes`: ruta limpia para las landings
- `displayLeftColumn`: inyección del panel de filtros
- `displayBeforeBodyClosingTag`: JSON-LD en landings
- `actionProductSearchProviderRunQuery`: integración con el motor PS
- `actionProductSave` y `actionProductDelete`: reindexación incremental
- `actionCategoryUpdate`: invalidación de la caché de categoría
- `displayBackOfficeHeader`: CSS y JS admin

### Tablas creadas

| Tabla | Rol |
| --- | --- |
| `dffacetedseo_rule` | Reglas de indexación por scope |
| `dffacetedseo_landing_page` | Landings (datos) |
| `dffacetedseo_landing_page_lang` | Traducciones de landings |
| `dffacetedseo_landing_page_shop` | Enlaces multitienda |
| `dffacetedseo_landing_filter` | Filtros asociados a landings |
| `dffacetedseo_combination_log` | Estadísticas de visita |
| `dffacetedseo_cache` | Caché de resultados |
| `dffacetedseo_filter_template` | Plantillas de filtros reutilizables |
| `dffacetedseo_index` | Índice desnormalizado (clave de rendimiento) |
| `dffacetedseo_setting` | Parámetros internos |

### Convención de URL de filtros

```
?attribute_group__{id_group}=v1,v2&feature__{id_feature}=v3&manufacturer__0=5&price=10-50&s=needle
```

Se calcula una firma SHA-1 estable para comparar combinaciones (matching landing, clave de caché, log).

## Rendimiento esperado

Mediciones realizadas en un catálogo de referencia (50 000 productos, 8 facetas activas):

| Motor | Tiempo medio |
| --- | --- |
| `ps_facetedsearch` nativo | 800 ms a 1,4 s por consulta |
| DF Faceted SEO sin caché | 50 a 120 ms |
| DF Faceted SEO con caché | menos de 10 ms |

Ganancia típica: **×10 a ×30**

## FAQ técnica

### ¿Hay que desinstalar ps_facetedsearch?

No, el módulo se integra mediante los hooks oficiales. Puedes probarlo en paralelo. Una vez validado, desinstala `ps_facetedsearch` para evitar la duplicación del panel de filtros.

### ¿Es compatible con HTTPS y URLs canónicos absolutos?

Sí. El módulo usa `Context::getContext()->link->getPageLink()` y `getModuleLink()` que respetan la configuración HTTPS de PrestaShop.

### ¿Cómo añadir un nuevo idioma del lado módulo?

Copia el archivo `translations/fr-FR.xlf` a `translations/xx-XX.xlf` y traduce las entradas `trans-unit`. Ninguna otra intervención necesaria.

### ¿Soporta atributos combinados?

Sí. El índice desnormalizado indexa las declinaciones a través de sus atributos. El motor filtra los productos cuya al menos una declinación corresponde a todos los filtros activos.

### ¿Cómo depurar una regla que no se aplica?

Activa los logs PrestaShop (_Parámetros avanzados → Logs_) y consulta la sección `dffacetedseo`.

## Resolución de problemas

### Fatal error en una llamada a `getBySlug`

Síntoma: `Call to a member function getBySlug() on false`. Causa: antiguo helper `get()` que devolvía `false` en lugar del objeto servicio. Corregido en v1.0.1. Actualiza el módulo.

### 404 sobre la URL de una landing

Síntoma: `https://tu-sitio/en/landing/tu-slug` devuelve 404. Causa típica: el hook `moduleRoutes` no está registrado o la caché de rutas PrestaShop está obsoleta.

1. Comprueba que _Preferencias → SEO y URLs → Activar URLs amigables_ está en SÍ
2. Guarda esta página (regenera el `.htaccess`)
3. Vacía la caché de PrestaShop dos veces
4. Ve a _Módulos → Posiciones_, verifica que `dffacetedseo` está vinculado a `moduleRoutes`
5. Fallback de test: `https://tu-sitio/index.php?fc=module&module=dffacetedseo&controller=landing&slug=tu-slug`

### El motor de búsqueda no devuelve ningún producto

El índice probablemente está vacío. Ve al panel y pulsa **Reconstruir el índice**.

### Los filtros no se muestran en la columna

Verifica en _Módulos → Posiciones_ que `dffacetedseo` está vinculado al hook `displayLeftColumn`.

### Rendimiento degradado tras importación masiva de productos

La invalidación incremental funciona bien para modificaciones unitarias. Tras una importación masiva, es más rápido reconstruir el índice entero desde el panel y vaciar la caché.

## Actualizaciones

El módulo sigue un versionado `MAYOR.MENOR.PARCHE`. Las correcciones críticas se entregan como parches; las nuevas funcionalidades suben la minor. Cada actualización entrega un script `upgrade/upgrade-X.Y.Z.php` que se ejecuta automáticamente.

## Soporte

Para cualquier pregunta o reporte de bug, contacta con [support@datafirefly.com](mailto:support@datafirefly.com) precisando la versión PrestaShop, PHP, módulo y los logs PHP/PrestaShop.
