En esta guía aprenderás cómo identificar y eliminar productos duplicados en WooCommerce utilizando consultas SQL directamente desde phpMyAdmin. Vamos a explorar dos métodos: buscar duplicados por nombre y por SKU, y explicaremos cada paso y cada línea de código para garantizar que el proceso sea claro y seguro.
Í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 WooCommerce, los productos se almacenan como custom post types dentro de las tablas de WordPress. Si tienes productos duplicados, pueden surgir problemas como datos inconsistentes, confusión para los clientes o dificultades para gestionar el inventario. Usar consultas SQL es una forma eficiente de manejar estos duplicados directamente en la base de datos.
Precaución: Realiza una copia de seguridad
Antes de ejecutar cualquier consulta SQL, es fundamental realizar una copia de seguridad completa de tu base de datos. Puedes hacerlo desde el panel de administración de tu proveedor de hosting o utilizando un plugin como UpdraftPlus o All-in-One WP Migration.
Accediendo a phpMyAdmin
- Accede a tu panel de control del hosting:
- Ve al panel de control de tu hosting (cPanel, Plesk u otro).
- Busca la opción para gestionar bases de datos y haz clic en phpMyAdmin.
- Selecciona tu base de datos:
- En phpMyAdmin, selecciona la base de datos de tu sitio de WordPress desde el panel izquierdo.
- Abre el editor SQL:
- Haz clic en la pestaña SQL para abrir el editor donde ejecutarás las consultas.
Identificar y Eliminar Duplicados por Nombre
Paso 1: Identificar productos duplicados por nombre
Esta consulta busca productos en la tabla wp_posts con nombres duplicados.
NOTA: wp_ es el prefijo de tu tabla, si es personalizada como hacemos en ELIGEUNAWEB reemplaza wp por como se llame la tuya.
SELECT post_title, COUNT(*) AS count FROM wp_posts WHERE post_type = 'product' AND post_status = 'publish' GROUP BY post_title 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:
- post_type = ‘product’: Filtra solo los productos, excluyendo entradas de blog, páginas u otros tipos de contenido.
- post_status = ‘publish’: Considera solo productos publicados, ignorando borradores o productos eliminados.
- GROUP BY post_title: Agrupa los resultados por el nombre del producto.
- HAVING count > 1: Muestra solo los productos que aparecen más de una vez.
Resultado: Te devolverá una lista de nombres duplicados y la cantidad de veces que se repiten.
Paso 2: Eliminar duplicados manteniendo uno
Para eliminar los duplicados dejando solo el producto más reciente, usa la siguiente consulta:
DELETE p1 FROM wp_posts p1 INNER JOIN wp_posts p2 WHERE p1.post_title = p2.post_title AND p1.ID > p2.ID AND p1.post_type = 'product' AND p1.post_status = 'publish';
Explicación de la consulta:
- p1 y p2 son alias para la tabla wp_posts.
- p1.post_title = p2.post_title: Compara productos con el mismo nombre.
- p1.ID > p2.ID: Mantiene el producto con el ID más bajo (asume que el ID más bajo es el producto original).
- DELETE p1: Elimina los duplicados.
Identificar y Eliminar Duplicados por SKU
El SKU (Stock Keeping Unit) es un identificador único clave en WooCommerce. Asegúrate de que los productos duplicados comparten el mismo SKU antes de proceder.
Paso 1: Identificar duplicados por SKU
Esta consulta busca SKUs duplicados en la tabla wp_postmeta.
SELECT pm.meta_value AS SKU, COUNT(*) AS count FROM wp_postmeta pm INNER JOIN wp_posts p ON p.ID = pm.post_id WHERE pm.meta_key = '_sku' AND p.post_type = 'product' AND p.post_status = 'publish' GROUP BY pm.meta_value HAVING count > 1;
Explicación de la consulta:
- pm.meta_key = ‘_sku’: Filtra solo los metadatos que corresponden al SKU.
- p.post_type = ‘product’: Considera solo los productos.
- GROUP BY pm.meta_value: Agrupa los resultados por SKU.
- HAVING count > 1: Muestra solo los SKUs duplicados.
Paso 2: Eliminar duplicados manteniendo uno
Para eliminar duplicados dejando un solo producto por SKU, ejecuta la siguiente consulta:
DELETE p1 FROM wp_posts p1 INNER JOIN wp_postmeta pm1 ON p1.ID = pm1.post_id INNER JOIN wp_postmeta pm2 ON pm1.meta_value = pm2.meta_value INNER JOIN wp_posts p2 ON pm2.post_id = p2.ID WHERE pm1.meta_key = '_sku' AND pm2.meta_key = '_sku' AND p1.ID > p2.ID AND p1.post_type = 'product' AND p1.post_status = 'publish';
Explicación de la consulta:
- pm1.meta_value = pm2.meta_value: Compara productos con el mismo SKU.
- p1.ID > p2.ID: Mantiene el producto con el ID más bajo.
- DELETE p1: Elimina los productos duplicados.
Limpiar Metadatos Huérfanos
Después de eliminar duplicados, es posible que queden datos huérfanos en la tabla wp_postmeta. Usa esta consulta para limpiarlos:
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON wp.ID = pm.post_id WHERE wp.ID IS NULL;
Explicación:
- LEFT JOIN: Busca metadatos que no tengan un producto asociado en wp_posts.
- WHERE wp.ID IS NULL: Selecciona solo los registros huérfanos.
- DELETE pm: Elimina estos registros.
Verificar los Resultados
Para asegurarte de que no quedan duplicados:
- Ejecuta nuevamente las consultas de identificación.
- Confirma que los duplicados ya no aparecen en los resultados.
Conclusión
Ahora sabes cómo gestionar y eliminar productos duplicados en WooCommerce utilizando consultas SQL. Este proceso es eficiente y seguro si sigues las precauciones adecuadas. Siempre realiza pruebas en un entorno de desarrollo antes de aplicar cambios en tu sitio en producción.