Skip to content

Tutto per WordPress, lo sviluppo web — e non solo

🗑 Eliminazione in blocco di prodotti e attributi WooCommerce: SQL, WP-CLI e plugin

🗑 Eliminazione in blocco di prodotti e attributi WooCommerce: SQL, WP-CLI e plugin

Apri il pannello di amministrazione di WooCommerce e vedi tremila prodotti, metà dei quali duplicati da un'importazione fallita, con attributi come "Color 1", "Color 2", "Size_copy_2023". L'interfaccia "Prodotti → seleziona tutto → Elimina" va in timeout dopo le prime duecento righe. Ti suona familiare? La pulizia massiva del catalogo è un'attività che chiunque affronta quando migra un negozio, unisce un database di staging con quello di produzione o rilancia una vetrina dopo un rebrand.

Il problema sta nella struttura di WooCommerce: i prodotti sono distribuiti su quattro tabelle (wp_posts, wp_postmeta, wp_term_relationships e wp_term_taxonomy) e gli attributi sono memorizzati in altre tre. Non puoi semplicemente cliccare "Elimina tutto"; il motore andrà in crash prima di raggiungere la fine dell'elenco. Ti serve uno strumento che aggiri l'interfaccia e colpisca direttamente il database, oppure che operi via CLI.

Ecco tre metodi funzionanti, dal SQL radicale ai plugin sicuri. Con un backup, con la verifica del prefisso e con la comprensione di cosa succede esattamente in ogni tabella.

💡 Panoramica rapida:

  • Fai un dump completo del database; DELETE è irreversibile, non c'è un cestino
  • Controlla il prefisso delle tabelle in wp-config.php e sostituiscilo a wp_
  • Esegui i comandi SQL in ordine a cascata: attributi → prodotti → postmeta orfani
  • Se hai SSH, WP-CLI gestisce tutto con un solo comando e attiva gli hook necessari
  • Per un negozio in produzione senza esperienza SQL, i plugin con un pulsante "Elimina" sono più sicuri

Precauzioni: backup e prefisso

Qualsiasi comando SQL che modifichi il contenuto delle tabelle di WordPress è irreversibile. DELETE non chiede conferma, non sposta il record nel cestino; la riga scompare all'istante e in modo permanente. Regola numero uno: fai un backup completo del database prima di eseguire una qualsiasi delle query seguenti.

L'approccio più affidabile è esportare un dump via phpMyAdmin: scheda "Esporta" → formato SQL → comprimi con gzip. Oppure tramite il pannello di hosting (cPanel → Backup → Database). Per chi lavora da riga di comando:

1mysqldump -u username -p database_name > backup_$(date +%Y%m%d).sql

Secondo punto: tutte le query seguenti usano il prefisso standard wp_. Se durante l'installazione di WordPress hai cambiato il prefisso in wpx_, store_ o qualsiasi altra cosa, sostituisci wp_ in ogni comando con il tuo. Il prefisso effettivo si trova in wp-config.php, nella riga $table_prefix. Controllato? Ora passiamo all'azione.

Metodo 1: comandi SQL in phpMyAdmin, controllo totale

Il metodo più veloce e radicale. Ideale quando devi cancellare centinaia o migliaia di record in un solo passaggio e l'interfaccia standard di WooCommerce va in timeout. Tutte le query si eseguono in phpMyAdmin nella scheda "SQL", una alla volta, in ordine rigoroso.

Eliminare gli attributi di WooCommerce

Gli attributi risiedono in tre tabelle contemporaneamente: wp_terms, wp_term_taxonomy e wp_term_relationships. Si distinguono dalle categorie e dai tag normali per il prefisso pa_ nel campo taxonomy, abbreviazione di "product attribute". Devi eliminarli a cascata, partendo dai termini e finendo con le relazioni:

1DELETE FROM wp_terms WHERE term_id IN
2(SELECT term_id FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%');
3
4DELETE FROM wp_term_taxonomy WHERE taxonomy LIKE 'pa_%';
5
6DELETE FROM wp_term_relationships WHERE term_taxonomy_id NOT IN
7(SELECT term_taxonomy_id FROM wp_term_taxonomy);

La prima query cancella i nomi degli attributi da wp_terms. La seconda rimuove i loro record di tassonomia da wp_term_taxonomy. La terza pulisce le relazioni "termine-oggetto" orfane da wp_term_relationships rimaste senza una tassonomia padre. L'ordine è importante: se cancelli la tassonomia prima dei termini, la terza query catturerà troppe cose.

Eliminare i prodotti di WooCommerce

I prodotti e le loro varianti sono record con tipo product e product_variation nella tabella wp_posts. Ma cancellare semplicemente le righe da wp_posts non basta: i metadati resteranno in wp_postmeta (prezzo, SKU, impostazioni di spedizione) e le relazioni con i termini resteranno in wp_term_relationships (categorie, tag). Tre query, a cascata:

1DELETE FROM wp_term_relationships WHERE object_id IN
2(SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));
3
4DELETE FROM wp_postmeta WHERE post_id IN
5(SELECT ID FROM wp_posts WHERE post_type IN ('product','product_variation'));
6
7DELETE FROM wp_posts WHERE post_type IN ('product','product_variation');

