PS PrestaShop Intermedio

Thin Content Detector — Documentación

Detección automática de contenido pobre, duplicados y boilerplate en tu catálogo PrestaShop con sugerencias de enriquecimiento por IA. Instalación, configuración de umbrales, proveedores IA, escaneo cron y resolución de problemas.

Actualizado Versión del módulo 1.0.0

DataFirefly Thin Content Detector escanea automáticamente tus productos, categorías y páginas CMS en todos los idiomas activos de tu tienda. Detecta tres patrones tóxicos para el SEO — contenido demasiado pobre, descripciones duplicadas y páginas dominadas por boilerplate — y genera sugerencias de enriquecimiento por IA listas para pegar. Esta guía cubre la instalación, configuración, uso diario, planificación cron y resolución de problemas.

Visión general

Desde el Helpful Content Update, Google está degradando activamente las páginas con contenido demasiado corto, demasiado similar a otras páginas, o demasiado dominado por elementos repetidos. En un catálogo e-commerce, suelen ser fichas de producto copiadas del proveedor, categorías con dos frases genéricas, o variantes que comparten el 95 % de su descripción. Invisible a simple vista en 500 productos — pero acumulado, es lo que impide que tu sitio posicione.

Los tres tipos de detección

  • Thin content — páginas por debajo del umbral de palabras configurable. Tres niveles de gravedad según la distancia al umbral (crítica < 25 %, advertencia 25–75 %, aviso 75–100 %).
  • Duplicados — detección en dos pasos: hash SHA1 para duplicados exactos (gravedad 3), después similitud Jaccard ≥ umbral configurable para cuasi-duplicados (gravedad 2).
  • Ratio plantilla / contenido — identifica los tokens compartidos con páginas hermanas (misma categoría padre) y calcula el porcentaje de tokens únicos por página. Una página con 200 palabras pero 90 % de boilerplate es tan tóxica como una página de 30 palabras.

Instalación

  1. Sube el ZIP del módulo a través de Módulos > Gestor de módulos > Subir un módulo.
  2. Haz clic en Instalar. El módulo crea dos tablas (ps_dfthincontent_issue y ps_dfthincontent_scan) y una pestaña de administración bajo Catálogo.
  3. Accede al módulo a través de Catálogo > Thin Content (DataFirefly).
Compatibilidad. PrestaShop 8.0 – 9.x, PHP 7.4 – 8.3, MySQL 5.6+ / MariaDB 10.3+. Multitienda compatible de forma nativa (la clave única de los problemas incluye id_shop). Sin dependencia de Composer.

Configuración

Haz clic en el botón Configuración en la barra del módulo. Hay tres paneles disponibles.

Umbrales de detección

  • Palabras mínimas producto — por defecto 150. Cualquier producto cuya descripción larga + corta combinadas contenga menos de 150 palabras será marcado.
  • Palabras mínimas categoría — por defecto 100.
  • Palabras mínimas página CMS — por defecto 250.
  • Umbral de similitud Jaccard — por defecto 85 %. Por encima, dos páginas se consideran cuasi-duplicados.
  • Ratio mínimo de plantilla — por defecto 30 %. Por debajo, la página se considera demasiado dominada por boilerplate.
¿Qué umbral elegir? 150 palabras por producto es un buen punto de partida para la mayoría de tiendas. Para textil o consumibles, puedes bajar a 100. Para electrónica técnica o hogar, sube a 250. Para la similitud Jaccard, 85 % captura los duplicados reales sin marcar cada variante legítima; baja a 75 % si tienes muchas variantes muy cercanas que diferenciar.

Objetivos de escaneo

  • Escanear productos (ON por defecto).
  • Escanear categorías (ON por defecto).
  • Escanear páginas CMS (ON por defecto).
  • Reescaneo automático al guardar (OFF por defecto). Cuando se activa, cada guardado de un producto, categoría o página CMS desencadena un retest dirigido solo de ese objeto. Ves en tiempo real si tu reescritura supera los umbrales.

Configuración IA

Las sugerencias de enriquecimiento utilizan un endpoint compatible con OpenAI (chat completions). Esto incluye una amplia gama de proveedores:

  • OpenAI — endpoint https://api.openai.com/v1/chat/completions, modelo recomendado gpt-4o-mini (≈ 0,001 € por sugerencia).
  • Mistral AI — endpoint https://api.mistral.ai/v1/chat/completions, modelo mistral-small-latest.
  • Groq — endpoint https://api.groq.com/openai/v1/chat/completions, modelo llama-3.3-70b-versatile. Muy rápido.
  • Ollama en local — endpoint http://localhost:11434/v1/chat/completions, cualquier modelo descargado. Coste cero.
  • Anthropic mediante un proxy compatible con OpenAI.

