Mediathek in WordPress aufräumen: ungenutzte Dateien finden und Speicher sparen
Wie Sie den Speicherbedarf der WordPress-Mediathek messen, ungenutzte Anhänge und verwaiste Dateien per WP-CLI-Skript finden, mit Papierkorb sicher löschen und überflüssige Bildgrößen künftig vermeiden.
WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Mehr dazu

Die Mediathek einer WordPress-Website wächst mit jedem Beitrag, jeder Produktseite und jedem Relaunch. Nach einigen Jahren liegen dort Tausende Dateien, von denen ein guter Teil nirgends mehr verwendet wird. Jedes hochgeladene Bild erzeugt zudem mehrere Zwischengrößen, sodass aus einem Foto schnell acht Dateien werden. Das kostet Speicher, verlängert Backups und erschwert die Suche. Diese Anleitung zeigt, wie Sie den Bestand messen, ungenutzte Anhänge und verwaiste Dateien sicher finden, gefahrlos löschen und künftig weniger Ballast erzeugen. Alle Befehle und Skripte liefen im Labor mit WordPress 7.1.2.
Voraussetzungen
- WordPress: eine aktuelle Installation, getestet mit WordPress 7.1.2 in deutscher Sprache.
- PHP: eine von WordPress unterstützte Version, im Labor PHP 8.4.
- Zugriff: Rolle Administrator im Backend. Für die Auswertungen SSH mit WP-CLI, für Must-Use-Plugins und die
wp-config.phpSFTP oder SSH. - Backup: eine vollständige, geprüfte Sicherung von Datenbank und
wp-content/uploads. Das ist hier Pflicht, denn gelöschte Anhänge lassen sich ohne Sicherung nicht zurückholen.
Schritt 1: Bestand und Speicherbedarf messen
Messen Sie vorher, sonst wissen Sie nicht, was das Aufräumen gebracht hat. Auf der Kommandozeile ermitteln Sie die Größe des Uploads-Ordners und die Zahl der Anhänge:
du -sh wp-content/uploads
find wp-content/uploads -type f | wc -l
wp post list --post_type=attachment --format=count
Im Labor lagen nach dem Hochladen von drei Fotos mit 3000 × 2000 Pixeln 24 Dateien mit 9,7 MB im Ordner. Der Grund: WordPress legt zu jedem Bild die registrierten Zwischengrößen an. wp media image-size listet sie auf, im Labor waren das thumbnail (150 Pixel), medium (300), medium_large (768), large (1024), 1536x1536 und 2048x2048. Dazu kommt bei großen Fotos eine verkleinerte Fassung mit dem Zusatz -scaled, das Original bleibt erhalten.
Ohne SSH zeigt Werkzeuge > Website-Zustand, Reiter „Bericht“, Abschnitt „Verzeichnisse und Größen“ die Werte. Notieren Sie sie für den späteren Vergleich.
Verifizieren: Sie kennen Größe und Dateizahl von wp-content/uploads sowie die Zahl der Anhänge in der Datenbank.
Schritt 2: Die Mediathek mit Bordmitteln ordnen
WordPress kennt in der Mediathek keine Ordner. Jede Datei ist ein Anhang in der Datenbank, die Ablage auf dem Server folgt standardmäßig dem Muster uploads/JAHR/MONAT/. Das steuert die Einstellung „Meine Uploads in monats- und jahresbasierten Ordnern organisieren“ unter Einstellungen > Medien. Lassen Sie sie aktiv. Ohne sie landen alle Dateien in einem einzigen Ordner, was bei Tausenden Dateien Backups und FTP-Zugriffe verlangsamt. Die Einstellung wirkt nur auf neue Uploads.
Für die Arbeit im Backend bietet Medien > Mediathek in der Listenansicht mehrere Filter:
- Nach Typ filtern: Bilder, Audio, Video, Dokumente und weitere.
- Datum: nach Monat des Uploads.
- „Nicht verknüpft“: Anhänge, die keinem Beitrag als übergeordnetes Element zugeordnet sind. Die Spalte „Hochgeladen zu“ zeigt die Zuordnung.
- „Meine“: nur eigene Uploads.
Wichtig: „Nicht verknüpft“ heißt nicht „ungenutzt“. Die Zuordnung entsteht nur, wenn eine Datei direkt im Editor eines Beitrags hochgeladen wird. Ein Bild, das Sie in der Mediathek hochladen und dann in zehn Seiten einsetzen, bleibt „nicht verknüpft“. Im Labor waren alle Testbilder nicht verknüpft, obwohl eines als Bild in einem Beitrag und eines als Beitragsbild genutzt wurde.
Ordner-Plugins legen virtuelle Ordner in der Datenbank an, die bei einem Plugin-Wechsel verloren gehen. Oft genügen aussagekräftige Dateinamen und Titel vor dem Upload, etwa team-mueller-2026.jpg statt IMG_4711.jpg, damit die Suche der Mediathek zuverlässig trifft.
Verifizieren: Unter Einstellungen > Medien ist die Ordnung nach Jahr und Monat aktiv, und Sie finden ein bekanntes Bild über Suche und Filter.
Schritt 3: Ungenutzte Anhänge finden
WordPress führt kein Verzeichnis darüber, wo ein Bild verwendet wird. Ein Bild kann im Beitragsinhalt stecken, als Beitragsbild gesetzt sein, im Customizer als Logo oder Website-Icon dienen oder von einem Plugin in eigenen Tabellen referenziert werden. Das folgende Skript prüft die drei häufigsten Stellen und löscht nichts, es listet nur Kandidaten. Speichern Sie es als unbenutzte-medien.php außerhalb des Webroots.
<?php
// Anhänge ohne erkennbare Verwendung auflisten (nur Anzeige, löscht nichts)
global $wpdb;
$ids = get_posts( array( 'post_type' => 'attachment', 'post_status' => 'inherit', 'numberposts' => -1, 'fields' => 'ids' ) );
foreach ( $ids as $id ) {
$file = get_post_meta( $id, '_wp_attached_file', true );
// Dateiname ohne Endung und ohne den Zusatz -scaled großer Bilder
$base = preg_replace( '/(-scaled)?\.[^.]+$/', '', wp_basename( $file ) );
$like = '%' . $wpdb->esc_like( $base ) . '%';
$in_content = (int) $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->posts} WHERE post_type NOT IN ('attachment','revision') AND post_status <> 'trash' AND ( post_content LIKE %s OR post_content LIKE %s )", $like, '%wp-image-' . $id . '"%' ) );
$as_thumb = (int) $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->postmeta} WHERE meta_key = '_thumbnail_id' AND meta_value = %d", $id ) );
$in_options = (int) $wpdb->get_var( $wpdb->prepare(
"SELECT COUNT(*) FROM {$wpdb->options} WHERE option_value LIKE %s OR (option_name = 'site_icon' AND option_value = %d)", $like, $id ) );
if ( 0 === $in_content + $as_thumb + $in_options ) {
echo $id . "\t" . $file . PHP_EOL;
}
}
wp eval-file unbenutzte-medien.php
Im Labor gab es drei Bilder: eines im Inhalt einer Seite, eines als Beitragsbild, eines ungenutzt. Die erste Fassung des Skripts meldete zwei Kandidaten, darunter das im Inhalt verwendete Bild. Ursache: Die Datei heißt b1-scaled.jpg, im Beitrag stand aber b1-1024x683.jpg. Nach dem Entfernen des Zusatzes -scaled und der zusätzlichen Suche nach der Block-Klasse wp-image-ID blieb nur das tatsächlich ungenutzte Bild übrig:
6 2026/09/b3-scaled.jpg
Das Skript erkennt keine Verwendung in Page-Builder-Daten, die in eigenen Tabellen oder serialisierten Metafeldern liegen, in Widgets mit ID statt Dateiname oder in CSS-Dateien des Themes. Prüfen Sie deshalb jeden Kandidaten einzeln und behalten Sie ihn im Zweifel.
Verifizieren: Die Liste enthält nur Dateien, die Sie nach Sichtprüfung keiner Seite zuordnen können. Ein bekanntes, genutztes Bild taucht nicht auf.
Schritt 4: Sicher löschen mit Papierkorb für Medien
Standardmäßig kennt WordPress für Medien keinen Papierkorb. Im Labor lehnte WP-CLI das Verschieben mit dieser Meldung ab:
Warning: Posts of type 'attachment' do not support being sent to trash.
Please use the --force flag to skip trash and delete them permanently.
Im Backend heißt die Aktion entsprechend „Endgültig löschen“. Der Anhang verschwindet samt aller Dateien sofort. Im Labor waren nach wp post delete 6 --force alle acht Dateien des Bildes vom Server entfernt.
Deshalb lohnt es sich, vor größeren Aufräumaktionen den Papierkorb für Medien einzuschalten. Der Core definiert dafür die Konstante MEDIA_TRASH, Standardwert false. Tragen Sie in die wp-config.php oberhalb der Zeile „That's all, stop editing!“ ein:
define( 'MEDIA_TRASH', true );
Oder per WP-CLI:
wp config set MEDIA_TRASH true --raw
Im Labor landete ein Anhang danach im Status trash, die Datei blieb auf dem Server erhalten, und die Wiederherstellung setzte ihn zurück. In der Mediathek erscheint dann ein Filter „Papierkorb“ mit „Aus dem Papierkorb wiederherstellen“. WordPress leert den Papierkorb nach 30 Tagen automatisch, so legt es die Konstante EMPTY_TRASH_DAYS standardmäßig fest.
Gehen Sie in Etappen vor: Kandidaten mit wp post delete ID in den Papierkorb, einige Tage Website und Fehlerprotokolle beobachten, dann endgültig löschen.
Löschen Sie Dateien mit zugehörigem Anhang nie direkt per FTP, sonst bleibt ein leerer Eintrag in der Mediathek.
Verifizieren: Ein gelöschter Kandidat erscheint im Filter „Papierkorb“, die Website zeigt keine fehlenden Bilder, und nach dem endgültigen Löschen ist der Uploads-Ordner messbar kleiner.
Schritt 5: Verwaiste Dateien und überflüssige Größen entfernen
Der umgekehrte Fall sind Dateien im Uploads-Ordner, zu denen es keinen Anhang gibt. Sie entstehen durch Uploads per FTP, abgebrochene Importe, Migrationen oder Plugins, die eigene Kopien anlegen. Die Mediathek zeigt sie nicht. Dieses Skript vergleicht die Dateien in den Jahres- und Monatsordnern mit allen bekannten Anhängen und deren Größen:
<?php
// Dateien im Uploads-Ordner, die zu keinem Anhang gehören (nur Anzeige)
$up = wp_get_upload_dir();
$known = array();
foreach ( get_posts( array( 'post_type' => 'attachment', 'post_status' => 'any', 'numberposts' => -1, 'fields' => 'ids' ) ) as $id ) {
$file = get_attached_file( $id );
$known[ $file ] = true;
$meta = wp_get_attachment_metadata( $id );
$dir = dirname( $file );
foreach ( (array) ( $meta['sizes'] ?? array() ) as $s ) {
$known[ $dir . '/' . $s['file'] ] = true;
}
if ( ! empty( $meta['original_image'] ) ) {
$known[ $dir . '/' . $meta['original_image'] ] = true;
}
}
$it = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $up['basedir'], FilesystemIterator::SKIP_DOTS ) );
foreach ( $it as $f ) {
if ( preg_match( '#/uploads/\d{4}/\d{2}/#', $f->getPathname() ) && ! isset( $known[ $f->getPathname() ] ) ) {
echo size_format( $f->getSize() ) . "\t" . $f->getPathname() . PHP_EOL;
}
}
Im Labor fand es genau die zuvor per Kopie angelegte Datei: 2 MB /var/www/html/wp-content/uploads/2026/09/verwaist.jpg. Plugin-Ordner außerhalb der Jahresordner wertet es bewusst nicht aus. Verschieben Sie gefundene Dateien zuerst in einen Ordner außerhalb des Webroots, statt sie sofort zu löschen.
Zweite Quelle von Ballast sind Zwischengrößen. Hat ein früheres Theme eigene Bildgrößen registriert, liegen diese Dateien nach dem Theme-Wechsel weiter auf dem Server. Im Labor wurde eine Größe alt-format mit 400 × 400 Pixeln registriert, erzeugt und danach wieder entfernt. wp media regenerate 4 --delete-unknown --yes löschte die nicht mehr registrierte Datei b1-400x400.jpg. Laut WP-CLI-Hilfe entfernt die Option nur Vorschaubilder nicht mehr registrierter Größen und erzeugt keine neuen.
Künftig verhindern Sie überflüssige Größen mit dem Filter intermediate_image_sizes_advanced. Nutzt Ihr Theme die Größen 1536 und 2048 Pixel nicht, sparen Sie pro Upload zwei große Dateien. Als Must-Use-Plugin in wp-content/mu-plugins/bildgroessen.php:
<?php
/**
* Plugin Name: Bildgrößen reduzieren
* Description: Erzeugt die sehr großen Zwischengrößen nicht mehr.
*/
add_filter( 'intermediate_image_sizes_advanced', function ( $sizes ) {
unset( $sizes['1536x1536'], $sizes['2048x2048'] );
return $sizes;
} );
Ein neuer Upload im Labor erzeugte danach nur noch sechs statt acht Dateien. Der Kompromiss: Auf sehr hochauflösenden Bildschirmen stehen im srcset weniger große Varianten zur Auswahl. Wie Sie die verbleibenden Größen zusätzlich kleiner bekommen, zeigt Bilder in WordPress optimieren.
Aufräumen ist keine einmalige Aktion, die Mediathek wächst weiter. Eine Kontrolle pro Quartal, Backups vor jeder Löschaktion und aktuelle Plugins halten den Bestand im Griff. Wer diese Aufgaben nicht selbst im Kalender halten möchte, kann sie abgeben: Die WordPress-Wartung von wordpressupdate.de übernimmt Updates von WordPress, Plugins und Themes sowie wöchentliche Backups auf externen Speicher mit vier Wochen Aufbewahrung.
Verifizieren: Das Skript für verwaiste Dateien liefert keine Ausgabe mehr, die Größenmessung aus Schritt 1 ergibt einen kleineren Wert, und ein Test-Upload erzeugt nur die gewünschten Größen.
Typische Fehler
- Bilder fehlen nach dem Aufräumen: Ein Kandidat wurde in einem Page Builder oder Widget genutzt. Aus dem Papierkorb wiederherstellen oder aus dem Backup zurückholen, siehe Einzelne Beiträge und Medien aus einem Backup zurückholen.
- „Posts of type 'attachment' do not support being sent to trash.“:
MEDIA_TRASHist nicht gesetzt. Konstante eintragen oder bewusst mit--forcelöschen. - Genutztes Bild erscheint als ungenutzt: Im Inhalt steht eine Zwischengröße, gesucht wurde nach dem
-scaled-Namen. Suchmuster ohne Größenzusatz verwenden wie im Skript oben. - Leere Vorschaubilder in der Mediathek: Dateien wurden per FTP gelöscht, der Anhang existiert noch. Anhang in WordPress löschen oder Datei zurückspielen.
Häufige Fragen
Gibt es ein Plugin, das ungenutzte Medien zuverlässig findet?
Solche Plugins stoßen auf dieselbe Grenze wie das Skript: Verwendungen in fremden Datenstrukturen erkennen sie nur, wenn sie diese kennen. Prüfen Sie die Ergebnisse ebenso kritisch.
Wird die Datenbank beim Löschen von Anhängen kleiner?
Etwas, denn Anhang und Metadaten werden entfernt. Den größten Effekt hat das Aufräumen aber auf den Speicherplatz im Dateisystem und die Dauer der Backups. Für die Datenbank selbst gibt es eigene Maßnahmen, siehe WordPress-Datenbank aufräumen.
Testumfang
Getestet im Labor mit WordPress 7.1.2 (deutsch) und PHP 8.4: Import von Testbildern per wp media import, Zählung der Zwischengrößen, Skript für ungenutzte Anhänge mit Bild im Inhalt, Beitragsbild und ungenutztem Bild samt Korrektur für -scaled, Löschen mit und ohne MEDIA_TRASH, Wiederherstellung aus dem Papierkorb, Skript für verwaiste Dateien, wp media regenerate --delete-unknown und Filter intermediate_image_sizes_advanced. Nicht getestet: Page Builder, Multisite, Ordner-Plugins und Mediatheken mit mehreren Tausend Dateien.
Fazit
Eine aufgeräumte Mediathek spart Speicher, verkürzt Backups und erleichtert die Arbeit im Redaktionsalltag. Der sichere Weg führt über Messung, eine Kandidatenliste per Skript, Sichtprüfung, Papierkorb und erst dann endgültiges Löschen. Wenn Sie die zugehörigen Backups und Updates lieber abgeben, übernimmt das die WordPress-Wartung von Marcel Schönfelder.
Weiterführende Anleitungen und Quellen
- Bilder in WordPress optimieren: WebP, AVIF und Lazy Loading
- Einzelne Beiträge und Medien aus einem WordPress-Backup zurückholen
- WordPress-Datenbank aufräumen
- WordPress-Dokumentation: Media Library Screen
- Advanced Administration Handbook: wp-config.php
- Developer Reference: intermediate_image_sizes_advanced
- WP-CLI-Handbuch: wp media regenerate


