Introduccion

En PrestaShop, los productos se gestionan a través de una estructura de base de datos más compleja y modularizada en comparación con otras plataformas como WooCommerce. Esto permite mayor flexibilidad, pero también requiere precisión al realizar cambios directamente en la base de datos. Si tienes productos duplicados, pueden surgir problemas como datos redundantes, confusión para los clientes y dificultades en la gestión del inventario.

Nota: Las imágenes aquí mostradas hacen referencia a una DB de Wrodpress

Precaución: Realiza una copia de seguridad

Antes de realizar cambios en la base de datos, asegúrate de tener una copia de seguridad completa. Esto es fundamental en caso de que algo salga mal. Puedes hacer esto desde el panel de control de tu hosting o usando herramientas como phpMyAdmin.

Accediendo a phpMyAdmin

    1. Accede a phpMyAdmin desde el panel de control de tu hosting (cPanel, Plesk u otro).
    2. Selecciona tu base de datos: En el panel izquierdo, elige la base de datos correspondiente a tu instalación de PrestaShop.
    3. Abre el editor SQL: Haz clic en la pestaña SQL para escribir y ejecutar las consultas.

Estructura relevante de la base de datos en PrestaShop

Antes de comenzar, es importante entender las tablas principales que utilizaremos:

  1. ps_product: Contiene la información básica de los productos (ID, referencia, precios, etc.).
  2. ps_product_lang: Almacena los nombres, descripciones y otros textos relacionados con los productos, organizados por idioma.
  3. ps_stock_available: Gestiona el inventario de los productos.
  4. Tablas adicionales:
    • ps_category_product: Relaciona productos con categorías.
    • ps_product_attribute y ps_product_attribute_combination: Gestionan las combinaciones o variaciones de productos.

Identificar y Eliminar Duplicados por Nombre

Paso 1: Identificar productos duplicados por nombre

Usa esta consulta para encontrar productos que comparten el mismo nombre:

NOTA: ps_ es el prefijo de tu tabla, si es personalizada como hacemos en ELIGEUNAWEB reemplaza ps_ por como se llame la tuya.

SELECT pl.name, COUNT(*) AS count
FROM ps_product_lang pl
INNER JOIN ps_product p ON pl.id_product = p.id_product
WHERE pl.id_lang = 1 -- Cambia el ID del idioma si es necesario
GROUP BY pl.name
HAVING count > 1;

En la imagen de arriba se resalta el prefijo de la tabla. Tienes que poner el título de la tuya. Cuando empieces a escribir te saldrá un globo con las tablas de tu base de datos y ahí la podrás seleccionar.

Cerciora que no se mezcle con el script que te añado.

Explicación de la consulta:

  • ps_product_lang: Contiene los nombres y descripciones de los productos en cada idioma.
  • pl.id_lang = 1: Filtra los productos en el idioma principal (normalmente el predeterminado).
  • GROUP BY pl.name: Agrupa los productos por nombre.
  • HAVING count > 1: Muestra solo los nombres que se repiten.

Paso 2: Eliminar duplicados manteniendo uno

Esta consulta elimina los productos duplicados, dejando solo uno por nombre:

DELETE p1, pl1, sa1
FROM ps_product p1
LEFT JOIN ps_product_lang pl1 ON p1.id_product = pl1.id_product
LEFT JOIN ps_stock_available sa1 ON p1.id_product = sa1.id_product
WHERE p1.id_product > (
  SELECT MIN(p2.id_product)
  FROM ps_product p2
  INNER JOIN ps_product_lang pl2 ON p2.id_product = pl2.id_product
  WHERE pl1.name = pl2.name
);

Explicación de la consulta:

  • ps_product: Elimina el registro principal del producto.
  • ps_product_lang: Limpia los nombres y descripciones en todos los idiomas.
  • ps_stock_available: Borra las entradas de inventario asociadas.
  • WHERE p1.id_product > (…): Mantiene el producto con el ID más bajo (se considera el original).

Identificar y Eliminar Duplicados por Referencia (SKU)

Paso 1: Identificar duplicados por referencia

Usa esta consulta para encontrar referencias duplicadas:

SELECT p.reference, COUNT(*) AS count
FROM ps_product p
WHERE p.reference IS NOT NULL AND p.reference != ''
GROUP BY p.reference
HAVING count > 1;


Explicación de la consulta:

  • p.reference: Contiene la referencia (SKU) del producto.
  • p.reference IS NOT NULL AND p.reference != »: Asegura que solo se consideren referencias válidas.
  • GROUP BY p.reference: Agrupa los productos por referencia.
  • HAVING count > 1: Muestra las referencias duplicadas.

Paso 2: Eliminar duplicados manteniendo uno

Elimina los duplicados basándote en la referencia:

DELETE p1, pl1, sa1
FROM ps_product p1
LEFT JOIN ps_product_lang pl1 ON p1.id_product = pl1.id_product
LEFT JOIN ps_stock_available sa1 ON p1.id_product = sa1.id_product
WHERE p1.id_product > (
  SELECT MIN(p2.id_product)
  FROM ps_product p2
  WHERE p1.reference = p2.reference
);


Explicación de la consulta:

  • Similar a la consulta anterior, pero basada en la referencia.
  • WHERE p1.reference = p2.reference: Asegura que los productos comparados tienen el mismo SKU.

Limpiar Metadatos Huérfanos

Después de eliminar productos duplicados, pueden quedar registros huérfanos en tablas relacionadas. Usa esta consulta para limpiarlos:

DELETE pl
FROM ps_product_lang pl
LEFT JOIN ps_product p ON pl.id_product = p.id_product
WHERE p.id_product IS NULL;


Explicación:

  • LEFT JOIN: Busca registros en ps_product_lang sin un producto asociado en ps_product.
  • WHERE p.id_product IS NULL: Identifica los datos huérfanos.

Verificar los Resultados

  1. Ejecuta nuevamente las consultas de identificación para confirmar que no hay duplicados.
  2. Revisa el panel de administración de PrestaShop para asegurarte de que los productos se visualizan correctamente.

Conclusión

Con estas consultas puedes gestionar productos duplicados en PrestaShop de manera eficiente y precisa. Recuerda realizar pruebas en un entorno de desarrollo antes de aplicar los cambios en producción y siempre tener una copia de seguridad actualizada. Si tienes dudas o necesitas personalizar las consultas para estructuras específicas, no dudes en pedir ayuda.

Ir al contenido