Exportación de imágenes desde PrestaShop

Es común encontrarse con la necesidad de realizar una carga de los datos desde PrestaShop a Sales Layer. En esos casos es frecuente encontrarse con un problema común a propósito de una peculiaridad de PrestaShop, como es el sistema de nomenclatura de las imágenes. Así, cuando se sube una imagen a PrestaShop, este la almacena mediante un sistema de identificación por carpetas y utilizando un nombre único por imagen.

Por ejemplo:

Para productos:

http://dominio/img/p/1/2/3/4/1234.jpg

http://dominio/img/p/1/2/3/5/1235.jpg

Para categorías:

http://dominio/img/c/1/2/3/4/1234.jpg

http://dominio/img/c/1/2/3/5/1235.jpg

Entre tanto, cuando accedes a las mismas imágenes en la tienda, PrestaShop sustituye el identificador de la imagen por el nombre del producto / categoría de este modo:

http://dominio/1234-prod_default/producto.jpg

http://dominio/1235-prod_default/producto.jpg

Es por este motivo que, cuando se exporta de PrestaShop, la URL de la imagen se extrae siguiendo el segundo caso. El problema es que cuando se importa en Sales Layer, como el nombre de la imagen no puede estar duplicado, solo sube una de las repetidas.

Para solucionarlo, hay que acudir al administrador de PrestaShop, menú: 

Configurar > Parámetros Avanzados > Base de datos > Añadir nueva consulta SQL:

prestashop export images

Ahí tendremos que insertar una consulta para generar la exportación a formato CSV, que después podemos cargar en Sales Layer (siguiendo los pasos habituales de carga de CSV en Sales Layer). Como ejemplo de la consulta, utilizando un dominio falso de ejemplo (“yourdomain”) tendríamos:

SELECT aux.reference, Group_concat(aux.img SEPARATOR ' ,') AS imagenes
FROM   (SELECT p.id_product, p.reference, CASE 
			WHEN Length(im.`id_image`) = 6 THEN
              Concat('https://yourdomain.com', '/img/p/', INSERT(INSERT(INSERT(INSERT(INSERT(im.`id_image`, 2, 0, '/'), 4, 0, '/'), 6, 0, '/'), 8, 0, '/'), 10, 0, '/'), '/', im.`id_image`, '.jpg')

			WHEN Length(im.`id_image`) = 5 THEN
			  Concat('https://yourdomain.com','/img/p/', INSERT(INSERT(INSERT(INSERT(im.`id_image`, 2, 0, '/'), 4, 0, '/'), 6, 0, '/'), 8, 0, '/'), '/', im.`id_image`, '.jpg')
                  
			WHEN Length(im.`id_image`) = 4 THEN 
              Concat(   'https://yourdomain.com', '/img/p/',INSERT(INSERT(INSERT(im.`id_image`, 2, 0, '/'), 4, 0, '/'), 6, 0, '/'), '/', im.`id_image`, '.jpg')

			WHEN Length(im.`id_image`) = 3 THEN 
              Concat('https://yourdomain.com', '/img/p/', INSERT(INSERT(im.`id_image`, 2, 0, '/'), 4, 0, '/'), '/', im.`id_image`, '.jpg')

		    WHEN Length(im.`id_image`) = 2 THEN 
              Concat('https://yourdomain.com', '/img/p/',INSERT(im.`id_image`, 2, 0, '/'), '/', im.`id_image`, '.jpg')

			WHEN Length(im.`id_image`) = 1 THEN 
              Concat('https://yourdomain.com', '/img/p/',INSERT(im.`id_image`, 2, 0, '/'), im.`id_image`, '.jpg')
			
            ELSE ''

            END AS 'img', im.cover 
            
		FROM   ps_product p
		    LEFT JOIN ps_image im ON ( im.id_product = p.id_product )
			ORDER  BY cover DESC) AS aux
		GROUP  BY id_product;

Hay dos detalles a tener en cuenta sobre esta sentencia:

  • se debe adaptar el dominio en todos los concat de la misma, con la URL base.
  • hay que incluir la ordenación por el campo cover en PrestaShop (tal y como se muestra en el ejemplo).