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

  1. 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.
  2. Selecciona tu base de datos:
    • En phpMyAdmin, selecciona la base de datos de tu sitio de WordPress desde el panel izquierdo.
  3. 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.

Ir al contenido