Skip to content

Alles für WordPress, Webentwicklung — und mehr

🗑 Massenlöschung von WooCommerce-Produkten und -Attributen: SQL, WP-CLI und Plugins

🗑 Massenlöschung von WooCommerce-Produkten und -Attributen: SQL, WP-CLI und Plugins

Sie öffnen das WooCommerce-Admin-Panel und sehen dreitausend Produkte, die Hälfte davon Dubletten aus einem fehlgeschlagenen Import, mit Attributen wie „Color 1", „Color 2", „Size_copy_2023". Die Oberfläche „Produkte → Alle auswählen → Löschen" läuft nach den ersten paar Hundert in einen Timeout. Kommt Ihnen das bekannt vor? Die Massenbereinigung des Katalogs ist eine Aufgabe, vor der jeder steht, der einen Shop migriert, eine Staging-Datenbank mit der Produktion zusammenführt oder einen Storefront nach einem Rebranding neu startet.

Das Problem liegt in der Struktur von WooCommerce: Produkte verteilen sich auf vier Tabellen (wp_posts, wp_postmeta, wp_term_relationships und wp_term_taxonomy), Attribute werden in drei weiteren gespeichert. Ein einfacher Klick auf „Alle löschen" reicht nicht; die Engine stürzt ab, bevor sie das Ende der Liste erreicht. Sie benötigen ein Werkzeug, das die Oberfläche umgeht und direkt auf die Datenbank zugreift oder über die CLI arbeitet.

Nachfolgend finden Sie drei funktionierende Methoden, vom radikalen SQL bis zu sicheren Plugins. Mit einem Backup, mit Präfix-Prüfungen und mit einem Verständnis dafür, was genau in jeder Tabelle passiert.

💡 Kurzer Überblick:

  • Erstellen Sie einen vollständigen Datenbank-Dump; DELETE ist unwiderruflich, es gibt keinen Papierkorb
  • Prüfen Sie das Tabellenpräfix in wp-config.php und ersetzen Sie wp_ entsprechend
  • Führen Sie die SQL-Befehle in Kaskadenreihenfolge aus: Attribute → Produkte → verwaiste Postmeta
  • Wenn Sie SSH haben, erledigt WP-CLI das mit einem einzigen Befehl und feuert die nötigen Hooks
  • Für einen Produktiv-Shop ohne SQL-Erfahrung sind Plugins mit einer „Löschen"-Schaltfläche sicherer

Vorsichtsmaßnahmen: Backup und Präfix

Jeder SQL-Befehl, der den Inhalt von WordPress-Tabellen verändert, ist unwiderruflich. DELETE fragt nicht nach Bestätigung, verschiebt den Datensatz nicht in den Papierkorb; die Zeile verschwindet sofort und dauerhaft. Regel Nummer eins: Erstellen Sie ein vollständiges Datenbank-Backup, bevor Sie eine der folgenden Abfragen ausführen.

Der zuverlässigste Weg ist der Export eines Dumps über phpMyAdmin: der Reiter „Export" → SQL-Format → mit gzip komprimieren. Oder über Ihr Hosting-Panel (cPanel → Backup → Datenbank). Für diejenigen, die auf der Kommandozeile arbeiten:

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

Zweiter Punkt: Alle folgenden Abfragen verwenden das Standardpräfix wp_. Falls Sie das Präfix bei der WordPress-Installation auf wpx_, store_ oder etwas anderes geändert haben, ersetzen Sie wp_ in jedem Befehl durch Ihr Präfix. Das tatsächliche Präfix steht in wp-config.php, in der Zeile $table_prefix. Geprüft? Dann legen wir los.

Methode 1: SQL-Befehle in phpMyAdmin, volle Kontrolle

Die schnellste und radikalste Methode. Am besten geeignet, wenn Sie Hunderte oder Tausende von Datensätzen in einem Durchlauf löschen müssen und die Standard-WooCommerce-Oberfläche in einen Timeout läuft. Alle Abfragen werden in phpMyAdmin auf dem Reiter „SQL" ausgeführt, eine nach der anderen, in strikter Reihenfolge.

