«SKU no válido o duplicado»: dos productos con el mismo SKU
Los SKU duplicados estropean la sincronización del inventario, las exportaciones y los feeds, y WooCommerce solo avisa en el momento de guardar.
El síntoma
Intentas guardar un producto y WooCommerce se niega: «SKU no válido o duplicado.» O peor aún: nada lo impide, porque el duplicado lo creó una importación, una edición en lote o un plugin que nunca pasó por la pantalla del producto. El catálogo parece correcto. Las cifras del inventario, no.
Lo que cuesta
El SKU es el identificador que todos los sistemas fuera de WooCommerce usan para decir exactamente este producto. Cuando dos productos llevan el mismo:
- La sincronización del inventario va al producto equivocado. Un ERP, una aplicación de almacén o la integración con un marketplace actualiza una fila y el cliente compra la otra.
- Los feeds de productos se desmoronan. Google Merchant Center y la mayoría de los marketplaces usan el SKU (o el GTIN junto con el SKU) como clave; los duplicados se fusionan o se rechazan, y pierdes el anuncio sin que nadie te lo diga.
- Los informes mienten. Cualquier informe que agrupe por SKU suma dos productos como si fueran uno.
Nada de esto aparece como error en la tienda, y por eso los duplicados sobreviven durante años.
Cómo comprobarlo tú mismo
Desde WP-CLI, sin ningún plugin:
wp db query "SELECT meta_value AS sku, COUNT(*) AS n \
FROM wp_postmeta pm JOIN wp_posts p ON p.ID = pm.post_id \
WHERE pm.meta_key = '_sku' AND pm.meta_value <> '' \
AND p.post_status IN ('publish','draft','private') \
GROUP BY meta_value HAVING n > 1"
Cambia wp_ por el prefijo de tus tablas. La consulta incluye también las variaciones, porque
tienen su propio _sku. Una variación sin SKU propio tiene ahí un valor vacío y no aparece, aunque
WooCommerce le muestre el SKU de su producto superior. Una variación que guarda el mismo SKU que su
propio producto superior sí aparece; Merchlint no informa de esa pareja, como se explica más abajo.
Cómo corregirlo
- Decide qué producto se queda con el SKU; normalmente, el que tiene historial de pedidos.
- Dale al otro un SKU nuevo que siga tu propio esquema. No lo dejes vacío si algún otro sistema depende de él.
- Si el duplicado es una variación del mismo producto superior, comprueba si es un resto de un valor de atributo que borraste; esas variaciones normalmente se pueden eliminar sin problema en lugar de renumerarlas.
- Si lo creó una importación, corrígela también, o el duplicado volverá en la siguiente ejecución.
Cuándo es un falso positivo
- Reutilizas los SKU a propósito entre idiomas. Las traducciones de un producto en WPML y Polylang comparten SKU legítimamente. Merchlint excluye los pares de traducción que conoce; si usas otra solución multilingüe, oculta el hallazgo.
- Un sustituto que ya has publicado mientras el original sigue publicado. El hallazgo desaparece cuando pasas el producto antiguo a borrador o lo eliminas. Los borradores nunca lo provocan: Merchlint solo compara productos publicados, mientras que la consulta de arriba también muestra borradores.
- Lotes que heredan el SKU de un componente por diseño, en algunos plugins de lotes.
Cómo lo encuentra Merchlint
Merchlint lee _sku de los productos publicados y de sus variaciones, agrupa por valor, ignora
los valores vacíos e informa de cada producto que comparte su código con otro producto, o con una
variación de otro producto. El hallazgo muestra el SKU, los ID de los productos que lo comparten y el
estado de cada uno, para que decidas cuál se lo queda sin abrir los dos.
Los códigos se comparan como los lee una persona. Desde la versión 0.3.5, un carácter invisible o un espacio de no separación (habituales cuando se pega un código desde una hoja de cálculo) no convierten el código en otro distinto, y se ignoran los espacios al principio y al final. Las mayúsculas y minúsculas se comparan como lo hace la base de datos de la tienda. Antes de la 0.3.5 el resultado dependía de esa base de datos: en MySQL 8 un duplicado así pasaba desapercibido, o solo aparecía uno de los dos productos.
Dos casos quedan fuera, ambos a propósito. Un producto que comparte código con su propia variación no aparece en el informe: WooCommerce muestra el SKU del producto superior en una variación que no tiene uno propio, así que ese par refleja cómo funciona la plataforma, no un fallo. Y dos variaciones de un mismo producto con el mismo código cuando el producto en sí no tiene ninguno: un hallazgo pertenece a un producto, y ahí no hay a qué asociarlo. Las variaciones que están en la papelera nunca cuentan.
Fiabilidad: F, dato de la base de datos. Sin interpretación, sin umbral. Dos filas tienen el mismo valor o no lo tienen.
Esta comprobación está en la versión gratuita, en todos los productos, sin tope. Si solo necesitas los SKU y los GTIN, el mismo motor existe también como plugin gratuito aparte, solo con estas comprobaciones: buscador de SKU y GTIN duplicados.
¿No coincide con lo que ves en tu tienda? Escríbenos (leemos todos los mensajes): contact@merchlint.com