{"id":366260,"date":"2026-09-10T14:44:18","date_gmt":"2026-09-10T14:44:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/media-audit\/"},"modified":"2026-09-10T14:44:01","modified_gmt":"2026-09-10T14:44:01","slug":"upload-sleuth","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/upload-sleuth\/","author":14514539,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"UploadSleuth \u2013 Media Audit & Cleanup","header_author":"Vagelis P.","header_description":"Find files that may be unused in WordPress uploads, spot missing Media Library files, and safely review, quarantine, back up, or delete them.","assets_banners_color":"0f2946","last_updated":"2026-09-10 14:44:01","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":38,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.2":{"tag":"1.0.2","author":"eboxnet","date":"2026-09-10 14:44:01","revision":3690074}},"upgrade_notice":{"1.0.2":"<p>Adopts the UploadSleuth name and hardens quarantine, restore, backup, and deletion for WordPress.org directory review.<\/p>","1.0.1":"<p>Improves dashboard consistency and adds a more useful plain-language guide to scanning and safe cleanup.<\/p>","1.0.0":"<p>First stable public release with uploads auditing, safe cleanup workflows, Media Library integrity checks, and WP-CLI support.<\/p>","0.16.0":"<p>Standards and submission-readiness release with hardened AJAX input handling and no intended workflow changes.<\/p>","0.15.4":"<p>Allows safe multi-dot filenames to be scanned and cleaned without weakening traversal protection.<\/p>","0.15.3":"<p>Improves spacing around dashboard notices.<\/p>","0.15.2":"<p>Fixes Delete all for large and stale browser result sets while retaining server-owned validation.<\/p>","0.15.1":"<p>Keeps operational feedback beside the workflow that produced it instead of at the top of the page.<\/p>","0.15.0":"<p>Adds a guarded Media Library database-integrity workflow. Review offloaded media carefully before deleting records.<\/p>","0.14.1":"<p>Corrects checkbox alignment in settings cards.<\/p>","0.14.0":"<p>Reduces browser memory, DOM, layout, and filtering work for very large result sets.<\/p>","0.13.3":"<p>Makes browser console diagnostics opt-in to avoid unnecessary client-side work.<\/p>","0.13.2":"<p>Improves statistics placement and keeps empty counters out of the interface.<\/p>","0.13.1":"<p>Keeps very large deletion reports from expanding the admin page.<\/p>","0.13.0":"<p>Adds real file-action progress and tuning controls for slow servers. Revalidation remains enabled by default.<\/p>","0.12.0":"<p>Adds visible progress feedback to Delete all and other dashboard tasks.<\/p>","0.11.0":"<p>Adds persistent cleanup and reclaimed-space statistics; tracking begins after this update.<\/p>","0.10.1":"<p>Fixes authenticated dashboard ZIP downloads returning an error page.<\/p>","0.10.0":"<p>Adds whole-result deletion and selected\/all quarantine cleanup controls.<\/p>","0.9.2":"<p>Restores automatic ZIP downloads and makes dashboard dry-run opt-in.<\/p>","0.9.1":"<p>Fixes ZIP download navigation and filenames.<\/p>","0.9.0":"<p>Adds guarded quarantine restoration and fixes the remaining file-action page jumps.<\/p>","0.8.0":"<p>Dashboard backup-and-remove now downloads a verified ZIP and no longer jumps the page during file actions.<\/p>","0.7.0":"<p>Improves the live scanning and results interface without changing the safety model or filesystem actions.<\/p>","0.6.1":"<p>Adds developer-facing code documentation without changing scan behavior.<\/p>","0.6.0":"<p>Adds stoppable batched dashboard scans with preserved partial results.<\/p>","0.5.0":"<p>Adds last-moment reference validation and WordPress-native standalone-file deletion.<\/p>","0.4.0":"<p>Adds the complete WP-CLI reference directly to the UploadSleuth dashboard.<\/p>","0.3.0":"<p>Adds verified backups before removing original files and improved scan diagnostics.<\/p>","0.2.0":"<p>Adds the AJAX dashboard and safer, more capable WP-CLI workflows. Back up before performing any filesystem action.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3690073,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3690073,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3690073,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3690073,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.2"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[8533,3786,84,85,4574],"plugin_category":[50],"plugin_contributors":[85196],"plugin_business_model":[],"class_list":["post-366260","plugin","type-plugin","status-publish","hentry","plugin_tags-audit","plugin_tags-cleanup","plugin_tags-media","plugin_tags-uploads","plugin_tags-wp-cli","plugin_category-media","plugin_contributors-eboxnet","plugin_committers-eboxnet"],"banners":{"banner":"https:\/\/ps.w.org\/upload-sleuth\/assets\/banner-772x250.png?rev=3690073","banner_2x":"https:\/\/ps.w.org\/upload-sleuth\/assets\/banner-1544x500.png?rev=3690073","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/upload-sleuth\/assets\/icon-128x128.png?rev=3690073","icon_2x":"https:\/\/ps.w.org\/upload-sleuth\/assets\/icon-256x256.png?rev=3690073","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>UploadSleuth reconciles files in the uploads directory against WordPress attachment metadata and database references.<\/p>\n\n<p>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.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>AJAX-powered dashboard under Tools &gt; UploadSleuth.<\/li>\n<li>Scan summaries including candidate count and potential disk space.<\/li>\n<li>Persistent storage-impact statistics for reclaimed space and completed cleanup actions.<\/li>\n<li>Search, sorting, bulk selection, and per-user saved results.<\/li>\n<li>Dry-run, timestamped quarantine, verified backup-and-remove, and guarded deletion.<\/li>\n<li>Recognition of attachment originals, generated sizes, edited originals, and backups.<\/li>\n<li>Checks for references in posts, metadata, options, and configured custom tables.<\/li>\n<li>Optional non-core database table scanning.<\/li>\n<li>WP-CLI table, CSV, JSON, and YAML output.<\/li>\n<li>CLI age and size filters, CI mode, and explicit permanent-delete confirmation.<\/li>\n<li>Complete in-dashboard WP-CLI reference with copy-ready recipes.<\/li>\n<li>Optional last-moment attachment and database revalidation, enabled by default.<\/li>\n<li>Configurable scan\/action batches and pauses for slow servers.<\/li>\n<li>WordPress-native standalone-file deletion through <code>wp_delete_file()<\/code>.<\/li>\n<li>Stoppable batched scans that preserve reviewed partial findings.<\/li>\n<li>Separate Media Library integrity checks for missing originals and generated image sizes.<\/li>\n<li>WordPress-native cleanup of reviewed missing-file attachment records.<\/li>\n<li>No external service or telemetry.<\/li>\n<\/ul>\n\n<h4>Important safety note<\/h4>\n\n<p>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.<\/p>\n\n<h3>WP-CLI Examples<\/h3>\n\n<pre><code>wp upload-sleuth\n\nwp upload-sleuth --uploads-subdir=2025 --format=json\n\nwp upload-sleuth --older-than=90 --min-size=100 --summary-only\n\nwp upload-sleuth --quarantine --dry-run\n\nwp upload-sleuth --delete --dry-run\n\nwp upload-sleuth --backup-delete --dry-run\n<\/code><\/pre>\n\n<p>Real permanent deletion requires <code>wp upload-sleuth --delete --yes<\/code>. A real backup-and-remove operation similarly requires <code>wp upload-sleuth --backup-delete --yes<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>upload-sleuth<\/code> directory to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate UploadSleuth through the Plugins screen.<\/li>\n<li>Open Tools &gt; UploadSleuth.<\/li>\n<li>Configure ignore patterns or custom table checks if needed.<\/li>\n<li>Begin with a narrow subdirectory scan.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20a%20finding%20mean%20the%20file%20is%20safe%20to%20delete%3F\"><h3>Does a finding mean the file is safe to delete?<\/h3><\/dt>\n<dd><p>No. A finding means the plugin did not detect a reference in the locations it checked. Treat it as a candidate requiring review.<\/p><\/dd>\n<dt id=\"what%20does%20quarantine%20do%3F\"><h3>What does quarantine do?<\/h3><\/dt>\n<dd><p>Quarantine moves selected files into a timestamped directory below the configured quarantine folder while preserving their original relative paths. The quarantine directory is excluded from future scans.<\/p><\/dd>\n<dt id=\"can%20i%20restore%20a%20quarantined%20file%3F\"><h3>Can I restore a quarantined file?<\/h3><\/dt>\n<dd><p>Yes. The Quarantined files panel lists recoverable files and restores each one to its original uploads path. Restore is blocked rather than overwriting a file that already exists there.<\/p>\n\n<p>The same panel can permanently delete selected quarantined files or all recoverable quarantined files. Downloadable backup ZIPs are not included in Delete all.<\/p><\/dd>\n<dt id=\"what%20does%20download%20zip%20%26%20remove%20do%3F\"><h3>What does Download ZIP &amp; remove do?<\/h3><\/dt>\n<dd><p>The dashboard and WP-CLI create one ZIP, verify every archived entry using its size and SHA-256 hash, and only then remove the originals. The dashboard starts an authenticated download; WP-CLI reports the protected server-side archive path.<\/p><\/dd>\n<dt id=\"can%20i%20preview%20an%20action%3F\"><h3>Can I preview an action?<\/h3><\/dt>\n<dd><p>Yes. Dry-run is an opt-in checkbox in the dashboard. WP-CLI supports <code>--dry-run<\/code> with quarantine or deletion.<\/p><\/dd>\n<dt id=\"can%20i%20stop%20a%20long%20scan%3F\"><h3>Can I stop a long scan?<\/h3><\/dt>\n<dd><p>Yes. Dashboard scans process database candidates in small batches. Stop finishes the current request, saves everything classified through the latest completed batch, and marks the result as partial. Unprocessed candidates are not included in partial findings.<\/p><\/dd>\n<dt id=\"does%20it%20support%20acf%3F\"><h3>Does it support ACF?<\/h3><\/dt>\n<dd><p>ACF commonly stores values in post, term, user, and options metadata. Those locations are checked. Unusual custom tables can be configured explicitly.<\/p><\/dd>\n<dt id=\"what%20is%20the%20wp-cli%20command%3F\"><h3>What is the WP-CLI command?<\/h3><\/dt>\n<dd><p>Run <code>wp upload-sleuth<\/code>. Use <code>wp help upload-sleuth<\/code> for all options.<\/p><\/dd>\n<dt id=\"how%20do%20i%20inspect%20older%2C%20larger%20candidates%20only%3F\"><h3>How do I inspect older, larger candidates only?<\/h3><\/dt>\n<dd><p>Use <code>wp upload-sleuth --older-than=90 --min-size=100<\/code> to report candidates older than 90 days and at least 100 KB.<\/p><\/dd>\n<dt id=\"can%20the%20command%20be%20used%20in%20automation%3F\"><h3>Can the command be used in automation?<\/h3><\/dt>\n<dd><p>Yes. <code>--summary-only --fail-on-findings<\/code> provides a concise result and a non-zero exit when candidates exist.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20data%20elsewhere%3F\"><h3>Does the plugin send data elsewhere?<\/h3><\/dt>\n<dd><p>No. Scanning and file operations run locally within WordPress.<\/p><\/dd>\n<dt id=\"can%20it%20find%20media%20library%20records%20whose%20files%20are%20missing%3F\"><h3>Can it find Media Library records whose files are missing?<\/h3><\/dt>\n<dd><p>Yes. The Library integrity tab checks attachment records in batches. It reports missing local originals and, separately, generated sizes that are absent while the original exists. Missing-original records can be deleted individually or all at once after confirmation; cleanup uses WordPress <code>wp_delete_attachment()<\/code> rather than direct database queries.<\/p>\n\n<p>Sites using S3, CDN, or another media-offload plugin require special care. A valid remote attachment may intentionally have no local file, so confirm the remote object and offload configuration before deleting a reported record.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Renamed the plugin to UploadSleuth \u2013 Media Audit &amp; Cleanup and changed the public slug, text domain, package, dashboard URL, and WP-CLI command to <code>upload-sleuth<\/code>.<\/li>\n<li>Limited quarantine, restore, backup, and delete actions to file types recognised by WordPress; <code>--all-files<\/code> now expands reporting only.<\/li>\n<li>Replaced WP-CLI backup trees with verified ZIP archives.<\/li>\n<li>Moved runtime storage below <code>uploads\/upload-sleuth<\/code>, added direct-access protection files, and stored quarantined files with a non-executable suffix.<\/li>\n<li>Blocked symbolic links from quarantine and restore operations.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Matched the Settings tab width to the other UploadSleuth sections.<\/li>\n<li>Expanded the How it works guide with scan stages, result meanings, action guidance, and a pre-cleanup checklist.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First stable public release of UploadSleuth.<\/li>\n<li>Added uploads auditing with attachment and database-reference checks.<\/li>\n<li>Added stoppable AJAX scans, saved partial results, filtering, sorting, and batched actions.<\/li>\n<li>Added quarantine, guarded restoration, verified ZIP backup and removal, and permanent cleanup tools.<\/li>\n<li>Added Media Library integrity checks for missing originals and generated files.<\/li>\n<li>Added slow-server controls, cleanup statistics, WP-CLI workflows, and developer documentation.<\/li>\n<li>Passed WordPress coding standards, PHP 7.4 compatibility, and Plugin Check new-submission validation.<\/li>\n<\/ul>\n\n<h4>0.16.0<\/h4>\n\n<ul>\n<li>Applied the WordPress PHP Coding Standards throughout the plugin.<\/li>\n<li>Completed PHPDoc parameter and return documentation for every PHP function and method.<\/li>\n<li>Documented narrowly scoped database and filesystem exceptions used for safe batching, atomic moves, and streamed ZIP verification.<\/li>\n<li>Hardened AJAX array unslashing and sanitization while retaining server-owned finding validation.<\/li>\n<li>Modernized and formatted dashboard JavaScript and CSS using the official WordPress lint configurations.<\/li>\n<li>Added current WordPress compatibility and release metadata for directory submission.<\/li>\n<\/ul>\n\n<h4>0.15.4<\/h4>\n\n<ul>\n<li>Allowed safe filenames containing consecutive dots.<\/li>\n<li>Kept traversal protection for actual current-directory and parent-directory path segments.<\/li>\n<li>Unified the corrected path rule across dashboard and WP-CLI workflows.<\/li>\n<\/ul>\n\n<h4>0.15.3<\/h4>\n\n<ul>\n<li>Added consistent spacing above section-level notices.<\/li>\n<\/ul>\n\n<h4>0.15.2<\/h4>\n\n<ul>\n<li>Fixed Delete all validation across batched requests.<\/li>\n<li>Preserved whole-result authorization while keeping genuine per-batch progress.<\/li>\n<li>Chunked large saved finding sets to avoid object-cache item-size failures.<\/li>\n<li>Removed repeated full-result payloads and full-result rewrites during file actions.<\/li>\n<li>Added a clear message when saved server findings have expired.<\/li>\n<\/ul>\n\n<h4>0.15.1<\/h4>\n\n<ul>\n<li>Moved AJAX success, warning, and error notices into their related scan, quarantine, integrity, or CLI section.<\/li>\n<li>Added reliable dismiss controls for notices created after page load.<\/li>\n<\/ul>\n\n<h4>0.15.0<\/h4>\n\n<ul>\n<li>Added a Library integrity tab for missing local attachment originals and generated sizes.<\/li>\n<li>Added batched progress, cooperative stopping, saved partial findings, and incremental rendering.<\/li>\n<li>Added selected\/all attachment-record cleanup through <code>wp_delete_attachment()<\/code> with immediate original rechecks.<\/li>\n<li>Added explicit media-offload warnings and accurate statistics for generated files removed by WordPress.<\/li>\n<li>Reduced repeated AJAX payload size during large integrity checks.<\/li>\n<\/ul>\n\n<h4>0.14.1<\/h4>\n\n<ul>\n<li>Aligned settings checkboxes with their first text line.<\/li>\n<\/ul>\n\n<h4>0.14.0<\/h4>\n\n<ul>\n<li>Added incremental findings and action-report rendering with Load more controls.<\/li>\n<li>Added a configurable rows-per-view setting, defaulting to 250.<\/li>\n<li>Debounced result filtering and reduced DOM layout\/paint work.<\/li>\n<li>Kept complete datasets available for whole-result actions without rendering every row.<\/li>\n<li>Avoided duplicating the complete findings array during ordinary renders.<\/li>\n<\/ul>\n\n<h4>0.13.3<\/h4>\n\n<ul>\n<li>Added opt-in browser console diagnostics, disabled by default.<\/li>\n<li>Disabled heartbeat timers and diagnostic payload construction while logging is off.<\/li>\n<li>Capped enabled file-action console samples at 100 rows.<\/li>\n<\/ul>\n\n<h4>0.13.2<\/h4>\n\n<ul>\n<li>Moved Storage Impact above the scan controls.<\/li>\n<li>Kept cleanup statistics hidden until tracked activity exists.<\/li>\n<\/ul>\n\n<h4>0.13.1<\/h4>\n\n<ul>\n<li>Constrained large per-file reports to a keyboard-accessible fixed-height scroll area.<\/li>\n<li>Added a visible action-result count.<\/li>\n<\/ul>\n\n<h4>0.13.0<\/h4>\n\n<ul>\n<li>Batched delete, Delete all, and quarantine actions with genuine progress.<\/li>\n<li>Added scan batch, file-action batch, and inter-batch pause settings.<\/li>\n<li>Made last-moment reference revalidation optional but enabled by default.<\/li>\n<li>Kept saved-finding and path validation active when revalidation is disabled.<\/li>\n<\/ul>\n\n<h4>0.12.0<\/h4>\n\n<ul>\n<li>Added inline operation progress for all dashboard filesystem actions.<\/li>\n<li>Added dedicated progress feedback for quarantine loading, restore, and selected\/all deletion.<\/li>\n<li>Displayed queued file counts without fabricating percentages for one-request operations.<\/li>\n<li>Added accessible busy\/live states without moving the viewport.<\/li>\n<\/ul>\n\n<h4>0.11.0<\/h4>\n\n<ul>\n<li>Added a persistent Storage Impact dashboard section.<\/li>\n<li>Counted reclaimed bytes only after successful permanent removal.<\/li>\n<li>Added cumulative permanent-removal, quarantine, and restore counters.<\/li>\n<li>Included quarantine cleanup in reclaimed-space totals.<\/li>\n<\/ul>\n\n<h4>0.10.1<\/h4>\n\n<ul>\n<li>Fixed HTML-escaped query separators causing valid ZIP downloads to reach a missing\/invalid endpoint.<\/li>\n<\/ul>\n\n<h4>0.10.0<\/h4>\n\n<ul>\n<li>Added Delete all findings for the complete saved result set.<\/li>\n<li>Added quarantine selection plus permanent Delete selected and Delete all controls.<\/li>\n<li>Excluded ZIP and CLI backup artifacts from quarantine deletion.<\/li>\n<li>Used WordPress-native file deletion with explicit confirmations for quarantine cleanup.<\/li>\n<\/ul>\n\n<h4>0.9.2<\/h4>\n\n<ul>\n<li>Replaced the browser-blocked hidden-frame ZIP transfer with a named attachment download.<\/li>\n<li>Made dashboard dry-run opt-in; destructive removal actions still require confirmation.<\/li>\n<\/ul>\n\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>Isolated ZIP downloads so they cannot move or navigate the admin page.<\/li>\n<li>Preserved timestamped UploadSleuth archive filenames instead of the download endpoint name.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>Added an in-dashboard quarantine inventory with guarded one-click restoration.<\/li>\n<li>Blocked restoration when the original uploads path is already occupied.<\/li>\n<li>Clarified quarantine behavior beside the file actions.<\/li>\n<li>Prevented notices, focused buttons, and progress visibility from moving the viewport during actions.<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Changed the dashboard backup action to create and automatically download one verified ZIP before removing originals.<\/li>\n<li>Added an authenticated, short-lived, current-user-only archive download endpoint.<\/li>\n<li>Prevented file-action controls and results rerendering from jumping the page to the top.<\/li>\n<li>Kept the existing WP-CLI verified backup-directory behavior.<\/li>\n<\/ul>\n\n<h4>0.7.0<\/h4>\n\n<ul>\n<li>Refined dashboard hierarchy, spacing, responsive controls, progress treatment, and results table.<\/li>\n<li>Added clear Live, Partial, Limited, and Complete result states with accurate live metric labels.<\/li>\n<li>Replaced absolute scan paths with concise uploads-relative scope labels.<\/li>\n<li>Kept filtering, sorting, and row selection usable during batched scans.<\/li>\n<li>Fixed sticky table headers bleeding into result rows and improved progress accessibility.<\/li>\n<\/ul>\n\n<h4>0.6.1<\/h4>\n\n<ul>\n<li>Added complete PHPDoc to the admin controller and scan-job helpers.<\/li>\n<li>Documented JavaScript batching, cancellation, race handling, and trust boundaries.<\/li>\n<li>Added a developer architecture guide covering state, safety invariants, and extension hooks.<\/li>\n<\/ul>\n\n<h4>0.6.0<\/h4>\n\n<ul>\n<li>Converted dashboard reference checks to persistent batches of 25 candidates.<\/li>\n<li>Added live candidate counts and percentage progress.<\/li>\n<li>Added Stop scan with saved, clearly marked partial findings.<\/li>\n<li>Allowed dry-run and quarantine review against stopped results.<\/li>\n<li>Added race-safe stop markers and 30-minute per-user scan jobs.<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>Revalidate attachment metadata and database references immediately before every action.<\/li>\n<li>Block files that became referenced after the scan.<\/li>\n<li>Use WordPress <code>wp_delete_file()<\/code> for standalone-file removal.<\/li>\n<li>Added lifecycle hooks for quarantine, backup-and-remove, and deletion.<\/li>\n<li>Excluded UploadSleuth's own settings and transients from reference matching.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Added a CLI Reference dashboard tab.<\/li>\n<li>Documented every plugin command option and common global WP-CLI parameters.<\/li>\n<li>Added one-click copying for complete command recipes.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Added verified Backup &amp; remove actions to the dashboard and WP-CLI.<\/li>\n<li>Added live browser-console scan heartbeats and final diagnostic summaries.<\/li>\n<li>Added WP-CLI inventory, reference-index, and database-check progress messages.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Rebuilt the admin experience with AJAX scanning and file actions.<\/li>\n<li>Added result summaries, filtering, sorting, persistent findings, and action reports.<\/li>\n<li>Added size and age CLI filters, summary-only and CI modes, guarded deletion, and richer metrics.<\/li>\n<li>Hardened path validation and excluded quarantine files from future scans.<\/li>\n<li>Added comprehensive project and WordPress.org documentation.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Find files that may be unused in WordPress uploads, spot missing Media Library files, and safely review, quarantine, back up, or delete them.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/366260","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=366260"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/eboxnet"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=366260"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=366260"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=366260"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=366260"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=366260"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=366260"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}