WooCommerce-Attribute löschen

Attribute leben gleichzeitig in drei Tabellen: wp_terms, wp_term_taxonomy und wp_term_relationships. Sie unterscheiden sich von normalen Kategorien und Schlagwörtern durch das Präfix pa_ im Feld taxonomy, kurz für „product attribute". Sie müssen sie kaskadierend löschen, beginnend mit den Terms und endend mit den Verknüpfungen:

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);

Die erste Abfrage löscht die Attributnamen aus wp_terms. Die zweite entfernt deren Taxonomie-Einträge aus wp_term_taxonomy. Die dritte bereinigt verwaiste „Term-Objekt"-Verknüpfungen aus wp_term_relationships, die ohne übergeordnete Taxonomie zurückgeblieben sind. Die Reihenfolge ist entscheidend: Löschen Sie die Taxonomie vor den Terms, erfasst die dritte Abfrage zu viel.

WooCommerce-Produkte löschen

Produkte und ihre Varianten sind Datensätze mit dem Typ product und product_variation in der Tabelle wp_posts. Aber einfach Zeilen aus wp_posts zu entfernen, reicht nicht: Metadaten bleiben in wp_postmeta (Preis, SKU, Versandeinstellungen) und Term-Verknüpfungen bleiben in wp_term_relationships (Kategorien, Schlagwörter). Drei Abfragen, kaskadierend:

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');

Zuerst lösen wir die Verknüpfungen des Produkts mit Taxonomien, dann löschen wir die Metadaten und erst danach den Produktdatensatz selbst. Kehren Sie die Reihenfolge um und löschen zuerst wp_posts, liefern die Unterabfragen SELECT ID FROM wp_posts im zweiten und dritten Schritt eine leere Menge, und die Metadaten sowie Verknüpfungen bleiben als Ballast in der Datenbank zurück.

Verwaiste Postmeta bereinigen

Nach allen Löschvorgängen per SQL lohnt sich die Prüfung, ob wp_postmeta Zeilen enthält, die auf nicht existierende Beiträge verweisen. Das passiert bei abgebrochenen Transaktionen, fehlerhaften Importen oder wenn Beiträge ohne Kaskadierung gelöscht wurden:

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

Die Abfrage findet alle wp_postmeta-Zeilen, die keinen übergeordneten Datensatz in wp_posts haben, und löscht sie. Sie ist ungefährlich: Sie berührt keine aktiven Daten, nur Datenmüll.

Methode 2: WP-CLI, schnell und ohne phpMyAdmin

Wenn Sie SSH-Zugriff auf den Server haben, erledigt WP-CLI die Massenlöschung eleganter als jede SQL-Abfrage. Ein Befehl, und WooCommerce geht selbstständig durch die verknüpften Tabellen und hinterlässt keine verwaisten Daten:

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

Das Flag --per_page=-1 exportiert die IDs aller Produkte ohne Paginierung. --force überspringt den Papierkorb und löscht dauerhaft. Bei mehr als 10.000 Produkten ist es besser, in Stapeln von 500 zu arbeiten, um Speicherlimits zu vermeiden:

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

Um Attribute per WP-CLI zu löschen, verwenden Sie:

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

Der Hauptvorteil von WP-CLI gegenüber reinem SQL besteht darin, dass es die internen Hooks von WooCommerce auslöst, before_delete_post und after_delete_post. Dadurch erhalten Caching- und Such-Plugins (Elasticsearch, Redis, Relevanssi) die Gelegenheit, ihre Indizes zu bereinigen. SQL-Abfragen tun dies nicht; danach kann die Suche noch eine Zeit lang bereits gelöschte Produkte zurückliefern.

Methode 3: Plugins, wenn Sie die Datenbank nicht anfassen möchten

