PS PrestaShop Intermedio

Importación de Feeds de Proveedores & Dropshipping para PrestaShop 8 y 9

Instalar, configurar y automatizar la importación multiproveedor (CSV, XML, JSON), los márgenes, las combinaciones y la sincronización del stock.

Actualizado Versión del módulo 1.4.0

Presentación

El módulo Importación de Feeds de Proveedores y Dropshipping (nombre técnico dfsupplierfeed) importa y sincroniza automáticamente los catálogos de tus proveedores en PrestaShop 8 y 9. Gestiona varios proveedores y feeds en CSV, XML y JSON, aplica tus reglas de margen, construye las combinaciones, relaciona los productos entre sí, sincroniza el stock por cron y arbitra los EAN13 duplicados con una prioridad por proveedor.

El módulo no sustituye la importación CSV nativa de PrestaShop: industrializa importaciones recurrentes desde varias fuentes, con márgenes, combinaciones y sincronización automáticos.

Instalación

  1. En el back office, ve a Módulos > Gestor de módulos y luego Subir un módulo.
  2. Selecciona el archivo dfsupplierfeed.zip y confirma.
  3. Una vez instalado, haz clic en Configurar.

Al instalarse, el módulo crea cinco tablas (dfsf_supplier, dfsf_feed, dfsf_rule, dfsf_product, dfsf_log) y genera un token de cron único.

Visión general de la interfaz

  • Dashboard — contadores y aviso sobre los feeds cuya importación está en curso.
  • Suppliers — proveedores y prioridades.
  • Feeds — feeds, análisis, mapeo de campos y opciones.
  • Margin rules — reglas de cálculo de los precios de venta.
  • Logs — historial detallado de importaciones.
  • Settings & Cron — ajustes generales, catálogos grandes, URLs de cron.

Paso 1 — Crear tus proveedores

En la pestaña Suppliers, añade un proveedor con su nombre, su prioridad (entero, 1 es la más alta, resuelve los EAN13 duplicados), su estado activo, y la opción Crear el proveedor nativo de PrestaShop, recomendada porque rellena también el coste de compra en product_supplier.

Asigna las mejores prioridades (números más bajos) a tus proveedores más fiables o más baratos: serán los que «posean» los productos compartidos.

Paso 2 — Crear el feed y dejar que el módulo lo analice

En la pestaña Feeds, crea el feed con su proveedor, su tipo de origen (URL remota o archivo local dentro del directorio de la tienda) y su formato. Guarda y haz clic en el botón lupa de la fila del feed.

El módulo descarga una muestra y muestra el items_path detectado para los feeds XML y JSON, la lista de todos los campos realmente presentes con valores de ejemplo, y un mapeo completo prerrellenado editable antes de aplicarlo.

Las columnas de fotos numeradas (image_1, image_2…) se agrupan automáticamente, las columnas de tallas empaquetadas, de color y de referencias relacionadas se reconocen, y los nombres de columna se identifican en español, inglés, francés, alemán e italiano.

Comprueba siempre la propuesta antes de aplicarla. Muchos proveedores envían un precio de venta recomendado donde el módulo espera un coste de compra: tu margen se aplicaría sobre un precio ya marginado.

Paso 3 — El mapeo de campos

El mapeo es un objeto JSON que relaciona las columnas o nodos del feed con campos normalizados. Los 21 campos canónicos son:

name reference ean13 mpn cost quantity description description_short category manufacturer weight tax_rate image images group_reference attributes variants_stock variants_ean variants_reference variant_attribute related

Solo reference o ean13 es obligatorio: son las dos claves de correspondencia.

Varias fuentes para un mismo campo

El valor de un campo puede ser una lista. Un proveedor que reparte sus fotos en varias columnas se mapea así:

{
  "fields": {
    "reference": "id",
    "name": "name",
    "cost": "wholesale_price",
    "images": ["image_1", "image_2", "image_3", "image_4"]
  }
}

Para el campo images se importan todas las columnas rellenadas. Para cualquier otro campo se conserva el primer valor no vacío, lo que permite escribir una cadena de reserva: "cost": ["precio_oferta", "precio_neto"].

CSV

Relaciona cada campo con una cabecera de columna o con un índice de columna desde 0. El delimitador se detecta automáticamente, los campos multilínea entrecomillados se gestionan y se aceptan tanto 1 234,56 como 1,234.75.

{
  "fields": {
    "name": "product_name",
    "reference": "sku",
    "ean13": "ean",
    "cost": "price",
    "quantity": "stock",
    "category": "category",
    "image": "image_url"
  }
}

Una fila cuyo número de columnas no coincide con la cabecera se rechaza y se cuenta como error. Sin este control, todos los valores siguientes se desplazarían e importarían en silencio.

XML

items_path apunta al nodo repetido, a cualquier profundidad. Las rutas de los campos son relativas a ese nodo y @nombre lee un atributo.

{
  "items_path": "products/product",
  "fields": {
    "reference": "@sku",
    "name": "title",
    "ean13": "ean",
    "cost": "pricing/wholesale",
    "quantity": "stock/quantity",
    "image": "images/image"
  }
}

