PS PrestaShop Principiante

Documentación del módulo Sitemap XML avanzado para PrestaShop (dfsitemap)

Instalar y configurar dfsitemap: contenidos, imágenes y vídeos, hreflang, reglas de exclusión, generación por lotes, cron, IndexNow y multitienda.

Actualizado Versión del módulo 1.1.0

El módulo Advanced XML Sitemap (dfsitemap) genera los sitemaps XML de PrestaShop 8 y 9: un índice por tienda, un archivo por idioma y por tipo de contenido, con imágenes, vídeos y etiquetas hreflang. Esta página cubre la instalación, los ajustes, las reglas de exclusión, la programación y la resolución de problemas.

Instalación

  1. Descargue el ZIP desde su cuenta de cliente DataFirefly.
  2. En el back office, vaya a Módulos > Gestor de módulos > Subir un módulo y envíe el ZIP.
  3. Abra Parámetros de la tienda > Tráfico y SEO > Sitemap XML avanzado. Tres pestañas en la parte superior dan acceso a los sitemaps y ajustes, a las reglas de exclusión y a los vídeos de producto.
  4. Si el módulo nativo Google sitemap (gsitemap) está activo, desactívelo y borre sus archivos *_sitemap.xml en la raíz de la tienda. El módulo muestra un aviso mientras gsitemap esté activo.
  5. Haga clic en Generar ahora y después en Declarar los sitemaps en robots.txt.
  6. Envíe la URL de índice que se muestra en Google Search Console y Bing Webmaster Tools.

El módulo funciona de PrestaShop 8.0 a 9.x con el mismo ZIP, en multitienda y multilingüe. Necesita escribir en la carpeta raíz de la tienda, donde se publican los archivos dfsitemap-*.xml, y en modules/dfsitemap/var/tmp/. Aparece una alerta si alguna de las dos no tiene permisos de escritura.

Los archivos generados

Para cada tienda, el módulo publica un índice dfsitemap-{id tienda}-index.xml que apunta a archivos nombrados por idioma y tipo, por ejemplo dfsitemap-1-es-product-1.xml. Cuando un archivo alcanza el número de URL fijado, o antes de 45 MB, el resto pasa a -2, -3, etc. Las URL personalizadas sin idioma se agrupan en dfsitemap-1-all-custom-1.xml.

Si las URL amigables están activadas, el índice se sirve también en /sitemap.xml en el dominio de cada tienda. Un archivo físico sitemap.xml en la raíz tiene prioridad sobre esa dirección: el módulo lo indica.

Los archivos se construyen en una carpeta temporal y se publican tienda por tienda. Los sitemaps anteriores siguen en línea durante la generación, y los archivos que ya no sirven se borran al publicar.

Ajustes

Los ajustes siguen el contexto multitienda: en el contexto de una tienda, los valores guardados solo afectan a esa tienda.

Contenido

  • Tipos de contenido: páginas estáticas, productos, categorías, páginas CMS, categorías CMS, marcas, proveedores, URL personalizadas. Solo se lista el contenido activo.
  • Páginas estáticas: inicio, más vendidos, novedades, ofertas, listas de marcas y proveedores, tiendas, contacto, mapa del sitio. Las listas de marcas y proveedores se omiten si su página está desactivada en las preferencias de la tienda.
  • Idiomas: deje todo marcado para seguir automáticamente los idiomas activos de cada tienda.
  • Productos visibles solo en la búsqueda: por defecto solo se listan los productos con visibilidad En todas partes o Solo catálogo.
  • URL personalizadas: una por línea. Una ruta relativa como /blog/ se añade a la URL de la tienda.
  • Sitemaps adicionales: URL absolutas de sitemaps generados en otro lugar, por ejemplo por un módulo de blog o un WordPress en el mismo dominio. Se añaden al índice de la tienda.

Una página CMS con la opción Indexación por los buscadores desactivada la sirve PrestaShop con una etiqueta noindex. El módulo no la lista y muestra cuántas páginas están afectadas. Active la opción en las páginas que deban indexarse.

Imágenes y vídeos

  • Sitemap de imágenes y todas las imágenes del producto (si no, solo la portada), en el tamaño de imagen elegido, large_default por defecto.
  • Imágenes de categorías, marcas y proveedores: la imagen original de cada entidad, si existe.
  • Sitemap de vídeos y detección de YouTube y Vimeo: el módulo localiza los vídeos integrados en las descripciones de producto y las páginas CMS. Los títulos y duraciones de Vimeo se leen una vez y se guardan en caché.

