Unused Media Checker
English Unused Media Checker helps you identify, inspect, and safely remove unused media files from your WordPress Media Library. The Media Library scan runs in small, resumable batches instead of one long request. This reduces the risk of gateway timeouts on sites with large media libraries. If the scan page is closed or reloaded, returning to the page resumes the saved scan progress. Version 1.4.0 has been tested on development and staging installations with Media Libraries containing more than 6,000 files. Actual scan time depends on the hosting environment, content volume and enabled integrations. The plugin analyzes your site and lists attachments that are not referenced in: Posts, pages, and all public custom post types (including featured images/thumbnails) Post content (Gutenberg blocks and classic content with wp-image-ID classes) Direct image URLs from the uploads folder (wp-content/uploads/...) Advanced Ads (media referenced via the advanced_ads_media meta) Theme Customizer (site logo, site icon, header image, background image – including retina variants) Rank Math FAQ blocks (images stored in FAQ block attributes) Photo Gallery (10Web): optional filename-based warning in the unused list (usage is not mapped via attachment IDs) Key features: Resumable AJAX batch scan with progress display for large Media Libraries Persistent scan snapshots for fast pagination and safer deletion checks Clear list of potentially unused attachments with thumbnails, title, date and quick “Inspect” link Accurate detection that respects logos, favicons, featured images and common SEO/ads integrations Bulk delete with nonce protection and clear success messages – no unexpected white screens Safe individual delete buttons per item with confirmation dialog Pagination and list rendering powered by WordPress’s native WP_List_Table class Optional Photo Gallery (10Web) helpers: Media Library warning when a file with the same name exists in Photo Gallery Photo Gallery files report (uploads/photo-gallery/) with grouping and an “unused motif” filter Fully translation-ready via the textdomain unused-media-checker Deutsch Unused Media Checker hilft Ihnen, ungenutzte Dateien in Ihrer WordPress‑Mediathek zu identifizieren, zu überprüfen und sicher zu entfernen. Der Mediathek-Scan läuft in kleinen, fortsetzbaren Arbeitsschritten statt in einer einzigen langen Anfrage. Dadurch sinkt bei großen Mediatheken das Risiko eines Gateway-Timeouts. Wird die Scan-Seite geschlossen oder neu geladen, setzt das Plugin den gespeicherten Fortschritt beim nächsten Aufruf fort. Version 1.4.0 wurde in Entwicklungs- und Staging-Installationen mit Mediatheken mit mehr als 6.000 Dateien getestet. Die tatsächliche Scandauer hängt vom Hosting, dem Inhaltsumfang und den aktivierten Integrationen ab. Das Plugin analysiert Ihre Website und listet Anhänge, die nicht referenziert werden in: Beiträgen, Seiten und allen öffentlichen Custom Post Types (inkl. Beitragsbilder/Thumbnails) Beitragsinhalten (Gutenberg‑Blöcke und klassischer Editor mit wp-image-ID‑Klassen) Direkt eingebundenen Bild‑URLs aus dem Uploads‑Ordner (wp-content/uploads/...) Advanced Ads (Medien im Meta‑Feld advanced_ads_media) Theme‑Customizer (Website‑Logo, Website‑Icon, Header‑Bild, Hintergrundbild – inkl. Retina‑Varianten) Rank‑Math‑FAQ‑Blöcken (Bilder in den FAQ‑Block‑Attributen) Photo Gallery (10Web): optionaler Dateinamen‑Hinweis in der Unused‑Liste (Nutzung wird nicht über Attachment‑IDs gemappt) Funktionen: Fortsetzbarer AJAX-Batch-Scan mit Fortschrittsanzeige für große Mediatheken Persistente Scan-Snapshots für schnelle Paginierung und sicherere Löschprüfungen Übersichtliche Liste potenziell ungenutzter Anhänge mit Vorschaubild, Titel, Datum und “Inspect”‑Link Präzise Erkennung, die Logos, Favicons, Beitragsbilder und gängige SEO/Ads‑Integrationen berücksichtigt Massenlöschung mit Nonce‑Schutz und klaren Erfolgsmeldungen – keine unerwarteten weißen Seiten Sicheres, einzelnes Löschen je Datei mit Bestätigungsdialog Massenaktionen und Paginierung basierend auf der WordPress‑Klasse WP_List_Table Optionale Photo Gallery (10Web) Hilfen: Warnhinweis in der Mediathek‑Unused‑Liste, wenn ein gleichnamiges File in Photo Gallery existiert Report für Photo Gallery Dateien (uploads/photo-gallery/) inkl. Gruppierung und Filter „Nur ungenutzte Motive“ Übersetzungsbereit über die Textdomain unused-media-checker (z. B. Deutsch, Englisch und weitere Sprachen) Privacy The plugin processes site content and media information locally in the WordPress installation. It does not send scan data to an external service. Scan progress and result snapshots are stored in the site’s WordPress database. Support For issues or questions, visit: https://derwebfuchs.de/wordpress-mediathek-aufraumen-unused-media-checker/
WP-Sweep
WP-Sweep finds the rows WordPress leaves behind and removes them. Revisions of posts you edited years ago, meta belonging to a post that was deleted, terms attached to nothing, term relationships pointing at posts that no longer exist, expired transients: none of it is visible anywhere in wp-admin, and all of it is in your database. It uses the proper WordPress delete functions wherever they can reach the row, rather than running raw delete queries, so the hooks other plugins rely on still fire. Only the rows the API refuses to touch — orphaned meta whose object ID is 0 — are deleted directly. Features Revisions Auto drafts Deleted posts Unapproved comments Spammed comments Deleted comments Orphaned post meta Orphaned comment meta Orphaned user meta Orphaned term meta Orphaned term relationships Unused terms Duplicated post meta Duplicated comment meta Duplicated user meta Duplicated term meta Transient options oEmbed caches in post meta Optimizes database tables Delete functions used 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() Known incompatibilities These plugins keep data in places WP-Sweep reads as orphaned. Protect their meta keys with the filters under Usage before sweeping. Custom Fonts Elementor Popup Builder MailPress Meta Slider Polylang Slider Revolution Viba Portfolio WPML Donations I spent most of my free time creating, updating, maintaining and supporting these plugins, if you really love my plugins and could spare me a couple of bucks, I will really appreciate it. If not feel free to use it without any obligations. Usage Every sweep is irreversible, so back your database up first. The screen lists every sweep with a short description of what it removes, how many items that is, and what proportion of the table they are. Tick the ones you want and use the Sweep bulk action, or use each row’s Sweep and Details buttons one at a time. Nothing on the screen needs JavaScript: the buttons are ordinary links and the bulk action is an ordinary form. There is no settings screen. The one thing worth tuning — how many items Details lists, 500 by default — is the wp_sweep_limit_details filter. The cap exists because the whole sample is held in memory and written into the page. WP-CLI wp sweep --all wp sweep revisions wp sweep revisions auto_drafts deleted_posts REST API All three routes need the activate_plugins capability. GET /wp-json/sweep/v1/count/ GET /wp-json/sweep/v1/details/ DELETE /wp-json/sweep/v1/sweep/ Item names 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`. Filters wp_sweep_postmeta_whitelist (array) — post meta keys that must never be deleted, by the orphaned or the duplicated post meta sweep. * matches any run of characters. Default: empty. wp_sweep_commentmeta_whitelist (array) — the same, for comment meta. wp_sweep_usermeta_whitelist (array) — the same, for user meta. wp_sweep_termmeta_whitelist (array) — the same, for term meta. wp_sweep_excluded_taxonomies (array) — taxonomies left out of the orphaned term relationships sweep. Default: array( 'link_category' ). wp_sweep_excluded_termids (array) — term IDs left out of the unused terms sweep. Default: each taxonomy’s default term, plus any term that is the parent of another. wp_sweep_limit_details (int) — how many items a Details list shows. Default: 500. wp_sweep_defer_counts (bool) — whether the Sweep screen renders first and fetches its counts afterwards, one at a time. Return false to compute every count with the page, as versions before 2.0.1 always did. Default: true. wp_sweep_capability (string $capability, string $context) — the capability required. $context is one of sweep, ajax or rest. wp_sweep_total_count (int $count, string $name) — the total number of rows a sweep’s percentage is measured against. wp_sweep_count (int $count, string $name) — how many items a sweep would remove. wp_sweep_details (array $details, string $name) — the sample list shown by Details. wp_sweep_sweep (string $message, string $name) — the message reported after a sweep has run. Actions 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. Protect specific post meta keys from being swept: add_filter( 'wp_sweep_postmeta_whitelist', function ( $meta_keys ) { $meta_keys[] = '_my_plugin_setting'; $meta_keys[] = '_acme_*'; return $meta_keys; } ); Exclude an additional taxonomy from the orphaned term relationships sweep: add_filter( 'wp_sweep_excluded_taxonomies', function ( $taxonomies ) { $taxonomies[] = 'product_type'; return $taxonomies; } );