Prima rompiamo le relazioni del prodotto con le tassonomie, poi cancelliamo i metadati e solo dopo il record del prodotto stesso. Se inverti l'ordine e cancelli prima wp_posts, le sottoquery SELECT ID FROM wp_posts nel secondo e terzo passaggio restituiranno un insieme vuoto, e metadati e relazioni rimarranno come peso morto nel database.

Pulire i postmeta orfani

Dopo qualsiasi operazione di cancellazione via SQL, vale la pena verificare se wp_postmeta contiene righe che fanno riferimento a post inesistenti. Succede con transazioni interrotte, importazioni difettose o quando i post sono stati cancellati senza cascata:

1DELETE pm
2FROM wp_postmeta pm
3LEFT JOIN wp_posts wp ON wp.ID = pm.post_id
4WHERE wp.ID IS NULL;

La query trova tutte le righe di wp_postmeta che non hanno un record padre in wp_posts e le elimina. È sicura: non tocca i dati vivi, solo spazzatura.

Metodo 2: WP-CLI, veloce e senza phpMyAdmin

Se hai accesso SSH al server, WP-CLI gestisce la cancellazione massiva in modo più elegante di qualsiasi query SQL. Un comando e WooCommerce percorre da solo le tabelle correlate, senza lasciare dati orfani:

1wp wc product delete $(wp wc product list --field=ID --per_page=-1) --force

Il flag --per_page=-1 esporta gli ID di tutti i prodotti senza paginazione. --force salta il cestino e cancella in modo permanente. Se hai più di 10.000 prodotti, è meglio suddividere in lotti da 500 per evitare di raggiungere i limiti di memoria:

1wp wc product list --field=ID --per_page=500 --page=1 | xargs wp wc product delete --force

Per eliminare gli attributi via WP-CLI, usa:

1wp wc product_attribute list --field=id --per_page=-1 | xargs -I{} wp wc product_attribute delete {} --force

Il vantaggio principale di WP-CLI rispetto al SQL puro è che attiva gli hook interni di WooCommerce, before_delete_post e after_delete_post. Questo dà ai plugin di caching e ricerca (Elasticsearch, Redis, Relevanssi) la possibilità di ripulire i propri indici. Le query SQL non lo fanno; dopo averle eseguite, la ricerca potrebbe continuare a restituire per un po' di tempo prodotti già eliminati.

Metodo 3: plugin, quando non vuoi toccare il database

Per chi trova la riga di comando e phpMyAdmin troppo rischiosi, il mercato offre plugin specializzati. Lavorano sopra le stesse query SQL ma le nascondono dietro un pulsante.

Delete All Products for WooCommerce è un plugin gratuito dal repository ufficiale di WordPress.org. Aggiunge un singolo pulsante al pannello di amministrazione. Clicca → scegli «sposta nel cestino» o «permanentemente» → conferma. Passaggi minimi, rischio zero di un errore di battitura SQL. Lo svantaggio: funziona solo con i prodotti, non tocca gli attributi.

WooCommerce Store Toolkit (noto anche come Store Toolkit for WooCommerce) è un'opzione più seria. Pulisce non solo prodotti e attributi ma anche ordini, coupon, sessioni e transitori, con filtri per data e stato. Adatto per una pulizia profonda completa del negozio prima di un rilancio.

Qualunque plugin tu scelga, la regola del backup resta valida. Un plugin esegue le stesse query DELETE; semplicemente non le vedi.

Confronto tra i metodi: cosa scegliere e quando

Metodo

Velocità

Sicurezza

Flessibilità

Pensato per

SQL in phpMyAdmin

Immediato

Bassa, nessuna protezione da errori

Controllo totale sulle tabelle

Sviluppatori, amministratori di server

WP-CLI

Veloce, secondi

Alta, hook e cancellazioni a cascata

Flag comodi e paginazione

Sviluppatori, DevOps

Plugin

Lento, centinaia al minuto

Massima, basata su interfaccia

Limitata alle funzionalità del plugin

Proprietari di negozi

Se hai un prodotto o una dozzina, l'interfaccia di WooCommerce «Prodotti → seleziona → Elimina» farà il suo lavoro. Centinaia o migliaia richiedono SQL o WP-CLI. Un negozio in produzione reale dove non c'è margine di errore richiede un plugin o WP-CLI.