Hreflang

  • Alternativas hreflang: cada URL lista sus traducciones. Útil en cuanto la tienda tiene varios idiomas.
  • Código hreflang: idioma y región (es-ES, tomado del código de idioma definido en Internacional > Idiomas) o solo idioma (es).
  • Idioma x-default: idioma predeterminado de la tienda, un idioma concreto o ninguno.

Etiquetas y visualización

  • lastmod: fecha de última modificación de productos, categorías, categorías CMS, marcas y proveedores.
  • changefreq y priority: desactivadas por defecto, Google las ignora.
  • Visualización legible: una hoja de estilo XSL muestra el índice y los archivos como una tabla en el navegador. Los buscadores la ignoran.

Generación

  • Frecuencia: de cada hora a una vez por semana, la usa el cron.
  • Regenerar cuando cambia el contenido: cuando se guarda un producto, una categoría, una página CMS, una marca o un proveedor, la siguiente llamada cron regenera sin esperar a la frecuencia, como máximo una vez por hora.
  • URL por archivo: 10 000 por defecto, entre 100 y 50 000.
  • Elementos por lote: 50 por defecto. Redúzcalo en un servidor lento.
  • Tiempo máximo por petición: 20 segundos por defecto, por debajo del max_execution_time del servidor. Desde el back office, cada petición está limitada a 15 segundos.

Reglas de exclusión

La pestaña Reglas de exclusión lista las reglas activas. Cada regla se aplica a todas las tiendas o a una sola, y surte efecto en la siguiente generación.

  • Productos: por ID, en una categoría (cualquier asociación, subcategorías incluidas), de una marca, de un proveedor predeterminado, sin stock, con precio cero, sin imagen.
  • Categorías: por ID, o una categoría y todas sus subcategorías. Los productos siguen listados salvo que una regla de producto los retire.
  • Páginas CMS: por ID, o una categoría CMS con sus páginas.
  • Marcas y proveedores: por ID.
  • URL contiene un texto: un texto por línea, sin distinguir mayúsculas, por ejemplo ?q=.
  • URL coincide con una expresión regular: una expresión por línea, sin delimitadores, sin distinguir mayúsculas, por ejemplo /es/.*-test$. Una expresión no válida se rechaza al guardar.

Los ID se introducen separados por comas o saltos de línea. Una URL excluida por una regla desaparece también de las alternativas hreflang de sus traducciones.

Vídeos de producto

La pestaña Vídeos de producto sirve para los vídeos alojados fuera de YouTube y Vimeo, o cuando quiere un título y una descripción concretos. Para cada vídeo: el producto (búsqueda por nombre, referencia o ID), el título y la descripción por idioma, la URL de la miniatura, la URL del archivo de vídeo o la del reproductor, la duración en segundos y la tienda afectada. Un título vacío en un idioma toma el de otro idioma y, si no, el nombre del producto.

Lanzar la generación

Desde el back office

Generar ahora lanza la generación para las tiendas del contexto actual, con una barra de progreso. La página encadena las peticiones hasta el final. Si cierra la página, la tarea queda guardada: el botón Reanudar en esta ventana la continúa, o se encarga el cron. Cancelar detiene la tarea y los sitemaps en línea no cambian.

Con el cron

El panel muestra una URL del tipo https://su-tienda.es/module/dfsitemap/cron?token=.... Llámela cada 5 minutos desde el gestor cron de su alojamiento o el módulo de tareas cron de PrestaShop. Cada llamada trabaja durante el tiempo máximo y la siguiente reanuda la tarea. Una tienda se regenera cuando se alcanza su frecuencia, o tras un cambio de contenido si la opción está activada. Parámetros opcionales: force=1 para regenerar de inmediato, id_shop=1,2 para limitar las tiendas. El botón Generar un nuevo token invalida la URL anterior.

Por línea de comandos

Con acceso SSH, el script hace toda la tarea de una vez, sea cual sea el tamaño del catálogo:

php /ruta/a/prestashop/modules/dfsitemap/cron.php
php /ruta/a/prestashop/modules/dfsitemap/cron.php --force --shop=1