Parámetros a rellenar:

  • Endpoint — URL completa hacia /v1/chat/completions.
  • Modelo — identificador del modelo en el proveedor.
  • Clave API — Bearer token. Almacenada cifrada mediante el sistema de configuración de PrestaShop.
  • Max tokens — por defecto 600. Suficiente para una sugerencia de enriquecimiento estándar.
La clave API no es obligatoria. La detección y el seguimiento de problemas funcionan sin IA. Solo las sugerencias de enriquecimiento requieren un endpoint configurado. Puedes usar perfectamente el módulo en modo auditoría pura.

Uso — Dashboard

El dashboard es la página de inicio del módulo. Muestra:

  • Tres contadores principales — total de problemas abiertos, corregidos, ignorados.
  • Desglose por tipo de problema — thin / duplicate / template.
  • Desglose por tipo de objeto — producto / categoría / página CMS.
  • Umbrales actuales — recordatorio de los valores configurados.
  • Últimos 5 escaneos — fecha, duración, número de objetos analizados.
  • Botón «Lanzar escaneo completo» — desencadena un escaneo síncrono mediante AJAX. Una modal muestra el progreso y el resumen al final.

Lanzar un escaneo

Haz clic en Lanzar escaneo completo. El escaneo recorre todos los idiomas activos, aplica los tres analizadores a los objetivos activados, persiste los problemas detectados en ps_dfthincontent_issue, y marca como fixed los problemas que ya no se detectan (por ejemplo si has enriquecido una ficha desde el último escaneo).

En catálogos grandes (más de 5 000 productos), prefiere el escaneo mediante cron (ver más abajo). El escaneo síncrono sigue siendo utilizable pero puede exceder el límite de tiempo PHP por defecto. El escaneo cron levanta automáticamente los límites set_time_limit(0) y memory_limit 512M.

Uso — Lista de problemas

Accesible mediante Ver problemas en la barra. Visualización paginada (50 por página) con filtros avanzados:

  • Estado — abierto / corregido / ignorado.
  • Tipo de problema — thin / duplicate / template.
  • Tipo de objeto — producto / categoría / CMS.
  • Idioma — filtro sobre uno de los idiomas activos.
  • Búsqueda libre — sobre el nombre del objeto.

Cada fila muestra la gravedad (punto rojo / naranja / azul), el tipo de problema, el tipo de objeto con icono, el nombre, el idioma, el número de palabras, la métrica relevante (% similitud o % unicidad) y tres botones de acción:

  • Sugerencia IA — abre una modal con una sugerencia de enriquecimiento HTML generada bajo demanda (ver siguiente sección).
  • Marcar corregido — mueve el problema al estado fixed. Se mantiene en el historial pero ya no contamina los contadores.
  • Ignorar — mueve el problema al estado ignored. Útil para páginas intencionadamente cortas (por ejemplo una página CMS «Contacto» legítimamente corta).

Exportación CSV

El botón Exportar CSV descarga todos los problemas del filtro actual. La exportación se transmite en streaming (chunks de 500 filas) para gestionar catálogos grandes sin saturación de memoria. Codificación UTF-8 con BOM para abrir directamente en Excel. Delimitador punto y coma.

Sugerencias IA

Haz clic en el botón IA en cualquier fila. El módulo envía una petición al endpoint configurado con un prompt construido dinámicamente a partir del tipo de problema y del tipo de objeto:

  • Thin producto — enriquecer con USP, materiales, uso, procedencia, garantías.
  • Thin categoría — enriquecer con USP de gama, consejos de compra, comparación de subcategorías.
  • Thin CMS — desarrollo editorial, contexto, ejemplos.
  • Duplicado — diferenciar la ficha centrándose en lo que la hace única respecto a sus duplicados.
  • Plantilla — eliminar boilerplate, añadir elementos únicos a esta página específica.

El mensaje del sistema impone un retorno en HTML limpio: etiquetas p, ul, li, h3 únicamente. Sin markdown, sin etiquetas raíz. Puedes pegar el resultado directamente en el campo de descripción de TinyMCE sin limpieza.

La sugerencia se almacena en la base de datos. Si reabres la modal más tarde, se muestra al instante sin nueva llamada a la API.

Flujo de trabajo recomendado. Filtra por gravedad crítica, genera las sugerencias una por una, copia cada sugerencia en la ficha correspondiente, guarda. Si el reescaneo automático está activado, el problema pasa a fixed automáticamente en cuanto el guardado supera los umbrales.

Cron — Escaneos programados

El módulo expone un endpoint cron protegido por token, ideal para escaneos nocturnos:

