WP-Sweep

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.

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. Gib false zurü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. $context ist entweder sweep, ajax oder rest.
  • 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

  1. Installiere und aktiviere das Plugin. Die Ansicht erscheint unter WP-Administration -> Werkzeuge -> WP-Sweep.
  2. 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.php zu tools.php?page=wp-sweep geä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.0 entpackt. 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:

  • WPSweep wurde zu WP_Sweep
  • WPSweep_Api wurde zu WP_Sweep_API
  • WPSweep_Command wurde zu WP_Sweep_Command

Aus WPSweep::get_instance()->sweep( 'revisions' ) wird somit WP_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_whitelist und wp_sweep_termmeta_whitelist. Begriffe werden über wp_sweep_excluded_termids geschützt und Taxonomien werden mit wp_sweep_excluded_taxonomies von 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, und LIKE behandelt einen Unterstrich als Ein-Zeichen-Platzhalter. Ein Muster wie _my_key passte daher auch auf Xmy!key und 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.php wird dennoch ausgeführt und bereinigt das gesamte Netzwerk, anstatt nur die ersten hundert Websites.

Rezensionen

WP-Sweep is a simple yet powerful plugin that helps keep your WordPress site running smoothly. It cleans up unnecessary data like post revisions, trashed posts, spam comments, unused terms, and more — all using native WordPress functions, which makes it safer than many alternatives. We’ve used WP-Sweep on multiple websites and it’s never caused any issues. It’s lightweight, user-friendly, and does exactly what it promises. The interface is clear and makes it easy to choose what to clean. Highly recommended for anyone looking to optimize their WordPress database without the risk of breaking anything.
22. Januar 2025
great and simple plugin, no licence shit – it just works, thanks!
Alle 139 Rezensionen lesen

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 Filter wp_sweep_defer_counts stellt 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_CONCAT in 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_id in wp_posts suchte – was nur dann zutrifft, wenn die Taxonomie zu Beiträgen gehört. Bei einer für Benutzer oder Kommentare registrierten Taxonomie ist die object_id eine Benutzer- oder Kommentar-ID, weshalb jeder Bezug, dessen ID höher als die Beitragsanzahl war, gelöscht wurde, obwohl der Benutzer noch existierte. link_category wurde 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_whitelist hinzugefü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 TABLES ohne 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ührte OPTIMIZE TABLE für Installationen aus, die dieser Administrator gar nicht verwaltet. Dies ist nun auf das Präfix dieser Installation beschränkt, mit wp_sweep_optimize_tables fü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.php zu tools.php?page=wp-sweep geändert. Das alte Format setzte den Namen des Installationsverzeichnisses in die URL.
  • BREAKING: Die Klassen wurden umbenannt: WPSweep -> WP_Sweep, WPSweep_Api -> WP_Sweep_API und WPSweep_Command -> WP_Sweep_Command. Alle Filter und Aktionen behalten ihre Namen bei.
  • BREAKING: WP_Sweep::$limit_details wurde entfernt. Lies den Wert mit limit_details() aus und passe ihn über den Filter wp_sweep_limit_details an.
  • 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 Bereinigen an – 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_capability und wp_sweep_limit_details. WP-Sweep hat keine Einstellungsansicht: Über wp_sweep_limit_details wird 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-LIKE abgeglichen, 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-sweep installiert ist.
  • FEHLERBEHEBUNG: Das Filtern von wp_sweep_excluded_termids auf 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äßig default_link_category mit 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 sweep ausgegebenen Meldungen „Bereinigung abgeschlossen“ waren die einzigen Zeichenfolgen im Plugin, die nie an die Übersetzungsfunktionen übergeben wurden