Für diejenigen, denen die Kommandozeile und phpMyAdmin zu riskant sind, bietet der Markt spezialisierte Plugins. Sie arbeiten auf Basis derselben SQL-Abfragen, verbergen diese jedoch hinter einer Schaltfläche.

Delete All Products for WooCommerce ist ein kostenloses Plugin aus dem offiziellen WordPress.org-Repository. Es fügt dem Admin-Bereich eine einzige Schaltfläche hinzu. Klicken → „In den Papierkorb verschieben" oder „Endgültig löschen" wählen → bestätigen. Minimale Schritte, kein Risiko eines SQL-Tippfehlers. Der Nachteil: Es funktioniert nur mit Produkten, Attribute werden nicht berührt.

WooCommerce Store Toolkit (auch bekannt als Store Toolkit for WooCommerce) ist eine umfassendere Option. Es bereinigt nicht nur Produkte und Attribute, sondern auch Bestellungen, Gutscheine, Sitzungen und Transients, mit Filtern nach Datum und Status. Geeignet für eine vollständige Tiefenreinigung des Shops vor einem Relaunch.

Für welches Plugin Sie sich auch entscheiden, die Backup-Regel gilt weiterhin. Ein Plugin führt dieselben DELETE-Abfragen aus; Sie sehen sie nur nicht.

Methodenvergleich: Was Sie wann wählen sollten

Methode

Geschwindigkeit

Sicherheit

Flexibilität

Gedacht für

SQL in phpMyAdmin

Sofort

Gering, kein Schutz vor Fehlern

Volle Kontrolle über Tabellen

Entwickler, Server-Administratoren

WP-CLI

Schnell, Sekunden

Hoch, Hooks und Kaskadierung

Praktische Flags und Paginierung

Entwickler, DevOps

Plugins

Langsam, Hunderte pro Minute

Maximal, UI-basiert

Auf Plugin-Funktionalität beschränkt

Shop-Betreiber

Wenn Sie ein Produkt oder ein Dutzend haben, genügt die WooCommerce-Oberfläche „Produkte → auswählen → Löschen". Hunderte oder Tausende verlangen nach SQL oder WP-CLI. Ein produktiver Live-Shop, bei dem kein Raum für Fehler ist, verlangt nach einem Plugin oder WP-CLI.

Wichtige Einschränkungen: was nicht gelöscht wird

Die Massenlöschung von Produkten und Attributen per SQL erfasst keine Mediendateien. Produktbilder, die in die WordPress-Mediathek hochgeladen wurden (Datensätze mit post_type = 'attachment'), bleiben sowohl im Dateisystem als auch in der Datenbank erhalten. Wenn Sie den Katalog von Grund auf neu aufbauen und Speicherplatz auf Ihrem Hosting freigeben möchten, müssen die Mediendateien separat bereinigt werden: über „Medien → auswählen → Endgültig löschen" oder per WP-CLI:

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

SQL-Befehle aktualisieren auch nicht die WooCommerce-Zähler (Produktanzahlen pro Kategorie), die in wp_termmeta und wp_options als Transients mit dem Präfix _wc_term_counts_ zwischengespeichert werden. Nach einer Massenlöschung kann das Admin-Panel vorübergehend falsche Produktanzahlen pro Kategorie anzeigen. Dies lässt sich durch eine Neuberechnung beheben:

1wp wc tool run recount_terms

Oder über das Plugin Recount Terms aus dem Repository.

Das Video bietet eine Schritt-für-Schritt-Anleitung für SQL-Befehle zum Löschen von WooCommerce-Attributen in phpMyAdmin: Navigation durch die Tabellen und Überprüfung der Ergebnisse nach jeder Abfrage.

⁉️🤔 Häufig gestellte Fragen

Ist es sicher, Produkte per SQL in einem Live-Shop zu löschen?

