Directory / plugin
UploadSleuth – Media Audit & Cleanup
v1.1.0 · by Vagelis
Find files that may be unused in WordPress uploads, spot missing Media Library files, and safely review, quarantine, back up, or delete them.
About this plugin
UploadSleuth reconciles files in the uploads directory against WordPress attachment metadata and database references.
Files without a detected reference are shown as likely stray candidates. They are not declared safe to delete. The plugin encourages a review, dry-run, and quarantine workflow before permanent removal.
Features
- AJAX-powered dashboard under Tools > UploadSleuth.
- Scan summaries including candidate count and potential disk space.
- Persistent storage-impact statistics for reclaimed space and completed cleanup actions.
- Search, sorting, bulk selection, and per-user saved results.
- Dry-run, timestamped quarantine, verified backup-and-remove, and guarded deletion.
- Recognition of attachment originals, generated sizes, edited originals, and backups.
- Checks for references in posts, metadata, options, and configured custom tables.
- Optional non-core database table scanning.
- WP-CLI table, CSV, JSON, and YAML output.
- CLI age and size filters, CI mode, and explicit permanent-delete confirmation.
- Complete in-dashboard WP-CLI reference with copy-ready recipes.
- Optional last-moment attachment and database revalidation, enabled by default.
- Configurable scan/action batches and pauses for slow servers.
- WordPress-native standalone-file deletion through
wp_delete_file(). - Stoppable batched scans that preserve reviewed partial findings.
- Separate Media Library integrity checks for missing originals and generated image sizes.
- WordPress-native cleanup of reviewed missing-file attachment records.
- No external service or telemetry.
Important safety note
A file can be referenced by an external system, theme or plugin code, encoded data, a custom database, or another location the plugin cannot inspect. Make a verified backup and test quarantined files before deleting anything permanently.
UploadSleuth is maintained by the same developer behind Notificator – Alerts & Notifications, a WordPress plugin for turning site events into dashboard alerts and optional mobile or MQTT notifications. Browse the UploadSleuth source code on GitHub.
WP-CLI Examples
wp upload-sleuth
wp upload-sleuth --uploads-subdir=2025 --format=json
wp upload-sleuth --older-than=90 --min-size=100 --summary-only
wp upload-sleuth --quarantine --dry-run
wp upload-sleuth --delete --dry-run
wp upload-sleuth --backup-delete --dry-run
Real permanent deletion requires wp upload-sleuth --delete --yes. A real backup-and-remove operation similarly requires wp upload-sleuth --backup-delete --yes.
Long scans can be checkpointed and resumed:
wp upload-sleuth --state-file=/path/upload-sleuth-scan.json
wp upload-sleuth --resume --state-file=/path/upload-sleuth-scan.json
wp upload-sleuth --clear-state --state-file=/path/upload-sleuth-scan.json
Use --save-report=/path/upload-sleuth-report.json to export JSON findings, then import that file from the WP-CLI tab in the dashboard. Interactive table scans display an animated progress bar.
Integration hooks
UploadSleuth fires upload_sleuth_* lifecycle and file-action hooks for notification and automation integrations, including scan started/completed/stopped, action started/completed, and upload_sleuth_quarantine_emptied. The source argument identifies dashboard or cli. See the project README for the complete hook list.