Limitazioni importanti: cosa non viene cancellato

La cancellazione massiva di prodotti e attributi tramite SQL non tocca i file media. Le immagini dei prodotti caricate nella libreria media di WordPress (record con post_type = 'attachment') restano al loro posto, sia nel file system che nel database. Se stai ricostruendo il catalogo da zero e vuoi liberare spazio sul tuo hosting, i file media vanno puliti separatamente: tramite "Media → seleziona → Elimina definitivamente" o WP-CLI:

1wp post delete $(wp post list --post_type=attachment --field=ID --per_page=-1) --force

I comandi SQL inoltre non aggiornano i contatori di WooCommerce (conteggi prodotti per categoria) che sono memorizzati nella cache in wp_termmeta e wp_options come transient con il prefisso _wc_term_counts_. Dopo una cancellazione massiva, il pannello di amministrazione potrebbe mostrare temporaneamente conteggi prodotti per categoria errati. Si risolve con il riconteggio:

1wp wc tool run recount_terms

Oppure tramite il plugin Recount Terms dal repository.

Il video mostra una guida passo passo ai comandi SQL per eliminare gli attributi WooCommerce in phpMyAdmin: navigare tra le tabelle e verificare i risultati dopo ogni query.

⁉️🤔 Domande frequenti

È sicuro eliminare prodotti via SQL su un negozio live?

Su un negozio in produzione, usare SQL diretto per cancellazioni massive è una pratica rischiosa. Un singolo errore di battitura nel nome di una tabella o nella clausola WHERE può compromettere ordini, utenti o impostazioni. Se il negozio è attivo e genera ricavi, usa WP-CLI o plugin che non ti permettano di spararti sui piedi. Lascia l'SQL per ambienti di sviluppo, staging e situazioni in cui l'interfaccia di amministrazione non riesce più a caricarsi.

Perché i prodotti sono ancora visibili nella ricerca del sito dopo la cancellazione SQL?

I plugin di ricerca (Relevanssi, Elasticsearch, SearchWP) mantengono un proprio indice, che non viene aggiornato quando si manipola direttamente wp_posts, bypassando l'API di WordPress. Dopo la pulizia via SQL, devi ricostruire l'indice di ricerca nelle impostazioni del plugin o via WP-CLI: ad esempio, wp relevanssi index --reindex.

Come faccio a eliminare solo i prodotti di una categoria specifica, e non tutti?

Aggiungi un filtro per il term_taxonomy_id della categoria desiderata. L'approccio: ottieni il term_id della categoria → trova il term_taxonomy_id in wp_term_taxonomy → filtra object_id in wp_term_relationships prima di eliminare da wp_posts. Nella pratica, è più semplice usare WP-CLI: wp wc product list --category=slug-kategorii --field=ID | xargs wp wc product delete --force.

I prodotti possono essere ripristinati dopo la cancellazione SQL?

Solo da un backup. A differenza della cancellazione tramite il cestino di WordPress (Sposta nel cestino), il comando SQL DELETE cancella le righe in modo fisico e irreversibile. È proprio per questo che la regola "prima il backup" è ripetuta in ogni sezione di questo articolo. Due minuti spesi per un dump fanno risparmiare ore di ripristino.

Qual è la differenza tra eliminare attributi ed eliminare varianti?

Le varianti sono un sottotipo di prodotto (product_variation). Vengono eliminate con gli stessi comandi SQL dei prodotti semplici: la condizione post_type IN ('product','product_variation') nel secondo blocco del "Metodo 1" include già le varianti. Gli attributi (pa_color, pa_size) sono tassonomie; si eliminano separatamente, con il primo blocco di comandi SQL. L'ordine corretto è: prima i prodotti (incluse le varianti), poi gli attributi. Se fatto al contrario, le varianti perderanno i loro legami con gli attributi, ma i record delle varianti stesse resteranno nel database.

Cosa usare nel 2026: in conclusione

Comandi SQL, WP-CLI e plugin sono tre strumenti con livelli di rischio diversi per un unico compito. La scelta si riduce a una semplice matrice:

  • Hai SSH ed esperienza con la riga di comando → WP-CLI (wp wc product delete). Sicuro, veloce, con hook.
  • Niente SSH ma hai phpMyAdmin e conosci lo schema delle tabelle → SQL. Controllo totale, risultati immediati. Ma prima il backup.
  • Vuoi zero rischi → Delete All Products o Store Toolkit. Più lento, ma un pulsante al posto di una query SQL.

In ogni scenario, il backup del database è l'azione numero uno. Non iniziare senza.

🔗 Delete All Products for WooCommerce, gratuito su WordPress.org🔗 WooCommerce Store Toolkit, pulizia avanzata del negozio