Al ser las rutas relativas al artículo, un valor presente solo en un nodo antecesor no puede leerse: no existe la navegación ...

JSON

items_path usa notación con puntos hasta el array de artículos. Un segmento numérico lee una entrada: images.0 es la primera imagen. Deja items_path vacío si el archivo empieza por [.

{
  "items_path": "data.products",
  "fields": {
    "reference": "sku",
    "name": "name",
    "ean13": "barcode",
    "cost": "prices.cost",
    "quantity": "inventory.available",
    "image": "images.0"
  }
}

La pestaña Feeds contiene dieciséis ejemplos comentados.

Paso 4 — Definir tus márgenes

En la pestaña Margin rules, cada regla calcula el precio de venta sin IVA a partir del coste de compra sin IVA: porcentaje (coste × (1 + valor/100)), coeficiente (coste × valor) o adición fija (coste + valor). Después se aplica un redondeo psicológico opcional.

Alcance y resolución

Una regla puede apuntar a un proveedor, una categoría, ambos o ser global. Gana la más específica, en este orden: proveedor + categoría, solo proveedor, solo categoría, regla global. Las reglas de categoría se aplican también a las subcategorías. Sin ninguna regla se usa el margen por defecto.

La prioridad EAN entre fuentes

Cuando el mismo ean13 aparece en varios feeds, el proveedor con mejor prioridad posee el producto, las demás fuentes se ignoran para esa referencia, y si un proveedor con mejor prioridad aporta después ese EAN, toma automáticamente la propiedad.

Las combinaciones

Se gestionan dos estructuras de feed.

Una línea por variante

Activa Construir las combinaciones y mapea group_reference (idéntico para todas las variantes de un producto) y attributes (las opciones, por ejemplo Talla:M|Color:Rojo). Se aceptan |, , y ; entre pares, y : o = entre nombre y valor.

Una línea por producto, tallas empaquetadas en una columna

Es la estructura más extendida entre los mayoristas textiles y de lencería:

sizes_stock : EU 70C | FR 85C:4,EU 70D | FR 85D:2,EU 75A | FR 90A:1
ean_codes   : EU 70C | FR 85C:5901741925360,EU 70D | FR 85D:5901741925377

Activa Dividir las variantes empaquetadas y mapea variants_stock, más variants_ean y variants_reference si el feed los proporciona. El módulo divide la línea en una combinación por talla y empareja stock, EAN y referencia por etiqueta. Tres ajustes acompañan la casilla: el nombre del grupo de atributos (Taille por defecto), el separador entre entradas (,) y el separador entre etiqueta y valor (:).

La división etiqueta/valor se hace en la última aparición del separador, de modo que una etiqueta como EU 70C | FR 85C sigue siendo legible.

Marca la casilla antes de la primera importación. Si importas primero sin ella, los productos se crean sin group_reference: al activar después la división, el módulo no encuentra esos padres y crea otros nuevos, duplicando tu catálogo. Si ocurre, elimina los productos creados y vacía los cursores desde el panel de mantenimiento.

Un segundo eje desde una columna del feed

Muchos proveedores envían el color en una columna aparte mientras las tallas están empaquetadas. Relaciona variant_attribute con esa columna:

{
  "fields": {
    "reference": "id",
    "name": "name",
    "cost": "wholesale_price",
    "variant_attribute": "color",
    "variants_stock": "sizes_stock",
    "variants_ean": "ean_codes"
  }
}

Cada combinación del producto gana entonces un segundo eje, bajo el grupo de atributos de la columna adicional definido en el feed (Couleur por defecto). Obtienes combinaciones de Talla y Color, utilizables por los filtros por facetas.

Como cada línea del feed es un producto de un solo color, el grupo Color solo tiene un valor por producto. Los colores no se fusionan en una ficha única con selector: para navegar entre ellos, usa los productos relacionados.

Productos relacionados

Cuando el feed lista los otros colores o los modelos asociados en una columna de referencias, marca Importar los productos relacionados y mapea related:

{
  "fields": {
    "reference": "id",
    "related": "other_colors"
  }
}

La columna contiene una lista de referencias de proveedor separadas por comas. Los enlaces se crean como accesorios de PrestaShop, y aparecen en el bloque de productos relacionados de tu tema.

La resolución tiene lugar una vez leído todo el feed, porque una referencia apunta muy a menudo a un producto situado más adelante en el archivo. Tres comportamientos a conocer:

  • una referencia que apunta al propio producto se ignora, algo frecuente ya que muchos proveedores listan el grupo completo en cada miembro;
  • una referencia que apunta a un producto ausente del feed se ignora sin contar como error: en una exportación filtrada por categoría, esto supone habitualmente una quinta parte de las referencias;
  • los accesorios existentes nunca se eliminan, así que los enlaces añadidos a mano sobreviven. A cambio, un agrupamiento modificado por el proveedor deja enlaces antiguos en su sitio.

El número de enlaces creados aparece en el mensaje de fin de importación y en la columna dedicada del registro.

Lo que el feed puede sobrescribir

Cinco casillas por feed deciden qué campos se sincronizan: precios, stock, nombre, descripciones, imágenes. Por defecto solo precios y stock están marcados.

Si reescribes las fichas para el posicionamiento, desmarca nombre y descripciones tras la primera importación.

Productos retirados del catálogo del proveedor

Cada feed elige su comportamiento: no hacer nada, poner el stock a cero, desactivarlos o ambas cosas. La acción se aplica al final de una importación completa terminada y solo a los productos de ese feed.

En dropshipping, poner el stock a cero es lo más seguro: el producto deja de venderse pero conserva su URL y su posicionamiento.

Categorías y divisas

El campo category acepta un nombre simple o una ruta completa, por ejemplo Inicio > Oficina > Sillas. El separador es configurable por feed y la opción Crear las categorías que faltan crea los niveles ausentes. Una ruta que empieza por el separador se interpreta correctamente.

Si el proveedor factura en otra divisa, selecciónala en el feed: los costes se convierten a la divisa por defecto de la tienda.

Catálogos grandes

Los feeds se leen en streaming: la memoria usada no depende del tamaño del archivo. El procesamiento se divide en lotes reanudables. Dos ajustes, en la pestaña Settings & Cron: punto de control cada N artículos (2000 por defecto) y presupuesto de tiempo por pasada (120 s por defecto).

La división multiplica el volumen: un feed de 7.300 productos con variantes produce más de 33.000 combinaciones, unos 41.000 objetos en la primera importación completa. Prevé varias pasadas y prueba en una tienda de pruebas.

Lanzar una importación manualmente

  • Importación completa (icono play) — actualiza los productos vinculados y crea los que faltan si el feed lo permite.
  • Sync stock (icono refrescar) — actualiza solo precios y cantidades de los productos ya vinculados.

Desde el back office una pasada se limita a 45 segundos para no agotar el tiempo del servidor web.

Automatizar con el cron

# Sync stock cada hora
0 * * * * curl -sL "https://tutienda.tld/index.php?fc=module&module=dfsupplierfeed&controller=cron&token=TU_TOKEN&mode=stock" > /dev/null

# Importación completa cada noche
30 3 * * * curl -sL "https://tutienda.tld/index.php?fc=module&module=dfsupplierfeed&controller=cron&token=TU_TOKEN&mode=full" > /dev/null

Parámetros opcionales: &id_feed=N y &budget=600.

Si regeneras el token, actualiza tus tareas cron: la URL antigua devolverá un error 403.

Ajustes generales

  • Productos creados activos de inmediato — desactivado por defecto.
  • Desactivar los productos sin stock en el proveedor, con reactivación al volver el stock.
  • Margen por defecto cuando ninguna regla coincide.
  • Retención de registros y purga automática.
  • Al desinstalar — eliminar los datos o conservarlo todo.
  • Vaciar la caché de feeds y los cursores en el panel de mantenimiento.

Seguimiento y registros

La pestaña Logs lista cada ejecución: feed, modo, artículos procesados, creados, actualizados, omitidos, con error, desaparecidos, enlaces de productos creados, indicador de finalización con el punto de reanudación, tiempo y detalle de los primeros errores.

Resolución de problemas

«Malformed CSV row: 23 columns instead of 22»

La fila contiene un separador o una comilla sin escapar dentro de un campo de texto. Se rechaza para no importar valores desplazados.

«Feed file not found or outside shop directory»

Para un origen de archivo, la ruta debe apuntar a un archivo legible dentro del directorio de la tienda.

El análisis no encuentra artículos

Indica items_path manualmente en el mapeo y vuelve a lanzar el análisis.

Los productos se crean pero no se ven en el front

Es el comportamiento por defecto: los productos creados están desactivados.

Las combinaciones no se crean

Comprueba que la casilla correspondiente está marcada, que los campos necesarios están mapeados y que los separadores coinciden con el archivo.

Mi catálogo se ha duplicado tras activar la división

La importación se lanzó antes de marcar la casilla. Elimina los productos creados por ese feed, vacía los cursores y vuelve a lanzar.

Pocos o ningún enlace de productos relacionados

Los enlaces solo se resuelven al final de una importación completa terminada: en un feed grande procesado en varias pasadas, aparecen en la última. Comprueba también que las referencias de la columna corresponden al campo mapeado en reference.

Los precios parecen demasiado altos o bajos

Comprueba los costes con IVA, la divisa, qué regla de margen se aplica y que el campo mapeado en cost sea un coste de compra.

La importación nunca termina

Es normal en un feed muy grande: avanza por pasadas.

Compatibilidad

  • PrestaShop 8.0 a 9.x, PHP 7.4 a 8.3.
  • Sin sobrescritura del núcleo de PrestaShop.
  • Multitienda: los productos creados se asocian a las tiendas del contexto.
  • Interfaz traducida al inglés y al francés.
¿Te ha resultado útil esta página?

¿Sigues atascado? Contacta con soporte