Exportar productos con imagen en Pestashop

Recientemente me he encontrado el problema de tener que exportar productos de una tienda Prestashop para importarlos en otra.

Es posible exportar los productos desde Catálogo -> Productos como vemos en la imagen:

 

ProductosPor desgracia, la información exportada es bastante pobre, aparte del hecho de no poder exportar todo el catálogo a la vez, también me he encontrado el problema de que no siempre exporta el campo de la imagen del producto. Esto es un grave inconveniente porque quiero importar un catálogo de 3000 productos, y tener que poner a mano las 3000 imágenes de productos puede resultar más que tedioso.

Después de buscar por internet, casi había llegado a la conclusión de que para exportar los productos con imágenes desde una tienda prestashop a otra iba a ser necesario el uso de algún módulo externo, y por supuesto, de pago.

Sin embargo, encontré dentro de los foros de prestashop una gran aproximación a nuestras necesidades.

En el área de administración de Prestashop tenemos la opción de crear nuestra propia consulta SQL para extraer la información que queramos.

consultaSQL_01

Seguiremos los pasos indicados:

1.- Clic en ‘Add New’

2.- Rellenar la consulta y guardarla

Y aquí está la diferencia entre lo que encontré en los foros de Prestashop y la solución verdadera.

En los foros indicaban que para extraer la imagen de cada producto debíamos utilizar el siguiente código SQL:

concat('http://',ifnull( conf.value,'siteaddress.ro'),'/img/p/',mid(p.id_product,1,1),'/',
    if(length(p.id_product)>1,concat(mid(p.id_product,2,1),'/'),''),
    if(length(p.id_product)>2,concat(mid(p.id_product,3,1),'/'),''),
    if(length(p.id_product)>3,concat(mid(p.id_product,4,1),'/'),''),
    if(length(p.id_product)>4,concat(mid(p.id_product,5,1),'/'),''), 
    p.id_product,'.jpg') AS url_image

Donde la URL de la imagen del producto estaría formado por el identificador del producto de la siguiente manera:

Por ej, disponemos de un producto con ID = 123

La URL del producto sería: [nuestro-dominio]/img/1/2/3/123.jpg

Sin embargo, tras probarlo, no funcionó.

Tras revisar las tablas de nuestra tienda Prestashop, pudimos ver que existe la tabla PS_IMAGE, donde tenemos la asociación de los productos con las imágenes…y aquí sí!! el identificador de la imagen sí es la ruta de la imagen.

Por ej, disponemos de un producto con ID = 123 y su imagen tiene el ID = 456

La URL del producto sería: [nuestro-dominio]/img/4/5/6/456.jpg

Por lo que de esta manera podemos asociar el producto con su imagen.

Aquí os dejo la consulta SQL que usamos para extraer la información de la tienda original

SELECT p.id_product AS 'ID',
pl.id_lang AS 'ID_LANG',
p.active AS 'Active (0/1)',
pl.name AS 'Name',
p.id_category_default AS 'Default Category',
p.price AS 'Price tax excl.',
p.id_tax_rules_group AS 'Tax rules ID',
p.wholesale_price AS 'Wholesale price',
p.on_sale AS 'On sale (0/1)',
p.reference AS 'Reference #',
p.quantity AS 'Quantity',
pl.description_short AS 'Short description',
pl.description AS 'Description',
pl.meta_title AS 'Meta-title',
pl.meta_keywords AS 'Meta-keywords',
pl.meta_description AS 'Meta-description',
pl.link_rewrite AS 'URL rewritten',
pl.available_now AS 'Text when in stock',
pl.available_later AS 'Text when backorder allowed',
p.available_for_order AS 'Available for order',
p.date_add AS 'Product creation date',
p.show_price AS 'Show price',
p.online_only AS 'Available online only',
p.condition AS 'Condition',
concat( 'http://[mi-dominio]/img/p/',mid(im.id_image,1,1),'/',
    if (length(im.id_image)>1,concat(mid(im.id_image,2,1),'/'),''),
    if (length(im.id_image)>2,concat(mid(im.id_image,3,1),'/'),''),
    if (length(im.id_image)>3,concat(mid(im.id_image,4,1),'/'),''),
    if (length(im.id_image)>4,concat(mid(im.id_image,5,1),'/'),''), 
    im.id_image, '.jpg' ) AS url_image
FROM ps_product p 
INNER JOIN ps_product_lang pl ON p.id_product = pl.id_product 
LEFT JOIN ps_image im ON p.id_product = im.id_product 
WHERE 1=1
and p.active = 1