https://tu-tienda.com/modules/dfthincontent/cron.php?token=TU_TOKEN

El token se genera aleatoriamente durante la instalación y se muestra en el panel de configuración. Mantenlo confidencial — da acceso al desencadenamiento de un escaneo completo.

Ejemplo de crontab (escaneo diario a las 4h)

0 4 * * * curl -s "https://tu-tienda.com/modules/dfthincontent/cron.php?token=TU_TOKEN" > /dev/null 2>&1

Características del escaneo cron

  • set_time_limit(0) — sin límite de tiempo PHP.
  • memory_limit 512M — definido automáticamente.
  • Retorno JSON con el número de objetos analizados, el número de problemas detectados y la duración total.
  • Validación mediante hash_equals para resistir ataques de timing.
Regenerar el token. Si sospechas una fuga del token, desinstala y reinstala el módulo — se generará un nuevo token. También puedes modificar directamente el valor DFTHIN_CRON_TOKEN en la tabla ps_configuration.

Arquitectura técnica

Estructura de las tablas

  • ps_dfthincontent_issue — un registro por problema detectado. Clave única: (id_object, object_type, id_lang, id_shop, issue_type). Campos notables: severity (1-3), word_count, content_hash (SHA1), metric_value (% similitud o unicidad), metric_data (JSON con detalle), ai_suggestion, status, object_name, object_url.
  • ps_dfthincontent_scan — historial de escaneos. Fecha inicio / fin, duración, ítems analizados por tipo, estado.

Hooks utilizados

  • actionAdminControllerSetMedia — carga CSS / JS y expone la URL AJAX mediante Media::addJsDef.
  • actionProductUpdate — reescanea el producto modificado si el auto-rescan está activado.
  • actionObjectCategoryUpdateAfter — igual para categorías.
  • actionObjectCmsUpdateAfter — igual para páginas CMS.

Límites de rendimiento

La detección de duplicados es intrínsecamente O(n²) — cada página se compara con todas las demás páginas del mismo tipo / idioma / tienda. Para evitar una explosión en catálogos muy grandes, el módulo aplica dos protecciones:

  • Tope de seguridad a 1 500 elementos por grupo (tipo + idioma + tienda). Por encima, la detección de duplicados se desactiva para ese grupo — se registra una advertencia.
  • Pre-filtrado por número de palabras — la similitud Jaccard solo se calcula entre elementos cuyo número de palabras está dentro de una ventana del ±50 %. Esto elimina la gran mayoría de comparaciones inútiles.

Resolución de problemas

El escaneo no se inicia

  1. Abre la consola de red del navegador, haz clic en Lanzar escaneo completo, mira la petición AJAX hacia action=scanFull.
  2. Si la respuesta es HTML en lugar de JSON, es un fatal PHP del lado del servidor — revisa los logs de PrestaShop (var/logs/) y PHP.
  3. Si la respuesta es 404, verifica que el controlador AdminDfThinContent esté correctamente registrado (tabla ps_tab).
  4. Si la respuesta es 403, el token CSRF ha expirado — refresca la página e inténtalo de nuevo.

Las sugerencias IA devuelven un error

  • Verifica que la clave API es correcta y está activa en tu proveedor.
  • Verifica que el servidor puede alcanzar la URL del endpoint (firewall saliente, DNS).
  • Si usas Ollama en local, verifica que el servicio esté funcionando (ollama serve) y que el modelo esté descargado (ollama pull llama3.3).
  • Consulta los logs de PrestaShop — el módulo registra ahí los errores cURL y los códigos HTTP distintos de 200.

El cron devuelve 401 o 403

El token transmitido no coincide. Recupera el token correcto del panel de configuración y reemplázalo en tu crontab. Sin espacios, sin saltos de línea en el valor.

Se marcan duplicados legítimos

Es el caso típico de variantes muy cercanas (tallas del mismo modelo, colores). Tres opciones:

  • Marcar los problemas como ignorados uno por uno.
  • Subir el umbral de similitud Jaccard al 95 % o más.
  • Desactivar el escaneo de productos y mantener solo categorías + CMS si tu caso de uso no requiere escaneo de productos.

Desinstalación

Desinstala mediante Módulos > Gestor de módulos > Desinstalar. El módulo elimina limpiamente ambas tablas BDD, la pestaña de administración y todas las claves de configuración. Sin rastros residuales.

Haz una copia de seguridad del export CSV antes de desinstalar si quieres conservar el historial de sugerencias IA generadas. Una vez eliminadas las tablas, las sugerencias se pierden.

Recursos

¿Te ha resultado útil esta página?

¿Sigues atascado? Contacta con soporte