{"id":392954,"date":"2026-10-30T02:47:32","date_gmt":"2026-10-30T02:47:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ce-orphan\/"},"modified":"2026-10-31T01:52:16","modified_gmt":"2026-10-31T01:52:16","slug":"crushedge-orphaned-upload-cleaner","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/crushedge-orphaned-upload-cleaner\/","author":23593200,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.3","stable_tag":"1.3","tested":"7.1.4","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"CrushEdge Orphaned Upload Cleaner","header_author":"SepedaTua","header_description":"Detect and permanently delete orphaned uploads (files on disk without a Media Library attachment) with single or mass delete and sorting.","assets_banners_color":"1f5689","last_updated":"2026-10-31 01:52:16","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/ko-fi.com\/crushedge","header_plugin_uri":"https:\/\/crushedge.com\/how-to-find-and-delete-orphaned-uploads-in-wordpress-without-breaking-your-site\/","header_author_uri":"https:\/\/crushedge.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":80,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1":{"tag":"1.1","author":"sepedatua","date":"2026-10-30 02:47:22","revision":3774312},"1.2":{"tag":"1.2","author":"sepedatua","date":"2026-10-31 01:52:16","revision":3776257},"1.3":{"tag":"1.3","author":"sepedatua","date":"2026-10-31 01:52:16","revision":3776257}},"upgrade_notice":{"1.3":"<p>Major update: adds Trash Can safety quarantine with 1-click rollback\/restore, WordPress-style row actions, sticky table headers, 1-click path copy, smart image thumbnail &amp; derivative resolution, 3rd-party folder protection, custom exclusions, and full WordPress Plugin Check (PCP) compliance.<\/p>","1.2":"<p>Adds full localization for 10 major languages, fully translated interactive batch deletion modals, and improved textdomain loading.<\/p>","1.1":"<p>Official directory release for CrushEdge Orphaned Upload Cleaner.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3776257,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3776257,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3776257,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3776257,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1","1.2","1.3"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The main dashboard showing storage statistics, \"Only Orphan\" toggle, search, and sorting.","2":"Fixed-viewport batch deletion progress modal showing real-time disk space freed and stop button.","3":"Excluded Folders and Patterns management dialog.","4":"Trash Can quarantine view with 1-click single &amp; bulk restoration and Empty Trash controls."}},"plugin_section":[],"plugin_tags":[3786,84,17741,2216,85],"plugin_category":[50],"plugin_contributors":[289623],"plugin_business_model":[],"class_list":["post-392954","plugin","type-plugin","status-publish","hentry","plugin_tags-cleanup","plugin_tags-media","plugin_tags-orphan","plugin_tags-storage","plugin_tags-uploads","plugin_category-media","plugin_contributors-sepedatua","plugin_committers-sepedatua"],"banners":{"banner":"https:\/\/ps.w.org\/crushedge-orphaned-upload-cleaner\/assets\/banner-772x250.jpg?rev=3776257","banner_2x":"https:\/\/ps.w.org\/crushedge-orphaned-upload-cleaner\/assets\/banner-1544x500.jpg?rev=3776257","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/crushedge-orphaned-upload-cleaner\/assets\/icon-128x128.jpg?rev=3776257","icon_2x":"https:\/\/ps.w.org\/crushedge-orphaned-upload-cleaner\/assets\/icon-256x256.jpg?rev=3776257","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>CrushEdge Orphaned Upload Cleaner<\/strong> is a lightweight, high-performance maintenance plugin designed to detect and clean up orphaned files inside your <code>wp-content\/uploads\/<\/code> directory.<\/p>\n\n<h3>What is an \"Orphaned Upload\"?<\/h3>\n\n<p>In WordPress, an orphaned upload is a physical file present in your uploads directory that has <strong>no matching attachment record in the WordPress Media Library (<code>wp_posts<\/code>)<\/strong>, nor is it a registered thumbnail\/sub-size of an active attachment.<\/p>\n\n<p>These \"ghost files\" accumulate over time from:\n* Interrupted or cancelled media uploads.\n* Deleted Media Library items where PHP unlinking failed or was skipped.\n* Leftover files from uninstalled plugins, test imports, or manual FTP transfers.\n* Old resized thumbnails left behind after themes or plugins change thumbnail dimensions.<\/p>\n\n<h3>Key Features<\/h3>\n\n<ul>\n<li><strong>Trash Can Safety Quarantine:<\/strong> Default \"Move to Trash\" action safely isolates orphaned files inside a protected directory (<code>.crushedge-trash\/<\/code>) with web access lockdown (<code>.htaccess<\/code> and <code>web.config<\/code>), completely eliminating accidental data loss.<\/li>\n<li><strong>1-Click Single &amp; Bulk Restore:<\/strong> Restore any file, selected files, or all files back to their original locations in <code>uploads\/<\/code> with a single click.<\/li>\n<li><strong>Empty Trash &amp; Permanent Purge:<\/strong> Safely purge individual files, selected items, or empty the entire Trash Can when ready.<\/li>\n<li><strong>WordPress-Style Row Actions:<\/strong> Clean hover action links under filenames (<code>Move to Trash | Delete Permanently | Ignore Folder<\/code> for active files; <code>Restore | Delete Forever<\/code> in Trash Can), keeping the primary action button column compact and uncluttered.<\/li>\n<li><strong>Sticky Table Headers:<\/strong> Table headers remain pinned to the top of the viewport (<code>position: sticky; top: 32px<\/code> desktop \/ <code>46px<\/code> mobile) when scrolling through long lists (20\u2013200 items), with automatic WordPress admin bar offset compensation.<\/li>\n<li><strong>1-Click \"Copy Path\" Badges:<\/strong> Clickable relative path badges (<code>uploads\/...<\/code>) with instant clipboard copy, animated checkmark feedback, and floating toast notifications.<\/li>\n<li><strong>In-App Confirmation Dialogs:<\/strong> Clean, responsive confirmation modals with file previews and metadata replacing browser alert popups.<\/li>\n<li><strong>Lightbox Image Preview:<\/strong> Click any image thumbnail to inspect high-resolution images in an inline modal without leaving the page.<\/li>\n<li><strong>\"Only Orphan\" Default:<\/strong> Automatically displays only orphaned uploads on load, with a single-click toggle to inspect all files in the uploads folder.<\/li>\n<li><strong>Smart Image Derivative Resolution:<\/strong> Intelligently recognizes auto-generated thumbnails (<code>-150x150<\/code>, <code>-300x200<\/code>), scaled images (<code>-scaled<\/code>), edits (<code>-e123...<\/code>), and modern Next-Gen companion files (<code>.webp<\/code>, <code>.avif<\/code>). If the parent image is in the Media Library, derivative files are automatically linked and protected from deletion.<\/li>\n<li><strong>Expanded Plugin Whitelist:<\/strong> Automatically shields 3rd-party plugin storage folders from being treated as orphans, including WordPress Download Manager (<code>download-manager-files<\/code>, <code>wpdm-files<\/code>), WooCommerce (<code>woocommerce_uploads<\/code>, <code>wc-logs<\/code>), Elementor, form uploads (Gravity Forms, WPForms, Fluent Forms, Formidable, Ninja Forms), backups (UpdraftPlus, Duplicator, All-in-One WP Migration), and caching systems.<\/li>\n<li><strong>User-Configurable Excluded Folders &amp; Patterns:<\/strong> Add custom folder names (e.g., <code>my-custom-folder<\/code>) or wildcard patterns (e.g., <code>*.zip<\/code>) to exclusions.<\/li>\n<li><strong>\"Ignore Folder\" Quick Action:<\/strong> Quickly ignore any folder right from the table row with date-structure warning protections.<\/li>\n<li><strong>Deep Scan Content Reference Checker:<\/strong> Cross-references published post and page HTML content to ensure files actively embedded on your site are locked and protected.<\/li>\n<li><strong>Developer Hooks:<\/strong> Fully extensible with <code>crushedge_orphan_protected_dirs<\/code>, <code>crushedge_orphan_protected_files<\/code>, and <code>crushedge_orphan_is_file_protected<\/code> filters.<\/li>\n<li><strong>Instant Sorting:<\/strong> Sort by File Name, Size, Modified Date, and Orphan Status (Ascending &amp; Descending).<\/li>\n<li><strong>Chunked Mass Actions:<\/strong> Processes mass move-to-trash, restore, and deletions in rapid asynchronous batches with live progress indicators.<\/li>\n<li><strong>Instant Cancel Support:<\/strong> Easily stop batch processing at any time with instant abort.<\/li>\n<li><strong>Live Search &amp; Pagination:<\/strong> Real-time search filter and customizable pagination (20, 50, 100, 200 items per page).<\/li>\n<li><strong>Path Traversal Guard:<\/strong> Strict directory containment verification preventing unauthorized access outside the uploads folder.<\/li>\n<li><strong>WordPress Plugin Check (PCP) Compliant:<\/strong> Built to the highest WordPress coding and security standards using <code>WP_Filesystem<\/code> and core <code>wp_delete_file()<\/code>.<\/li>\n<\/ul>\n\n<h3>Legal Disclaimer<\/h3>\n\n<p><strong>CRUSHEDGE ORPHANED UPLOAD CLEANER IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS, CONTRIBUTORS, OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES, LOSS OF DATA, WEBSITE DOWNTIME, OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT, OR OTHERWISE, ARISING FROM, OUT OF, OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.<\/strong><\/p>\n\n<p><strong>FILE DELETIONS ARE PERMANENT AND IRREVERSIBLE.<\/strong> Always create and verify a complete backup of your WordPress database and <code>wp-content\/uploads\/<\/code> directory before performing any cleanup or deletion operations.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>crushedge-orphaned-upload-cleaner<\/code> directory to your <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Navigate to <strong>Tools \u2192 CrushEdge Orphaned Upload Cleaner<\/strong> in your WordPress admin menu.<\/li>\n<li>Review the detected orphan files and perform single or bulk deletion.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20delete%20images%20that%20are%20used%20in%20my%20posts%3F\"><h3>Does this delete images that are used in my posts?<\/h3><\/dt>\n<dd><p>CrushEdge Orphaned Upload Cleaner cross-references files on disk against active Media Library attachment records, auto-generated derivative patterns, and includes a <strong>Deep Scan<\/strong> toggle to verify if an image is embedded inside published post and page HTML content.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20handle%20download%20manager%20or%20woocommerce%20files%3F\"><h3>How does the plugin handle Download Manager or WooCommerce files?<\/h3><\/dt>\n<dd><p>Common third-party directories like <code>download-manager-files<\/code>, <code>woocommerce_uploads<\/code>, form uploads, and page builder assets are whitelisted by default. You can also exclude any custom folder or pattern using the <strong>Excluded Folders<\/strong> tool or the <strong>Ignore Folder<\/strong> button.<\/p><\/dd>\n<dt id=\"what%20about%20small%20images%20and%20thumbnails%20generated%20automatically%3F\"><h3>What about small images and thumbnails generated automatically?<\/h3><\/dt>\n<dd><p>The plugin features a smart derivative detection engine that recognizes <code>{name}-{width}x{height}.{ext}<\/code> patterns as well as <code>.webp<\/code> and <code>.avif<\/code> companions. If the parent media item is registered in WordPress, these thumbnails are automatically protected and shielded from the orphan list.<\/p><\/dd>\n<dt id=\"can%20deleted%20files%20be%20recovered%3F\"><h3>Can deleted files be recovered?<\/h3><\/dt>\n<dd><p>Yes! When you move files to the <strong>Trash Can<\/strong>, they are safely quarantined in a hidden directory (<code>.crushedge-trash\/<\/code>). You can restore individual files, selected batches, or all files back to their exact original upload locations at any time. Only when you explicitly choose <strong>Delete Permanently<\/strong> or <strong>Empty Trash Can<\/strong> are files permanently deleted from disk.<\/p><\/dd>\n<dt id=\"what%20is%20the%20trash%20can%20quarantine%20feature%3F\"><h3>What is the Trash Can quarantine feature?<\/h3><\/dt>\n<dd><p>The Trash Can acts as an essential safety net against accidental data loss. Instead of immediately erasing files from disk, moving an item to the Trash Can moves the physical file into a quarantined directory (<code>wp-content\/uploads\/.crushedge-trash\/<\/code>) with web access blocked via <code>.htaccess<\/code> and <code>web.config<\/code>. This takes the file offline without destroying it, giving you total peace of mind to test your site before permanently purging.<\/p><\/dd>\n<dt id=\"are%20core%20system%20files%20safe%3F\"><h3>Are core system files safe?<\/h3><\/dt>\n<dd><p>Yes. Critical server and WordPress files such as <code>.htaccess<\/code>, <code>index.php<\/code>, <code>web.config<\/code>, and plugin cache\/style folders are automatically whitelisted and cannot be deleted.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.3<\/h4>\n\n<ul>\n<li><strong>Trash Can Safety Quarantine System:<\/strong> Added full two-stage deletion. Moving files to Trash Can safely isolates them into a protected directory (<code>wp-content\/uploads\/.crushedge-trash\/<\/code>) with <code>.htaccess<\/code>, <code>web.config<\/code>, and <code>index.php<\/code> security lockdown.<\/li>\n<li><strong>1-Click Single, Bulk &amp; All Restore:<\/strong> Added ability to restore any single file, multiple selected files, or all files back to their original upload folders with one click.<\/li>\n<li><strong>Empty Trash &amp; Permanent Purge:<\/strong> Added safe controls to permanently delete individual quarantined files, bulk purge selected items, or empty the entire Trash Can.<\/li>\n<li><strong>WordPress-Style Row Actions:<\/strong> Converted secondary actions to native hover row actions (<code>Move to Trash | Delete Permanently | Ignore Folder<\/code>), providing a cleaner, more streamlined action column.<\/li>\n<li><strong>Sticky Table Headers:<\/strong> Both Files on Disk and Trash Can table headers remain pinned (<code>position: sticky<\/code>) with WordPress admin bar offset compensation (<code>top: 32px<\/code> desktop \/ <code>top: 46px<\/code> mobile).<\/li>\n<li><strong>1-Click Copy Path Badges:<\/strong> Interactive relative path badges with instant clipboard copy, animated checkmark feedback, and toast notifications.<\/li>\n<li><strong>WordPress Plugin Check (PCP) Compliance:<\/strong> Replaced raw filesystem functions with <code>WP_Filesystem<\/code> (<code>move()<\/code>, <code>delete()<\/code>, <code>chmod()<\/code>, <code>rmdir()<\/code>, <code>get_contents()<\/code>) and core <code>wp_delete_file()<\/code>, added explicit <code>\/* translators: ... *\/<\/code> comments for all placeholder strings, and adopted WordPress 4.6+ automatic translation loading.<\/li>\n<li><strong>Smart Derivative &amp; Sub-Size Resolver:<\/strong> Added heuristic detection for generated image thumbnails (<code>-150x150<\/code>, <code>-300x200<\/code>), scaled images (<code>-scaled<\/code>), edits (<code>-e123...<\/code>), and modern WebP\/AVIF companions. Files linked to valid Media Library attachments are protected.<\/li>\n<li><strong>Expanded 3rd-Party Whitelist:<\/strong> Added built-in protection for WordPress Download Manager (<code>download-manager-files<\/code>, <code>wpdm-files<\/code>), WooCommerce, Elementor, Gravity Forms, WPForms, Fluent Forms, Formidable, Ninja Forms, and caching\/backup directories.<\/li>\n<li><strong>Developer Filters:<\/strong> Added <code>crushedge_orphan_protected_dirs<\/code>, <code>crushedge_orphan_protected_files<\/code>, <code>crushedge_orphan_is_file_protected<\/code>, and <code>crushedge_orphan_attached_files_map<\/code> hooks.<\/li>\n<li><strong>Custom Excluded Folders &amp; Patterns:<\/strong> Added modal and database settings (<code>crushedge_orphan_excluded_paths<\/code>) to exclude custom directories and wildcard patterns (<code>*.zip<\/code>, <code>*.pdf<\/code>).<\/li>\n<li><strong>\"Ignore Folder\" Action:<\/strong> Added one-click table row button to instantly ignore and protect any directory.<\/li>\n<li><strong>Deep Scan Content Reference Check:<\/strong> Added optional toggle to verify if candidate orphan files are actively embedded in published post or page HTML content.<\/li>\n<li><strong>Legal Disclaimer &amp; Safety Notice:<\/strong> Added prominent safety notice and limitation of liability disclaimer across plugin dashboard and documentation.<\/li>\n<li><strong>Ko-fi Support:<\/strong> Added Ko-fi donation link and button to support continued free development.<\/li>\n<\/ul>\n\n<h4>1.2<\/h4>\n\n<ul>\n<li>Complete internationalization (i18n) across entire admin dashboard, batch deletion modal, and live notifications.<\/li>\n<li>Added native translations for 10 major languages: Spanish (es_ES), German (de_DE), French (fr_FR), Japanese (ja), Portuguese (pt_BR), Indonesian (id_ID), Italian (it_IT), Dutch (nl_NL), Russian (ru_RU), and Simplified Chinese (zh_CN).<\/li>\n<li>Added explicit load_plugin_textdomain() initialization for offline and standalone environments.<\/li>\n<\/ul>\n\n<h4>1.1<\/h4>\n\n<ul>\n<li>Renamed plugin display name to CrushEdge Orphaned Upload Cleaner and slug to crushedge-orphaned-upload-cleaner.<\/li>\n<li>Updated donation link and directory metadata.<\/li>\n<\/ul>\n\n<h4>1.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>Interactive table with sorting by name, size, date, and orphan status.<\/li>\n<li>\"Only Orphan\" toggle filter enabled by default.<\/li>\n<li>Viewport-fixed progress modal with chunked batch processing and instant abort support.<\/li>\n<li>Nonce verification, permission checks, and path traversal protection.<\/li>\n<\/ul>","raw_excerpt":"Detect and permanently delete orphaned uploads (files physically present on disk without an attachment in the Media Library).","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/392954","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=392954"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sepedatua"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=392954"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=392954"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=392954"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=392954"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=392954"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=392954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}