DF Faceted SEO — Búsqueda por facetas y SEO PrestaShop
Indexación inteligente de URLs facetadas, landings SEO y motor de filtros de alto rendimiento para PrestaShop 8 y 9.
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
- Sube el archivo ZIP vía Módulos → Module Manager → Subir un módulo.
- Pulsa Instalar. El módulo crea automáticamente 10 tablas
ps_dffacetedseo_*y 5 pestañas bajo Mejorar. - Ve a Mejorar → DF Faceted SEO → Panel.
- Pulsa Reconstruir el índice. Este paso es obligatorio la primera vez: sin índice, el motor de búsqueda no tiene datos.
- 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:
- El módulo busca primero una regla scope
categorysobre Zapatos - Si existe y matchea, se aplica
- Sino busca una regla scope
attribute_groupsobre Color - Sino remonta a la regla global
- 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
- Ve a Mejorar → DF Faceted SEO → Landings
- Pulsa Añadir
- Sección Targeting: elige la categoría y eventualmente la marca
- Sección Visualización: orden por defecto, dirección, activación, indexación, prioridad
- 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.
- 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.
- 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
- Ve a Mejorar → DF Faceted SEO → Estadísticas
- Filtra por categoría, mínimo de hits, límite de visualización
- Ordena por hits descendentes
- Identifica las combinaciones con más de 50 hits semanales
- Pulsa Promover en la columna acción
- El formulario de landing se abre prerellenado con la combinación de filtros
- 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 hookmoduleRoutesy 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
pushStatepara actualizar la URL sin recargar- Actualización en tiempo real de las etiquetas
canonicalyrobots - 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ámicosactionFrontControllerSetMedia: CSS y JS frontendmoduleRoutes: ruta limpia para las landingsdisplayLeftColumn: inyección del panel de filtrosdisplayBeforeBodyClosingTag: JSON-LD en landingsactionProductSearchProviderRunQuery: integración con el motor PSactionProductSaveyactionProductDelete: reindexación incrementalactionCategoryUpdate: invalidación de la caché de categoríadisplayBackOfficeHeader: 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.
- Comprueba que Preferencias → SEO y URLs → Activar URLs amigables está en SÍ
- Guarda esta página (regenera el
.htaccess) - Vacía la caché de PrestaShop dos veces
- Ve a Módulos → Posiciones, verifica que
dffacetedseoestá vinculado amoduleRoutes - 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 precisando la versión PrestaShop, PHP, módulo y los logs PHP/PrestaShop.