Se pueden añadir campos que se necesiten y quitar los que no se vayan a usar, lo importante de esta sentencia SQL es la capacidad de poder exportar todos los productos de la tienda prestashop incluyendo las imágenes de los productos.

Espero que esto os haya ayudado 😉

Nota: esto ha sido probado en Prestashop 1.5.6

11 respuestas a «Exportar productos con imagen en Pestashop»

  1. Gracias por tu comentario 😉

    Qué tipo de características quieres añadir ?
    Sin conocerlo exactamente, lo que te puedo decir ques que habrá que buscar la información deseada en las tablas de prestashop.

    Un problema con el que te puede encontrar según la versión de prestashop es un límite de 1000 caracteres para la consulta SQL, (la 1.5.4 tiene ese problema).
    Si es así, habrá que hacer varias consultas con campos en común..,para poder asociarlas luego en un excel o algo similar.

  2. Gracias por tu respuesta
    Son las características del producto, que agrupan las tablas ps_feature, ps_feature_lang, ps_feature_product y ps_feature_value

    Un saludo

  3. La verdad que no me peleé con ese tema porque la tienda desde que importé no tenía, pero es interesante.

    Por lo que puedo ver, en feature_product tenemos el id del producto a relacionar junto con los identificadores de la característica que posee.

    Luego ese ID de característica lo tenemos en ps_feature_value, donde podemos ver el ID para poder coger la traducción en ps_feature_value_lang.

    No se si me explico, si tienes dudas me comentas.

    Saludos.

  4. Hola, antes de nada dar las gracias a RAUL por el gran aporte que esto supone, estuve unos días bicheando el esquema de ls BD de prestashop y es una locura!!

    he de decir, que he adaptado la consulta a mis necesidades, pero la base es válida, muy válida… sólo tienes que mirarte las relaciones y campos que necesites de más y agregarlos a esta consulta…

    Por ejemplo, necesitaba el nombre de la categoría, no sólo el id, y lo he sacado con un join más y listo. Os dejo la consulta por si a alguien le vale.

    PD: Mil gracias Raúl, el tema de las imágenes me traía loco! muy buen aporte! de 10!! Saludos 🙂
    ____________________

    SELECT p.id_product AS ‘ID’,
    pl.id_lang AS ‘ID_LANG’,
    pl.name AS ‘Name’,
    p.id_category_default AS ‘Default Category’,
    cl.name AS ‘Category´s Name’,
    p.price AS ‘Price tax excl.’,
    p.wholesale_price AS ‘Wholesale price’,
    p.reference AS ‘Reference #’,
    pl.description_short AS ‘Short description’,
    pl.description AS ‘Description’,
    pl.meta_title AS ‘Meta-title’,
    pl.meta_keywords AS ‘Meta-keywords’,
    pl.meta_description AS ‘Meta-description’,
    pl.link_rewrite AS ‘URL rewritten’,
    p.show_price AS ‘Show price’,
    concat( ‘http://localhost/mitienda/img/p/’,mid(im.id_image,1,1),’/’,
    if (length(im.id_image)>1,concat(mid(im.id_image,2,1),’/’),»),
    if (length(im.id_image)>2,concat(mid(im.id_image,3,1),’/’),»),
    if (length(im.id_image)>3,concat(mid(im.id_image,4,1),’/’),»),
    if (length(im.id_image)>4,concat(mid(im.id_image,5,1),’/’),»),
    im.id_image, ‘.jpg’ ) AS url_image
    FROM ps_product p INNER JOIN ps_category_lang cl ON p.id_category_default = cl.id_category
    INNER JOIN ps_product_lang pl ON p.id_product = pl.id_product
    LEFT JOIN ps_image im ON p.id_product = im.id_product
    WHERE 1=1 AND pl.id_lang = 3
    GROUP BY p.id_product

  5. Gracias por tu comentario y por tu actualización de la consulta, seguro que es de gran ayuda 😉

    Saludos.

  6. Hola,

    Primero agradecer la query que has hecho! No tengo ni idea de SQL, pero copiando esto me las apaño. Pero no sé como hacer para sacar la segunda y tercera imagen de un producto.

  7. Raúl importantisimo aporte, uno de esos que van directo a favoritos, y a la coleccion de mis «tipsPrestashop» , también agradecer a Alejandro por su adaptación.

    Muchas gracias!

  8. Hola!

    Llevo bastante tiempo con esta duda y has dado en el clavo para un prestashop 1.6.

    Super bien explicado y redactada la consulta,me apunto a tu blog!!

    La consulta Sql sale perfecta!

    Gracias!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *