
🗑 Eliminación masiva de productos y atributos de WooCommerce: SQL, WP-CLI y plugins
Abre el panel de administración de WooCommerce y ve tres mil productos, la mitad duplicados por una importación fallida, con atributos como «Color 1», «Color 2», «Size_copy_2023». La interfaz de «Productos → seleccionar todo → Eliminar» se cuelga después de los primeros doscientos. ¿Le suena familiar? La limpieza masiva del catálogo es una tarea a la que todo el mundo se enfrenta al migrar una tienda, fusionar una base de datos de staging con producción o relanzar un escaparate tras un cambio de marca.
El problema radica en cómo está estructurado WooCommerce: los productos se reparten en cuatro tablas (wp_posts, wp_postmeta, wp_term_relationships y wp_term_taxonomy), y los atributos se almacenan en tres más. No basta con hacer clic en «Eliminar todo»; el motor se colapsará antes de llegar al final de la lista. Necesita una herramienta que evite la interfaz y ataque directamente la base de datos, o que funcione mediante la CLI.
A continuación, tres métodos operativos, desde el SQL radical hasta los plugins seguros. Con copia de seguridad, con verificación de prefijos y entendiendo qué ocurre exactamente en cada tabla.
💡 Resumen rápido:
- Haga un volcado completo de la base de datos;
DELETEes irreversible, no hay papelera - Verifique el prefijo de tabla en
wp-config.phpy sustitúyalo porwp_ - Ejecute los comandos SQL en orden de cascada: atributos → productos → postmeta huérfana
- Si tiene SSH, WP-CLI lo resuelve con un solo comando y dispara los hooks necesarios
- Para una tienda en producción sin experiencia en SQL, los plugins con botón «Eliminar» son más seguros
Precauciones: copia de seguridad y prefijo
Cualquier comando SQL que modifique el contenido de las tablas de WordPress es irreversible. DELETE no pide confirmación, no envía el registro a la papelera; la fila desaparece al instante y de forma permanente. Regla número uno: haga una copia de seguridad completa de la base de datos antes de ejecutar cualquiera de las consultas siguientes.
El enfoque más fiable es exportar un volcado mediante phpMyAdmin: pestaña «Exportar» → formato SQL → comprimir con gzip. O a través del panel de hosting (cPanel → Copia de seguridad → Base de datos). Para quienes trabajan desde la línea de comandos:
1 mysqldump -u username -p database_name > backup_$(date +%Y%m%d).sql
Segundo punto: todas las consultas siguientes usan el prefijo estándar wp_. Si cambió el prefijo durante la instalación de WordPress a wpx_, store_ o cualquier otro, reemplace wp_ en cada comando por el suyo. El prefijo real está en wp-config.php, en la línea $table_prefix. ¿Lo ha comprobado? Ahora vamos al grano.
Método 1: comandos SQL en phpMyAdmin, control total
El método más rápido y radical. Ideal cuando necesita eliminar cientos o miles de registros de una sola pasada y la interfaz estándar de WooCommerce se cuelga. Todas las consultas se ejecutan en phpMyAdmin en la pestaña «SQL», una a una, en orden estricto.
Eliminar atributos de WooCommerce
Los atributos residen en tres tablas a la vez: wp_terms, wp_term_taxonomy y wp_term_relationships. Se diferencian de las categorías y etiquetas normales por el prefijo pa_ en el campo taxonomy, abreviatura de «product attribute». Debe eliminarlos en cascada, empezando por los términos y terminando por las relaciones:
1 DELETE FROM wp_terms WHERE term_id IN 2 (SELECT term_id FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%'); 3 4 DELETE FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%'; 5 6 DELETE FROM wp_term_relationships WHERE term_taxonomy_id NOT IN 7 (SELECT term_taxonomy_id FROM wp_term_taxonomy);
La primera consulta elimina los nombres de atributos de wp_terms. La segunda borra sus registros de taxonomía de wp_term_taxonomy. La tercera limpia las relaciones «término-objeto» huérfanas de wp_term_relationships que se quedaron sin una taxonomía padre. El orden importa: si elimina la taxonomía antes que los términos, la tercera consulta abarcará demasiado.
Eliminar productos de WooCommerce
Los productos y sus variaciones son registros con el tipo product y product_variation en la tabla wp_posts. Pero borrar simplemente las filas de wp_posts no basta: los metadatos permanecerán en wp_postmeta (precio, SKU, configuración de envío) y las relaciones de términos permanecerán en wp_term_relationships (categorías, etiquetas). Tres consultas, en cascada:
1 DELETE FROM wp_term_relationships WHERE object_id IN 2 (SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation')); 3 4 DELETE FROM wp_postmeta WHERE post_id IN 5 (SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation')); 6 7 DELETE FROM wp_posts WHERE post_type IN ('product','product_variation');
Primero rompemos las relaciones del producto con las taxonomías, luego eliminamos los metadatos y solo después el registro del producto en sí. Si invierte el orden y elimina primero wp_posts, las subconsultas SELECT ID FROM wp_posts en el segundo y tercer paso devolverán un conjunto vacío, y los metadatos y relaciones quedarán como peso muerto en la base de datos.
Limpiar postmeta huérfana
Después de cualquier operación de eliminación mediante SQL, conviene comprobar si wp_postmeta contiene filas que hagan referencia a publicaciones inexistentes. Esto ocurre con transacciones interrumpidas, importaciones fallidas o cuando se eliminaron publicaciones sin aplicar la cascada:
1 DELETE pm 2 FROM wp_postmeta pm 3 LEFT JOIN wp_posts wp ON wp.ID = pm.post_id 4 WHERE wp.ID IS NULL;
La consulta encuentra todas las filas de wp_postmeta que no tienen un registro padre en wp_posts y las elimina. Es segura: no toca datos vivos, solo basura.
Método 2: WP-CLI, rápido y sin phpMyAdmin
Si tiene acceso SSH al servidor, WP-CLI gestiona la eliminación masiva de forma más elegante que cualquier consulta SQL. Un solo comando y WooCommerce recorre las tablas relacionadas por sí mismo, sin dejar datos huérfanos:
1 wp wc product delete $(wp wc product list --field=ID --per_page=-1) --force
El flag --per_page=-1 exporta los IDs de todos los productos sin paginación. --force se salta la papelera y elimina de forma permanente. Si tiene más de 10 000 productos, es mejor dividirlos en lotes de 500 para evitar alcanzar los límites de memoria:
1 wp wc product list --field=ID --per_page=500 --page=1 | xargs wp wc product delete --force
Para eliminar atributos mediante WP-CLI, use:
1 wp wc product_attribute list --field=id --per_page=-1 | xargs -I{} wp wc product_attribute delete {} --force
La principal ventaja de WP-CLI frente al SQL directo es que dispara los hooks internos de WooCommerce, before_delete_post y after_delete_post. Esto da a los plugins de caché y búsqueda (Elasticsearch, Redis, Relevanssi) la oportunidad de limpiar sus índices. Las consultas SQL no hacen esto; después de ejecutarlas, la búsqueda puede seguir devolviendo productos ya eliminados durante un tiempo.
Método 3: plugins, para cuando no quiere tocar la base de datos
Para quienes encuentran la línea de comandos y phpMyAdmin demasiado arriesgados, el mercado ofrece plugins especializados. Funcionan sobre las mismas consultas SQL pero las ocultan detrás de un botón.
Delete All Products for WooCommerce es un plugin gratuito del repositorio oficial de WordPress.org. Añade un único botón al panel de administración. Haga clic → elija «mover a la papelera» o «permanentemente» → confirme. Pasos mínimos, riesgo cero de un error tipográfico en SQL. La desventaja: solo funciona con productos, no toca los atributos.
WooCommerce Store Toolkit (también conocido como Store Toolkit for WooCommerce) es una opción más seria. Limpia no solo productos y atributos, sino también pedidos, cupones, sesiones y transitorios, con filtros por fecha y estado. Adecuado para una limpieza profunda completa de la tienda antes de un relanzamiento.
Sea cual sea el plugin que elija, la regla de la copia de seguridad sigue aplicándose. Un plugin ejecuta las mismas consultas DELETE; simplemente usted no las ve.
Comparación de métodos: qué elegir y cuándo
Método | Velocidad | Seguridad | Flexibilidad | Pensado para |
|---|---|---|---|---|
SQL en phpMyAdmin | Instantáneo | Baja, sin protección contra errores | Control total sobre las tablas | Desarrolladores, administradores de servidores |
WP-CLI | Rápido, segundos | Alta, hooks y eliminación en cascada | Banderas prácticas y paginación | Desarrolladores, DevOps |
Plugins | Lento, cientos por minuto | Máxima, basada en interfaz | Limitada a la funcionalidad del plugin | Propietarios de tiendas |
Si tiene un producto o una docena, la interfaz de WooCommerce «Productos → seleccionar → Eliminar» cumplirá su función. Cientos o miles requieren SQL o WP-CLI. Una tienda en producción activa donde no hay margen para el error requiere un plugin o WP-CLI.
Limitaciones importantes: lo que no se elimina
La eliminación masiva de productos y atributos mediante SQL no afecta a los archivos multimedia. Las imágenes de producto subidas a la biblioteca de medios de WordPress (registros con post_type = 'attachment') permanecen en su sitio, tanto en el sistema de archivos como en la base de datos. Si está reconstruyendo el catálogo desde cero y quiere liberar espacio en su alojamiento, los archivos multimedia deben limpiarse por separado: mediante «Medios → seleccionar → Eliminar permanentemente» o con WP-CLI:
1 wp post delete $(wp post list --post_type=attachment --field=ID --per_page=-1) --force
Los comandos SQL tampoco actualizan los contadores de WooCommerce (recuentos de productos por categoría) que están almacenados en caché en wp_termmeta y wp_options como transitorios con el prefijo _wc_term_counts_. Tras una eliminación masiva, el panel de administración puede mostrar temporalmente recuentos de productos por categoría incorrectos. Esto se soluciona con un recuento:
1 wp wc tool run recount_terms
O mediante el plugin Recount Terms del repositorio.
El video ofrece un recorrido paso a paso de los comandos SQL para eliminar atributos de WooCommerce en phpMyAdmin: navegar por las tablas y verificar los resultados después de cada consulta.
⁉️🤔 Preguntas frecuentes
¿Es seguro eliminar productos mediante SQL en una tienda en producción?
En una tienda en producción, usar SQL puro para eliminaciones masivas es una práctica arriesgada. Un simple error tipográfico en el nombre de una tabla o en la cláusula
WHEREpuede afectar a pedidos, usuarios o ajustes. Si la tienda está activa y generando ingresos, use WP-CLI o plugins que no le permitan meterse un tiro en el pie. Reserve el SQL para entornos de desarrollo, staging y situaciones en las que la interfaz de administración ya no cargue.
¿Por qué los productos siguen apareciendo en la búsqueda del sitio después de eliminarlos con SQL?
Los plugins de búsqueda (Relevanssi, Elasticsearch, SearchWP) mantienen su propio índice, que no se actualiza cuando se manipula
wp_postsdirectamente, saltándose la API de WordPress. Después de limpiar mediante SQL, necesita reconstruir el índice de búsqueda en los ajustes del plugin o mediante WP-CLI: por ejemplo,wp relevanssi index --reindex.
¿Cómo elimino productos solo de una categoría específica, y no todos?
Añada un filtro por el
term_taxonomy_idde la categoría deseada. El procedimiento: obtenga elterm_idde la categoría → encuentre elterm_taxonomy_idenwp_term_taxonomy→ filtreobject_idenwp_term_relationshipsantes de eliminar dewp_posts. En la práctica, es más sencillo usar WP-CLI:wp wc product list --category=slug-kategorii --field=ID | xargs wp wc product delete --force.
¿Se pueden restaurar los productos después de eliminarlos con SQL?
Solo desde una copia de seguridad. A diferencia de la eliminación mediante la papelera de WordPress (Mover a la papelera), el comando SQL
DELETEborra las filas de forma física e irreversible. Esta es precisamente la razón por la que la regla de «copia de seguridad primero» se repite en cada sección de este artículo. Dos minutos dedicados a un volcado le ahorrarán horas de recuperación.
¿Cuál es la diferencia entre eliminar atributos y eliminar variaciones?
Las variaciones son un subtipo de productos (
product_variation). Se eliminan con los mismos comandos SQL que los productos simples: la condiciónpost_type IN ('product','product_variation')del segundo bloque del «Método 1» ya incluye las variaciones. Los atributos (pa_color,pa_size) son taxonomías; se eliminan por separado, con el primer bloque de comandos SQL. El orden correcto es: primero los productos (incluidas las variaciones), después los atributos. Si se hace al revés, las variaciones perderán sus vínculos de atributo, pero los registros de variación en sí permanecerán en la base de datos.
Qué usar en 2026: la conclusión
Los comandos SQL, WP-CLI y los plugins son tres herramientas de distintos niveles de riesgo para una misma tarea. La elección se reduce a una matriz simple:
- Tiene SSH y experiencia en línea de comandos → WP-CLI (
wp wc product delete). Seguro, rápido y con hooks. - No tiene SSH pero dispone de phpMyAdmin y comprende el esquema de las tablas → SQL. Control total, resultados instantáneos. Pero copia de seguridad primero.
- No quiere ningún riesgo → Delete All Products o Store Toolkit. Más lento, pero un botón en lugar de una consulta SQL.
En cualquier escenario, una copia de seguridad de la base de datos es la acción número uno. No empiece sin ella.
🔗 Delete All Products for WooCommerce, gratis en WordPress.org🔗 WooCommerce Store Toolkit, limpieza avanzada de tienda



