Beschreibung
WP-Sweep findet Zeilen, die WordPress hinterlässt, und entfernt sie. Revisionen von Beiträgen, die du vor Jahren bearbeitet hast, Metadaten gelöschter Beiträge, Begriffe ohne Verknüpfung, Begriffsbezugsdaten zu nicht mehr existierenden Beiträgen, abgelaufene Transienten: Nichts davon ist in der WP-Administration sichtbar, doch befindet sich all das in deiner Datenbank.
Es nutzt die regulären WordPress-Löschfunktionen, wo immer diese auf die entsprechende Zeile zurückgreifen können, anstatt reine DELETE-Abfragen auszuführen, sodass Hooks, auf die sich andere Plugins verlassen, weiterhin ausgelöst werden. Nur Zeilen, die die API nicht verarbeiten kann – verwaiste Metadaten mit der Objekt-ID 0 –, werden direkt gelöscht.
Funktionen
- Revisionen
- Automatische Entwürfe
- Gelöschte Beiträge
- Nicht freigegebene Kommentare
- Spam-Kommentare
- Gelöschte Kommentare
- Verwaiste Beitragsmetadaten
- Verwaiste Kommentarmetadaten
- Verwaiste Benutzermetadaten
- Verwaiste Begriffsmetadaten
- Verwaiste Begriffsbezugsdaten
- Ungenutzte Begriffe
- Doppelte Beitragsmetadaten
- Doppelte Kommentarmetadaten
- Doppelte Benutzermetadaten
- Doppelte Begriffsmetadaten
- Transient-Optionen
- oEmbed-Caches in Beitragsmetadaten
- Optimiert Datenbanktabellen
Verwendete Löschfunktionen
wp_delete_post_revision()wp_delete_post()wp_delete_comment()delete_post_meta()delete_comment_meta()delete_user_meta()delete_term_meta()wp_remove_object_terms()wp_delete_term()delete_transient()delete_site_transient()
Bekannte Inkompatibilitäten
Diese Plugins speichern Daten an Stellen, die WP-Sweep als verwaist erkennt. Schütze deren Metaschlüssel mit den Filtern unter „Verwendung“ vor der Bereinigung.
- Custom Fonts
- Elementor Popup Builder
- MailPress
- Meta Slider
- Polylang
- Slider Revolution
- Viba Portfolio
- WPML
Spenden
Ich verbringe den größten Teil meiner Freizeit damit, diese Plugins zu erstellen, zu aktualisieren, zu pflegen und zu unterstützen. Wenn du meine Plugins wirklich magst und mir ein paar Taler erübrigen könntest, würde ich mich sehr darüber freuen. Du kannst sie gerne ohne jegliche Verpflichtung verwenden.
Verwendung
Jede Bereinigung ist unumkehrbar; erstelle daher bitte zuerst ein Backup deiner Datenbank.
Die Ansicht listet jede Bereinigung mit einer kurzen Beschreibung dessen auf, was jeweils entfernt wird, um wie viele Einträge es sich handelt und welchen Anteil sie an der Tabelle ausmachen. Wähle die gewünschten Einträge aus und verwende die Mehrfachaktion Bereinigen, oder nutze die Buttons Bereinigen und Details in den einzelnen Zeilen. Nichts in dieser Ansicht benötigt JavaScript: Die Buttons sind normale Links und die Mehrfachaktion ist ein reguläres Formular.
Es gibt keine Einstellungsansicht. Die einzige Option, die es sich lohnt anzupassen – wie viele Einträge Details auflistet, standardmäßig 500 – ist der Filter wp_sweep_limit_details. Diese Begrenzung existiert, da die gesamte Liste im Arbeitsspeicher gehalten und in die Seite geschrieben wird.
WP-CLI
wp sweep --all
wp sweep revisions
wp sweep revisions auto_drafts deleted_posts
REST-API
Alle drei Routen erfordern die Berechtigung activate_plugins.
GET /wp-json/sweep/v1/count/<name>
GET /wp-json/sweep/v1/details/<name>
DELETE /wp-json/sweep/v1/sweep/<name>
Elementbezeichnungen
revisions, `auto_drafts`, `deleted_posts`, `unapproved_comments`, `spam_comments`, `deleted_comments`, `transient_options`, `orphan_postmeta`, `orphan_commentmeta`, `orphan_usermeta`, `orphan_termmeta`, `orphan_term_relationships`, `unused_terms`, `duplicated_postmeta`, `duplicated_commentmeta`, `duplicated_usermeta`, `duplicated_termmeta`, `optimize_database`, `oembed_postmeta`.
Filter
wp_sweep_postmeta_whitelist(Array) – Beitrags-Metaschlüssel, die bei der Bereinigung verwaister oder doppelter Beitragsmetadaten keinesfalls gelöscht werden dürfen.*steht für eine beliebige Zeichenfolge. Standard: leer.wp_sweep_commentmeta_whitelist(Array) – dasselbe für Kommentarmetadaten.wp_sweep_usermeta_whitelist(Array) – dasselbe für Benutzermetadaten.wp_sweep_termmeta_whitelist(Array) – dasselbe für Begriffsmetadaten.wp_sweep_excluded_taxonomies(Array) – Taxonomien, die bei der Bereinigung verwaister Begriffsbezugsdaten nicht berücksichtigt werden sollen. Standard:array( 'link_category' ).wp_sweep_excluded_termids(Array) – Begriffs-IDs, die bei der Bereinigung ungenutzter Begriffe ausgenommen werden. Standard: der Standardbegriff jeder Taxonomie sowie jeder Begriff, der einem anderen übergeordnet ist.wp_sweep_limit_details(Ganzzahl) – wie viele Einträge eine Detailliste anzeigt. Standard: 500.wp_sweep_defer_counts(Boolean) – legt fest, ob die Bereinigungsansicht zuerst dargestellt wird und die Zählerstände danach einzeln abgerufen werden. Gibfalsezurück, damit alle Zählerstände zusammen mit der Seite berechnet werden, wie es in den Versionen vor 2.0.1 immer der Fall war. Standard:true.wp_sweep_capability(Zeichenfolge$capability, Zeichenfolge$context) – die erforderliche Berechtigung.$contextist entwedersweep,ajaxoderrest.wp_sweep_total_count(Ganzzahl$count, Zeichenfolge$name) – die Gesamtzahl der Zeilen, anhand derer der Prozentsatz einer Bereinigung ermittelt wird.wp_sweep_count(Ganzzahl$count, Zeichenfolge$name) – wie viele Einträge eine Bereinigung entfernen würde.wp_sweep_details(Array$details, Zeichenfolge$name) – die unter „Details“ angezeigte Liste.wp_sweep_sweep(Zeichenfolge$message, Zeichenfolge$name) – die nach Ausführung einer Bereinigung ausgegebene Meldung.
Aktionen
wp_sweep_admin_post_sweep, `wp_sweep_admin_comment_sweep`, `wp_sweep_admin_user_sweep`, `wp_sweep_admin_term_sweep`, `wp_sweep_admin_option_sweep` and `wp_sweep_admin_database_sweep` all fire below the sweep table, in that order.
Bestimmte Beitrags-Metaschlüssel vor der Bereinigung schützen:
add_filter( 'wp_sweep_postmeta_whitelist', function ( $meta_keys ) {
$meta_keys[] = '_my_plugin_setting';
$meta_keys[] = '_acme_*';
return $meta_keys;
} );
Eine zusätzliche Taxonomie von der Bereinigung verwaister Begriffsbezugsdaten ausschließen:
add_filter( 'wp_sweep_excluded_taxonomies', function ( $taxonomies ) {
$taxonomies[] = 'product_type';
return $taxonomies;
} );
Screenshots



