En esta guía aprenderás a identificar y eliminar productos duplicados en PrestaShop directamente desde la base de datos utilizando phpMyAdmin y consultas SQL. Exploraremos dos enfoques: buscar duplicados por nombre y por referencia (SKU), explicando detalladamente cada paso y línea de código.
Índice
Introducción
Precaución: Realiza una copia de seguridad
Accediendo a phpMyAdmin
1. Accede a tu panel de control del hosting
2. Selecciona tu base de datos
Identificar y Eliminar Duplicados por Nombre
Paso 1: Identificar productos duplicados por nombre
Paso 2: Eliminar duplicados manteniendo uno
Identificar y Eliminar Duplicados por SKU
Paso 1: Identificar duplicados por SKU
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
- Accede a phpMyAdmin desde el panel de control de tu hosting (cPanel, Plesk u otro).
- Selecciona tu base de datos: En el panel izquierdo, elige la base de datos correspondiente a tu instalación de PrestaShop.
- 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:
- ps_product: Contiene la información básica de los productos (ID, referencia, precios, etc.).
- ps_product_lang: Almacena los nombres, descripciones y otros textos relacionados con los productos, organizados por idioma.
- ps_stock_available: Gestiona el inventario de los productos.
- 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
- Ejecuta nuevamente las consultas de identificación para confirmar que no hay duplicados.
- 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.