Eliminar productos duplicados por SKU en Woocommerce

Contenido

Trabajando con una tienda WooCommerce y usando el plugin WP All Import (de pago), el cual importa productos y actualiza el stock de la tienda automáticamente, por un error nuestro al importar dos veces el mismo archivo .csv, nos duplicó en más de 300 productos (simples, sin variaciones) con la misma referencia.

Lo que suponía un problema, ya que había que buscar uno a uno cada artículo duplicado y eliminarlo, una tarea imposible. Sin embargo hay una solución un poco más rápida y "práctica", según se mire con phpmyadmin, que a día de hoy, fecha de la publicación sigue funcionando.

¿Qué vamos a hacer?

  1. Seleccionamos los SKU que se repiten en la tabla wp_postmeta
  2. Seleccionamos productos que no tienen un SKU asignado
  3. Hacemos una consulta utilizando una combinación de LEFT JOIN
  4. Eliminamos los productos, así como todas las otras tablas relacionadas, incluyendo wp_postmeta, wp_comments y wp_commentmeta

Recuerda que antes de ejecutar cualquier consulta SQL en tu base de datos, es importante hacer una copia de seguridad. Además, asegúrate de comprender el funcionamiento de la consulta y de tener cuidado al ejecutarla para evitar errores indeseados en tu base de datos.

Una vez hecha la copia de seguridad entramos en phpmyadmin. Accedes a tu base de datos y generas/simulas una primera consulta SQL.

1. Buscar productos con SKU duplicados

Botón SQL - Imagen: FastWebHost

Vamos a buscar productos con SKU duplicados. Selecciona tu base de datos en el menú lateral izquierdo, una vez dentro pulsa sobre la opción SQL (imagen superior). Borra lo que hay puesto (si hay algo) y pones lo siguiente:

¡OJO! Si los productos no tienen SKU o REFERENCIA asignada, no te mostrará resultados, obvio, por que no tienen SKU. En este caso, tienes que saltar al paso 3.

Con esto obtenemos los productos con SKU duplicado.

2. Quitando SKU a productos seleccionados

Ahora que tenemos seleccionados los productos, los marcamos todos y eliminamos las tablas. Lo que hacemos con esto es eliminar el SKU o referencia de los productos.

3. Selección productos sin SKU establecido

Continuamos y generamos otra consulta SQL en la misma página que buscará y mostrará solamente los productos que no tienen SKU:

4. Localizaremos los productos sin SKU y los eliminaremos

Y finalizamos con otra consulta SQL, sin salir de la página, donde ya localizados los productos sin SKU anteriormente los eliminamos:

Con esto fulminamos todos los productos con su SKU duplicado, solo los productos, ten en cuenta que las imágenes asociadas al producto seguirán intactas en tu servidor.

Fuentes:
- yanknudtskov (github)
- devlog.rolandow.com

  1. Marcela dice:

    Hola!
    Borre unos productos con sus variaciones para pasarlos dentro de otros pero al volver a generarlos como estaban me figura que el sku está duplicado.
    Por lo cual intenté la solución que plantea pero me figura eso:

    Error

    consulta SQL: Documentación

    SELECT meta_value
    FROM wp_postmeta
    WHERE meta_key = '_sku'
    AND meta_value != ''
    GROUP BY meta_value HAVING COUNT(meta_value) > 1 LIMIT 0, 25

    MySQL ha dicho: Documentación
    #1146 - Tabla 'artezw_productos.wp_postmeta' no existe

    1. Javier dice:

      Hola,
      lo que te está diciendo básicamente es que la tabla ‘artezw_productos.wp_postmeta’ no existe.
      Revisa bien que tengas esa tabla en la base de datos. No obstante, esta guía está enfocada a productos simples, desconozco si en productos con variaciones funciona.
      Un saludo y gracias por comentar.

  2. Carlos Solis dice:

    Eres un crack

    1. Javier dice:

      Muchas gracias 🙂
      Un saludo.

  3. juan dice:

    Hola, llevo mucho tiempo dandole vueltas para poder realizar el borrado de duplicados de los productos variables. A mi tambien me pasó por culpa de Wp All Import y ahora tengo 9.000 variaciones duplicadas. El caso es que sigo vuestro tutorial pero cuando pongo el codigo para seleccionar los productos sin SKU establecido, los resultados son 0. Asi que no puedo eliminar el resto de datos asociados por que no encuentra nada. ¿Podriais ayudarme? Es realmente importante para mi. Gracias

    1. Javier dice:

      Buenas Juan,
      a ver 9.000 registros es mucho, yo te recomendaría si puedes eliminar todos los registros y volver a importarlos, esta vez de forma correcta.

      Ya que la consulta actual del artículo para "seleccionar los productos sin SKU establecido" está configurada para seleccionar los productos y no las variaciones, no se puede aplicar la misma forma de eliminar los productos duplicados y al ser un caso muy concreto y con poca información acerca del problema es difícil aplicarlo a tu caso. Ten en cuenta que por defecto las variaciones de los Productos Variables no tienen SKU asignado.

      Obtener una lista de Productos Variables sin SKU

      1. Primero habría que seleccionar las Variaciones que no tienen SKU con la siguiente consulta (es posible que te aparezcan TODAS las variaciones):

      Esto no mostrará los productos, solo las variaciones sin SKU. Asegúrate de realizar una copia de seguridad completa de tu base de datos antes de ejecutar esta consulta y solo hazlo si estás completamente seguro de lo que estás haciendo.

      SELECT p.ID,
      p.post_title,
      p.post_type,
      pm.meta_value

      FROM wp_posts p

      LEFT JOIN wp_postmeta pm
      ON pm.post_id = p.ID
      AND pm.meta_key = '_sku'

      WHERE p.post_type = 'product_variation'
      AND (pm.meta_value = ''
      OR pm.meta_value IS NULL)

      Como ves, se ha modificado la consulta original de "WHERE p.post_type = 'product'" a "WHERE p.post_type = 'product_variation'"

      Eliminar las variaciones sin SKU

      2. Después, si quieres eliminar las variaciones que no tienen SKU (posiblemente todas las variaciones), habría que modificar la consulta del artículo, por ésta:

      Esto no elimina el producto, solo las variaciones sin SKU. Asegúrate de realizar una copia de seguridad completa de tu base de datos antes de ejecutar esta consulta y solo hazlo si estás completamente seguro de lo que estás haciendo.

      DELETE p, pm, c, cm
      FROM wp_posts p

      LEFT JOIN wp_postmeta pm
      ON pm.post_id = p.ID
      AND pm.meta_key = '_sku'

      LEFT JOIN wp_comments c
      ON c.comment_post_ID = p.ID

      LEFT JOIN wp_commentmeta cm
      ON cm.comment_id = c.comment_ID

      WHERE p.post_type = 'product_variation'
      AND (pm.meta_value = '' OR pm.meta_value IS NULL)

      Esta consulta eliminará las variaciones sin SKU (por defecto eliminará TODAS las variaciones), así como cualquier meta información, comentarios y metadatos de comentarios asociados a esas variaciones de productos.

      Ten en cuenta que por falta de tiempo no he probado las consultas, por lo que podría ocurrir que haya algún error, por favor, te recomiendo que hagas una copia de seguridad de tu base de datos antes de modificar nada. Cualquier duda me comentas por aquí.

Deja una respuesta

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

Subir