Installation
- Installiere und aktiviere das Plugin. Die Ansicht erscheint unter
WP-Administration -> Werkzeuge -> WP-Sweep. - Erstelle ein Backup deiner Datenbank, bevor du etwas bereinigst. Jede Bereinigung ist unumkehrbar und kann nicht rückgängig gemacht werden.
FAQ
-
Die Ansicht „Werkzeuge -> WP-Sweep“ hat eine neue Adresse
-
Der Menüpunkt befindet sich weiterhin unter Werkzeuge, die Adresse hat sich jedoch von
tools.php?page=wp-sweep/admin.phpzutools.php?page=wp-sweepgeändert. Bitte passe gegebenenfalls deine Lesezeichen entsprechend an.Die alte Adresse nutzte das veraltete Format „Plugin-Datei als Menütitelform“, wodurch der Name des Plugin-Installationsverzeichnisses in die Seiten-URL eingefügt wurde. Aus diesem Grund führte die Ansicht früher zu Fehlern bei allen, die WP-Sweep unter einem abweichenden Verzeichnisnamen installiert hatten – sei es manuell umbenannt oder als
wp-sweep-2.0.0entpackt. Beides tritt nun nicht mehr auf. -
Wo ist „Alles bereinigen“ geblieben?
-
Jede Zeile verfügt über ein Kontrollkästchen und die Tabelle bietet die Mehrfachaktion Bereinigen. Die Auswahl des Kontrollkästchens in der Kopfzeile und dessen Ausführung bewirkt also dasselbe wie „Alles bereinigen“ – und es ermöglicht dir, unerwünschte Zeilen abzuwählen.
-
Mein Snippet, das WPSweep::get_instance() aufruft, funktioniert nicht mehr
-
Die Klassen wurden in 2.0.0 umbenannt:
WPSweepwurde zuWP_SweepWPSweep_Apiwurde zuWP_Sweep_APIWPSweep_Commandwurde zuWP_Sweep_Command
Aus
WPSweep::get_instance()->sweep( 'revisions' )wird somitWP_Sweep::get_instance()->sweep( 'revisions' ). Es gibt keinen Kompatibilitätsalias, weshalb der alte Name einen fatalen Fehler auslöst, anstatt stillschweigend fehlzuschlagen.Alle Filter und alle
wp_sweep_admin_*_sweep-Aktionen behalten ihre bisherigen Namen bei. -
Welche Filter kann ich verwenden, um Daten vor der Bereinigung zu schützen?
-
Vier typspezifische Filter akzeptieren eine Liste von Metaschlüsseln, die keinesfalls gelöscht werden dürfen, und jeder davon unterstützt
*als Platzhalter:add_filter( 'wp_sweep_postmeta_whitelist', function ( $keys ) { $keys[] = '_my_plugin_setting'; $keys[] = '_acme_*'; return $keys; } );Dasselbe gilt für
wp_sweep_commentmeta_whitelist,wp_sweep_usermeta_whitelistundwp_sweep_termmeta_whitelist. Begriffe werden überwp_sweep_excluded_termidsgeschützt und Taxonomien werden mitwp_sweep_excluded_taxonomiesvon der Bereinigung verwaister Begriffsbezugsdaten ausgeschlossen.In der Version 2.0.0 schützen diese Listen auch die Bereinigungen doppelter Metadaten – was laut Dokumentation zwar schon immer der Fall sein sollte, im Quellcode jedoch nie umgesetzt war.
-
Ein geschützter Schlüssel wurde trotzdem bereinigt oder es wurde zu viel beibehalten
-
Vor der Version 2.0.0 handelte es sich bei dem Ausschluss um eine SQL-Klausel
LIKE, undLIKEbehandelt einen Unterstrich als Ein-Zeichen-Platzhalter. Ein Muster wie_my_keypasste daher auch aufXmy!keyund einiges mehr. Der Abgleich erfolgt nun in PHP, sodass ein Unterstrich ein Unterstrich ist und nur*als Platzhalter dient. Überprüfe deine Liste, falls du dich auf das alte Verhalten verlassen hast. -
Bleibt etwas von WP-Sweep zurück, wenn ich es lösche?
-
Nichts. WP-Sweep speichert keine Optionszeilen, erstellt keine Datenbanktabellen, registriert keine Berechtigungen und plant keine Ereignisse.
uninstall.phpwird dennoch ausgeführt und bereinigt das gesamte Netzwerk, anstatt nur die ersten hundert Websites.
Rezensionen
Mitwirkende und Entwickler
„WP-Sweep“ ist Open-Source-Software. Folgende Menschen haben an diesem Plugin mitgewirkt:
Mitwirkende„WP-Sweep“ wurde in 23 Sprachen übersetzt. Danke an die Übersetzer für ihre Mitwirkung.
Übersetze „WP-Sweep“ in deine Sprache.
Interessiert an der Entwicklung?
Durchstöbere den Code, sieh dir das SVN-Repository an oder abonniere das Entwicklungsprotokoll per RSS.
Änderungsprotokoll
2.0.1
- NEU: Ein „Bereinigen“-Link in der Zeile des Plugins in der Plugins-Ansicht, der „Werkzeuge -> WP-Sweep“ öffnet.
- FEHLERBEHEBUNG: Die Bereinigungsansicht lief bei großen Datenbanken in eine Zeitüberschreitung. In der Version 2.0.0 wurde jede Zählung vor der Ausgabe eines Bytes berechnet – und die Gesamtzeilenzahl jeder Tabelle wurde nicht einmalig, sondern einmal pro Zeile abgefragt, sodass
SELECT COUNT(*)pro Ladevorgang viermal für die „postmeta“-Tabelle ausgeführt wurde. Die Ansicht wird nun sofort dargestellt und die Zählerwerte werden anschließend nacheinander abgerufen, sodass keine einzelne Anfrage das PHP-Zeitlimit überschreitet. Ohne JavaScript berechnet ein Link diese Werte wie in der Version 2.0.0 bereits üblich zusammen mit der Seite, und der neue Filterwp_sweep_defer_countsstellt dieses Verhalten vollständig wieder her. - FEHLERBEHEBUNG: Bei der Zählung für die Bereinigungen doppelter Metadaten wurden die IDs jeder doppelten Zeile über
GROUP_CONCATin PHP abgerufen, nur um sie zu addieren. Bei einer „postmeta“-Tabelle mit Millionen von Duplikaten hätte dies allein schon die Ressourcen für die Anfrage überlasten können. Die Zählung erfasst nun nur noch die Gesamtsummen pro Schlüssel. Die IDs werden dort ausgelesen, wo sie benötigt werden, nämlich bei der Bereinigung, die sie löscht.
2.0.0
- FEHLERBEHEBUNG: Die Bereinigung ungenutzter Begriffe las „unused“ aus der Spalte „count“ aus, und der Core-eigene Zähler zählt veröffentlichte Beiträge – ein Begriff, der nur in Entwürfen, ausstehenden Beiträgen, privaten Beiträgen oder Beiträgen im Papierkorb verwendet wurde, wies daher einen Zählerstand von null auf und wurde mitsamt seinen Bezugsdaten gelöscht. Diese Beiträge blieben ohne ersichtlichen Grund ohne Schlagwörter zurück. Ein Begriff darf nun mit absolut nichts mehr verknüpft sein
- FEHLERBEHEBUNG: Die Bereinigung von Begriffen einer Taxonomie, die von nichts mehr registriert wird, endete mit
DELETE FROM wp_terms WHERE term_id NOT IN ( SELECT term_id FROM wp_term_taxonomy ). Dies betraf jede verwaiste Zeile in der Tabelle statt nur jener, die durch die Bereinigung gerade verwaist waren. Zeilen, die in der Ansicht weder gezählt noch aufgeführt worden waren, wurden mitgelöscht. Nun werden genau die Begriffe benannt, die es verwaist hinterlassen hat - FEHLERBEHEBUNG: Die Bereinigung verwaister Begriffsbezugsdaten stufte eine Zeile als verwaist ein, indem sie nach deren
object_idinwp_postssuchte – was nur dann zutrifft, wenn die Taxonomie zu Beiträgen gehört. Bei einer für Benutzer oder Kommentare registrierten Taxonomie ist dieobject_ideine Benutzer- oder Kommentar-ID, weshalb jeder Bezug, dessen ID höher als die Beitragsanzahl war, gelöscht wurde, obwohl der Benutzer noch existierte.link_categorywurde genau aus diesem Grund manuell ausgeschlossen. Der Ausschluss wird nun daraus abgeleitet, wofür die jeweilige Taxonomie registriert ist - FEHLERBEHEBUNG: Die oEmbed-Bereinigung prüfte auf
%_oembed_%, und in einem LIKE-Muster entspricht ein Unterstrich einem beliebigen Einzelzeichen – dies bedeutete also „jeder Metaschlüssel, der oembed mit jeweils einem beliebigen Zeichen davor und danach enthält“, und war somit eine Enthält– statt einer Präfix-Übereinstimmung. Schlüssel anderer Plugins wurden zusammen mit den Caches unwiderruflich gelöscht. WordPress speichert diese als_oembed_{hash}, daher ist das Muster nun am Anfang verankert und die Unterstriche sind maskiert - FEHLERBEHEBUNG: Die oEmbed-Bereinigung war die einzige Meta-Bereinigung, die die Liste geschützter Schlüssel nie berücksichtigte, sodass ein von einer Website explizit zu
wp_sweep_postmeta_whitelisthinzugefügter Schlüssel dennoch gelöscht wurde – die Liste wurde dafür sogar eingelesen und anschließend ignoriert - FEHLERBEHEBUNG: Die Optimierung der Datenbank führte
SHOW TABLESohne Präfix aus, was jede Tabelle im Schema betraf. Bei einer von mehreren Installationen gemeinsam genutzten Datenbank – eine übliche Hosting-Konfiguration – listete die Detailansicht die Tabellen aller Mandanten auf und die Bereinigung führteOPTIMIZE TABLEfür Installationen aus, die dieser Administrator gar nicht verwaltet. Dies ist nun auf das Präfix dieser Installation beschränkt, mitwp_sweep_optimize_tablesfür Websites, die mehr einschließen möchten - BREAKING: Erfordert WordPress 6.8 und PHP 8.2.
- BREAKING: Die Ansicht verbleibt unter Werkzeuge, aber ihre Adresse hat sich von
tools.php?page=wp-sweep/admin.phpzutools.php?page=wp-sweepgeändert. Das alte Format setzte den Namen des Installationsverzeichnisses in die URL. - BREAKING: Die Klassen wurden umbenannt:
WPSweep->WP_Sweep,WPSweep_Api->WP_Sweep_APIundWPSweep_Command->WP_Sweep_Command. Alle Filter und Aktionen behalten ihre Namen bei. - BREAKING:
WP_Sweep::$limit_detailswurde entfernt. Lies den Wert mitlimit_details()aus und passe ihn über den Filterwp_sweep_limit_detailsan. - BREAKING: Die sechs
wp_sweep_admin_*_sweep-Aktionen werden unterhalb der einzelnen Bereinigungstabelle in gewohnter Reihenfolge ausgelöst, statt unterhalb von sechs separaten Tabellen. - BREAKING: „Alles bereinigen“ wurde entfernt. Aktiviere stattdessen das Kontrollkästchen in der Kopfzeile und wende die Mehrfachaktion
Bereinigenan – dies bewirkt dasselbe und erlaubt das Abwählen einzelner Zeilen. - NEU: Die Mehrfachbereinigung. Wähle die gewünschten Bereinigungen aus und führe sie in einem Durchgang aus, anstatt jeden Eintrag einzeln anzuklicken.
- NEU: Die Bereinigungen sind in der Ansicht gruppiert. Die ungefilterte Ansicht ordnet jede Bereinigung unter einer Überschrift mit Icon ein – Beitrag, Kommentar, Benutzer, Begriff, Option, Datenbank –, bleibt jedoch eine einzige Tabelle, sodass eine Mehrfachbereinigung weiterhin alles Ausgewählte ausführt. Bei der Sortierung einer Spalte werden die Überschriften ausgeblendet, anstatt Zeilen zu beschreiben, die nicht mehr gruppiert sind.
- NEU: Gruppenfilter und sortierbare Spalten basierend auf einer echten
WP_List_Table. - NEU: Die gesamte Ansicht funktioniert auch bei deaktiviertem JavaScript. Die Zeilenaktionen sind gewöhnliche Nonce-gesicherte Links und die Mehrfachaktion ist ein regulärer Formular-POST.
- NEU: Die Freigabelisten für Metaschlüssel schützen sowohl die Bereinigung doppelter als auch verwaister Metadaten, wie es die Readme schon immer behauptete und der Quellcode nie tat.
- NEU: Die Filter
wp_sweep_capabilityundwp_sweep_limit_details. WP-Sweep hat keine Einstellungsansicht: Überwp_sweep_limit_detailswird die Grenze der Detailliste geändert. - NEU: Zu jeder Bereinigung wird unter dem Namen eine Beschreibung angezeigt, was dabei entfernt wird, und handlungsrelevante Anzahlen werden hervorgehoben.
- NEU: Eine
uninstall.php, die über das gesamte Netzwerk hinweg aufräumt, statt nur auf den ersten hundert Websites. WP-Sweep selbst speichert nichts: keine Optionszeilen, keine Tabellen, keine Berechtigungen und keine geplanten Ereignisse. - NEU: Gemäß dem Plugin-Handbuch in
includes/umstrukturiert. - NEU: PHPUnit- und vitest-Suites sowie GitHub-Actions-CI über sechs Kombinationen aus WordPress und PHP, Einzel-Website und Multisite.
- GEÄNDERT: Ausschlüsse von Metaschlüsseln werden in PHP statt mit SQL-
LIKEabgeglichen, sodass ein Unterstrich in einem geschützten Schlüssel ein Unterstrich und kein Platzhalter ist. - GEÄNDERT: Jeder Datenbankaufruf erfolgt über eine einzige Methode und jede Abfrage wird vorbereitet.
- FEHLERBEHEBUNG: Stored-XSS in der Administrations-Ansicht. Die Detailliste wurde durch Verknüpfung von Zeichenfolgen erstellt und als HTML eingefügt, wodurch der Name eines Kommentarautors mit Markup als Skript im Browser des Administrators ausgeführt wurde.
- FEHLERBEHEBUNG: Das Plugin generiert Pfade nicht mehr aus seinem eigenen Verzeichnisnamen, sodass das Administrations-Skript auch dann geladen wird, wenn es unter einem anderen Verzeichnis als
wp-sweepinstalliert ist. - FEHLERBEHEBUNG: Das Filtern von
wp_sweep_excluded_termidsauf ein leeres Array erzeugte ungültiges SQL, wodurch die Anzahl ungenutzter Begriffe leer blieb. - FEHLERBEHEBUNG: Ein Begriff wurde von der Bereinigung ungenutzter Begriffe ausgeschlossen, sobald seine ID mit einer
default_<taxonomy>-Option übereinstimmte, selbst wenn diese Option auf einen nicht mehr existierenden Begriff verwies. WordPress liefert standardmäßigdefault_link_categorymit dem Wert 2 aus, weshalb auf den meisten Websites der Begriff mit der ID 2 stillschweigend nicht bereinigt wurde. - FEHLERBEHEBUNG: Bereinigungen ohne JavaScript löschten Daten und zeigten nichts an; das Ergebnis wird nun dargestellt.
- FEHLERBEHEBUNG: Die Multisite-Deinstallationsschleife stoppte bei 100 Websites, initialisierte ganze Website-Objekte zum Auslesen einer einzelnen Spalte und hinterließ den Switch-Stack um eins versetzt.
- FEHLERBEHEBUNG: Anfrageparameter werden bereinigt und anhand der Plugin-eigenen Liste der Bereinigungen validiert.
- FEHLERBEHEBUNG: Die beiden von
wp sweepausgegebenen Meldungen „Bereinigung abgeschlossen“ waren die einzigen Zeichenfolgen im Plugin, die nie an die Übersetzungsfunktionen übergeben wurden
