---
title: "Mediathek in WordPress aufräumen: ungenutzte Dateien finden und Speicher sparen"
date: 2026-09-30T22:10:24+02:00
modified: 2026-11-10T08:52:12+01:00
category: wordpress
type: how_to
author: Marcel Schönfelder
canonical: https://s-edv.com/anleitungen/wordpress-mediathek-aufraeumen-ungenutzte-dateien-speicher-sparen
keywords:
  - WordPress
  - Mediathek
  - Speicherplatz
  - WP-CLI
  - Wartung
reading_time: 10
---

# Mediathek in WordPress aufräumen: ungenutzte Dateien finden und Speicher sparen

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 und verlängert Backups. 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.

**Kurzfassung:** Messen Sie zuerst den Platzbedarf von `wp-content/uploads`. Die Mediathek hat keine Ordner, lässt sich aber nach Typ, Datum und „Nicht verknüpft“ filtern. Ungenutzte Anhänge finden Sie mit einem kleinen WP-CLI-Skript, das Inhalte, Beitragsbilder und Optionen durchsucht. Löschen Sie nur nach Backup und Sichtprüfung, denn Anhänge landen standardmäßig nicht im Papierkorb. Mit der Konstante `MEDIA_TRASH` schalten Sie ihn ein. Nicht benötigte Zwischengrößen verhindern Sie per Filter und räumen alte mit `wp media regenerate --delete-unknown` auf.

## Voraussetzungen

- [ ] **WordPress:** eine aktuelle Installation, getestet mit WordPress 7.1.2 in deutscher Sprache.
- [ ] **PHP:** WordPress empfiehlt PHP 8.3 oder neuer; PHP 7.4 ist nur für ältere Installationen vorgesehen. Getestet mit 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.php` SFTP 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, um den Erfolg belegen zu können. Auf der Kommandozeile ermitteln Sie die Größe des Uploads-Ordners und die Zahl der Anhänge:

```bash
du -sh wp-content/uploads
find wp-content/uploads -type f | wc -l
wp post list --post_type=attachment --format=count
```

Im Beispiel 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 Beispiel 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.

> **Prüfen:** 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 Beispiel waren alle Bilder 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.

> **Prüfen:** 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
<?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;
	}
}
```

```bash
wp eval-file unbenutzte-medien.php
```

Im Beispiel 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:

```plaintext
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.

> **Prüfen:** 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 Test lehnte WP-CLI das Verschieben mit dieser Meldung ab:

```plaintext
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 Test waren nach `wp post delete 6 --force` alle acht Dateien des Bildes vom Server entfernt.

Schalten Sie deshalb vor größeren Aufräumaktionen den Papierkorb für Medien ein. 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:

Datei: `wp-config.php`

```php
define( 'MEDIA_TRASH', true );
```

Oder per WP-CLI:

```bash
wp config set MEDIA_TRASH true --raw
```

Im Test 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.

> **Prüfen:** 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
<?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 Beispiel 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 Beispiel 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. `--delete-unknown` ist seit WP-CLI 2.11.0 verfügbar.

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`:

Datei: `wp-content/mu-plugins/bildgroessen.php`

```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 Beispiel 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](https://s-edv.com/anleitungen/wordpress-bilder-optimieren-webp-avif-lazy-loading).

Planen Sie eine Kontrolle pro Quartal und ein Backup vor jeder Löschaktion ein. Wer diese Aufgaben nicht selbst im Kalender halten möchte, kann sie abgeben: Die [WordPress-Wartung von wordpressupdate.de](https://wordpressupdate.de/?utm_source=s-edv.com&utm_medium=artikel&utm_campaign=85) übernimmt Updates von WordPress, Plugins und Themes sowie wöchentliche Backups auf externen Speicher mit vier Wochen Aufbewahrung.

> **Prüfen:** 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](https://s-edv.com/anleitungen/wordpress-einzelne-beitraege-medien-aus-backup-wiederherstellen).

**„Posts of type 'attachment' do not support being sent to trash.“**

`MEDIA_TRASH` ist nicht gesetzt. Konstante eintragen oder bewusst mit `--force` lö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](https://s-edv.com/anleitungen/wordpress-datenbank-aufraeumen-revisionen-transients-autoload).

## Fazit

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](https://wordpressupdate.de/?utm_source=s-edv.com&utm_medium=fazit&utm_campaign=85).

## Weiterführende Anleitungen und Quellen

- [Bilder in WordPress optimieren: WebP, AVIF und Lazy Loading](https://s-edv.com/anleitungen/wordpress-bilder-optimieren-webp-avif-lazy-loading)
- [Einzelne Beiträge und Medien aus einem WordPress-Backup zurückholen](https://s-edv.com/anleitungen/wordpress-einzelne-beitraege-medien-aus-backup-wiederherstellen)
- [WordPress-Datenbank aufräumen](https://s-edv.com/anleitungen/wordpress-datenbank-aufraeumen-revisionen-transients-autoload)
- [WordPress-Dokumentation: Media Library Screen](https://wordpress.org/documentation/article/media-library-screen/)
- [Advanced Administration Handbook: wp-config.php](https://developer.wordpress.org/advanced-administration/wordpress/wp-config/)
- [Developer Reference: intermediate_image_sizes_advanced](https://developer.wordpress.org/reference/hooks/intermediate_image_sizes_advanced/)
- [WP-CLI-Handbuch: wp media regenerate](https://developer.wordpress.org/cli/commands/media/regenerate/)