Sin --force, solo se regeneran las tiendas que han vencido. El script devuelve el código de salida 1 en caso de error.

Si el servidor corta una petición durante la generación, la tarea se reanuda desde la última posición guardada y los archivos en curso se reparan. El bloqueo que deja la petición cortada caduca tras el tiempo máximo más 90 segundos: el back office muestra el tiempo restante.

IndexNow

IndexNow anuncia una página creada o modificada a Bing, Yandex, Seznam, Naver y los demás buscadores del protocolo, sin esperar a su próxima visita. Google no usa IndexNow y sigue leyendo el sitemap.

  1. Active Enviar las páginas modificadas con IndexNow en el bloque Indexación instantánea. El módulo escribe un archivo de clave en la raíz de la tienda.
  2. Cada vez que se guarda un producto, una categoría, una página CMS, una marca o un proveedor, el objeto entra en la cola.
  3. En la siguiente llamada cron, el módulo calcula las URL de ese contenido en todos los idiomas y las envía dominio por dominio. Solo se envía el contenido listado en el sitemap: un producto inactivo o excluido por una regla no se envía.

El bloque IndexNow del panel muestra la cola, la presencia del archivo de clave y el último envío con su código HTTP (200 o 202 si todo va bien). Ante una respuesta 429 o 5xx, la cola se conserva para la siguiente llamada. El botón Enviar ahora lanza un envío inmediato.

robots.txt y Search Console

El botón Declarar los sitemaps en robots.txt añade una línea Sitemap: por tienda entre los marcadores # BEGIN dfsitemap y # END dfsitemap. Cuando PrestaShop regenera robots.txt desde Tráfico y SEO, el módulo vuelve a escribir el bloque. La desinstalación lo retira.

En Google Search Console, envíe la URL de índice de cada tienda (o /sitemap.xml) en la propiedad del dominio correspondiente.

Multitienda

Cada tienda tiene su índice en su propio dominio, sus idiomas y sus ajustes. Seleccione una tienda en el menú multitienda para darle valores propios; en el contexto Todas las tiendas, los valores se aplican a las tiendas sin valor específico. Para cada tienda del contexto, el panel muestra la URL de índice, la fecha de la última generación y el número de URL por tipo, de imágenes, de vídeos y de archivos.

Para desarrolladores: añadir URL

Un módulo puede añadir sus páginas al sitemap enganchándose al hook actionDfSitemapUrls, que se llama durante el tratamiento del tipo URL personalizadas. El hook recibe id_shop, languages (id_lang => código ISO) y link, y devuelve una lista de entradas:

public function hookActionDfSitemapUrls($params)
{
    $loc = [];
    foreach ($params['languages'] as $idLang => $iso) {
        $loc[$idLang] = $params['link']->getBaseLink($params['id_shop']) . $iso . '/blog/mi-articulo';
    }

    return [
        ['loc' => $loc, 'lastmod' => '2026-09-01 10:00:00', 'images' => ['https://.../imagen.jpg']],
        ['loc' => 'https://su-tienda.es/pagina-unica'],
    ];
}

Una entrada cuyo loc está indexado por idioma recibe las etiquetas hreflang como una página nativa. Las entradas no válidas se ignoran sin detener la generación.

Preguntas frecuentes

El sitemap no contiene ninguna página CMS

Compruebe la opción Indexación por los buscadores de cada página CMS. Una página sin ella está en noindex y no se lista.

No aparecen las marcas o los proveedores

El módulo sigue las preferencias de la tienda: si la página de marcas o de proveedores está desactivada, ese tipo se omite.

La generación se queda en «Otro proceso está trabajando en la tarea»

Otra petición tiene el bloqueo, a menudo el cron. Si esa petición se cortó, el bloqueo caduca tras el tiempo indicado y la generación se reanuda sola.

La generación se detiene con un error

El mensaje aparece arriba del panel y en Parámetros avanzados > Registros. La causa más frecuente es una carpeta raíz sin permisos de escritura. Los sitemaps anteriores siguen en línea.

IndexNow devuelve 403 o 422

El buscador no encuentra el archivo de clave o rechaza el host. Abra la URL del archivo de clave que aparece en el bloque IndexNow: debe mostrar la clave. Compruebe también que el dominio de la tienda coincide con el de las URL enviadas.

¿Te ha resultado útil esta página?

¿Sigues atascado? Contacta con soporte