In einem Produktiv-Shop ist die Verwendung von rohem SQL für Massenlöschungen eine riskante Praxis. Ein einziger Tippfehler in einem Tabellennamen oder einer WHERE-Klausel kann Bestellungen, Benutzer oder Einstellungen beeinträchtigen. Wenn der Shop live ist und Umsatz generiert, nutzen Sie WP-CLI oder Plugins, die Sie vor folgenschweren Fehlern bewahren. Heben Sie SQL für Entwicklungsumgebungen, Staging und Situationen auf, in denen die Admin-Oberfläche bereits nicht mehr lädt.

Warum sind Produkte nach der SQL-Löschung noch in der Seitensuche sichtbar?

Such-Plugins (Relevanssi, Elasticsearch, SearchWP) pflegen ihren eigenen Index, der nicht aktualisiert wird, wenn wp_posts unter Umgehung der WordPress-API direkt manipuliert wird. Nach der Bereinigung per SQL müssen Sie den Suchindex in den Plugin-Einstellungen oder per WP-CLI neu aufbauen: zum Beispiel wp relevanssi index --reindex.

Wie lösche ich nur Produkte aus einer bestimmten Kategorie, nicht alle?

Fügen Sie einen Filter nach der term_taxonomy_id der gewünschten Kategorie hinzu. Der Ansatz: Ermitteln Sie die term_id der Kategorie → finden Sie die term_taxonomy_id in wp_term_taxonomy → filtern Sie die object_id in wp_term_relationships, bevor Sie aus wp_posts löschen. In der Praxis ist es einfacher, WP-CLI zu verwenden: wp wc product list --category=slug-kategorii --field=ID | xargs wp wc product delete --force.

Können Produkte nach der SQL-Löschung wiederhergestellt werden?

Nur aus einem Backup. Anders als beim Löschen über den WordPress-Papierkorb (In den Papierkorb legen) entfernt der SQL-Befehl DELETE Zeilen physisch und irreversibel. Genau deshalb wird die Regel „Backup zuerst" in jedem Abschnitt dieses Artikels wiederholt. Zwei Minuten für einen Dump sparen Stunden bei der Wiederherstellung.

Was ist der Unterschied zwischen dem Löschen von Attributen und dem Löschen von Variationen?

Variationen sind ein Untertyp von Produkten (product_variation). Sie werden mit denselben SQL-Befehlen gelöscht wie einfache Produkte: Die Bedingung post_type IN ('product','product_variation') im zweiten Block von „Methode 1" schließt Variationen bereits ein. Attribute (pa_color, pa_size) sind Taxonomien; sie werden separat gelöscht, durch den ersten Block der SQL-Befehle. Die richtige Reihenfolge lautet: zuerst Produkte (einschließlich Variationen), dann Attribute. Bei umgekehrter Reihenfolge verlieren Variationen ihre Attributbindungen, aber die Variationsdatensätze selbst bleiben in der Datenbank erhalten.

Was Sie 2026 verwenden sollten: das Fazit

SQL-Befehle, WP-CLI und Plugins sind drei Werkzeuge mit unterschiedlichem Risikograd für eine Aufgabe. Die Wahl läuft auf eine einfache Matrix hinaus:

  • Sie haben SSH und Erfahrung mit der Kommandozeile → WP-CLI (wp wc product delete). Sicher, schnell, mit Hooks.
  • Kein SSH, aber Sie haben phpMyAdmin und verstehen das Tabellenschema → SQL. Volle Kontrolle, sofortige Ergebnisse. Aber Backup zuerst.
  • Sie wollen kein Risiko → Delete All Products oder Store Toolkit. Langsamer, aber ein Button statt einer SQL-Abfrage.

In jedem Szenario ist ein Datenbank-Backup die erste Maßnahme. Beginnen Sie nicht ohne.

🔗 Delete All Products for WooCommerce, kostenlos auf WordPress.org🔗 WooCommerce Store Toolkit, erweiterte Shop-Bereinigung