{"id":289568,"date":"2026-03-30T16:01:43","date_gmt":"2026-03-30T16:01:43","guid":{"rendered":"https:\/\/en-ca.wordpress.org\/plugins\/delete-unused-images\/"},"modified":"2026-10-15T01:13:44","modified_gmt":"2026-10-15T01:13:44","slug":"oli-media-cleaner","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/oli-media-cleaner\/","author":14492344,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.21","stable_tag":"1.5.21","tested":"7.1.3","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Oli Media Cleaner","header_author":"Olivier Bigras","header_description":"Scan and remove unused media files from your WordPress site to free up disk space. Deep scans post content, ACF fields, WooCommerce, Elementor, theme files, widgets, and more.","assets_banners_color":"2d2d2d","last_updated":"2026-10-15 01:13:44","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.paypal.com\/donate\/?hosted_button_id=29SAPKFAHMTNW","header_plugin_uri":"https:\/\/github.com\/bigrat95\/oli-media-cleaner","header_author_uri":"https:\/\/olivierbigras.com","rating":0,"author_block_rating":0,"active_installs":100,"downloads":1409,"num_ratings":0,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.0":{"tag":"1.5.0","author":"bigrat95","date":"2026-03-30 16:01:08","revision":3494793},"1.5.1":{"tag":"1.5.1","author":"bigrat95","date":"2026-08-24 15:30:05","revision":3663801},"1.5.10":{"tag":"1.5.10","author":"bigrat95","date":"2026-10-09 18:49:09","revision":3737215},"1.5.11":{"tag":"1.5.11","author":"bigrat95","date":"2026-10-09 19:00:16","revision":3737226},"1.5.12":{"tag":"1.5.12","author":"bigrat95","date":"2026-10-12 23:02:19","revision":3742595},"1.5.13":{"tag":"1.5.13","author":"bigrat95","date":"2026-10-12 23:07:03","revision":3742599},"1.5.15":{"tag":"1.5.15","author":"bigrat95","date":"2026-10-12 23:27:18","revision":3742608},"1.5.2":{"tag":"1.5.2","author":"bigrat95","date":"2026-09-10 18:03:51","revision":3690310},"1.5.20":{"tag":"1.5.20","author":"bigrat95","date":"2026-10-13 17:43:10","revision":3744576},"1.5.21":{"tag":"1.5.21","author":"bigrat95","date":"2026-10-15 01:13:44","revision":3747405},"1.5.3":{"tag":"1.5.3","author":"bigrat95","date":"2026-09-29 18:08:48","revision":3719587},"1.5.4":{"tag":"1.5.4","author":"bigrat95","date":"2026-10-09 18:26:28","revision":3737187},"1.5.5":{"tag":"1.5.5","author":"bigrat95","date":"2026-10-09 18:32:35","revision":3737195},"1.5.6":{"tag":"1.5.6","author":"bigrat95","date":"2026-10-09 18:35:18","revision":3737199},"1.5.7":{"tag":"1.5.7","author":"bigrat95","date":"2026-10-09 18:38:28","revision":3737208},"1.5.8":{"tag":"1.5.8","author":"bigrat95","date":"2026-10-09 18:41:21","revision":3737211},"1.5.9":{"tag":"1.5.9","author":"bigrat95","date":"2026-10-09 18:46:34","revision":3737214}},"upgrade_notice":{"1.5.21":"<p>Protection system for files referenced outside WordPress. Add paths\/URLs\/globs to settings or use per-file checkboxes to prevent deletion.<\/p>","1.5.20":"<p>Shared files stay on disk even if an attachment is trashed or deleted outside this plugin, including by Imagify. A previous scan result is no longer treated as proof that a file is in use.<\/p>","1.5.19":"<p>Fixes linked files missed inside HTML, and stops permanent delete from removing a file that another attachment still uses. Update before deleting anything the 1.5.18 scan flagged.<\/p>","1.5.18":"<p>Fixes missed ACF fields whose names contain a hyphen, and upload URLs on Bedrock (\/app\/uploads). Non-ACF meta is scanned again. Update before deleting anything the 1.5.17 scan flagged.<\/p>","1.5.17":"<p>Fixes ACF media detection on large sites (no per-key LIKE scans). Failed scans no longer flag media as unused.<\/p>","1.5.16":"<p>Critical fix for ACF image\/file usage detection; scheduled tasks no longer trash media automatically.<\/p>","1.5.15":"<p>CSV export now includes a Status column and covers Unused, Whitelist, and Trash in one file.<\/p>","1.5.14":"<p>&quot;Trash All Unused&quot; is now always available on the Unused tab when there are unused items.<\/p>","1.5.13":"<p>Clearer bulk actions: selection-only buttons on Whitelist\/Trash, Remove All from Whitelist, stronger Empty Trash warning.<\/p>","1.5.12":"<p>Adds Settings and Donate links on the Plugins screen, plus an optional support notice in the Media Cleaner UI.<\/p>","1.5.11":"<p>Your &quot;per page&quot; choice is now remembered, so pagination stays consistent after reloads instead of resetting to 20.<\/p>","1.5.10":"<p>Removes the redundant second &quot;Select All&quot; checkbox; the table header checkbox selects all.<\/p>","1.5.9":"<p>Adds a CSV export of the current (filtered) list for offline analysis in a spreadsheet.<\/p>","1.5.8":"<p>&quot;Trash Selected&quot; and &quot;Whitelist Selected&quot; now appear only when at least one item is selected.<\/p>","1.5.7":"<p>Adds a &quot;Restore All&quot; button to the Trash tab for one-click bulk restore of every trashed file.<\/p>","1.5.6":"<p>The &quot;Trash All Unused&quot; button now only shows when more than one item is selected.<\/p>","1.5.5":"<p>Fixes the file type filter being empty until a page refresh after scanning, and adds clearer &quot;working&quot; feedback while a scan starts up.<\/p>","1.5.4":"<p>Confirms compatibility with WordPress 7.1 and removes the &quot;untested with your version of WordPress&quot; warning.<\/p>","1.5.3":"<p>Adds bundled translations for 200+ WordPress.org locales, English (Canada\/UK) support, and a complete translation template for GlotPress.<\/p>","1.5.2":"<p>Fixes bulk action buttons not appearing when switching to the Trash or Whitelist tab.<\/p>","1.5.1":"<p>Fixes false unused-media positives for ACF galleries stored inside clone fields.<\/p>","1.5.0":"<p>Adds Empty Trash, taxonomy image scanning, and live tab count updates.<\/p>","1.4.0":"<p>Fixes all WordPress Plugin Check errors for WP.org compliance.<\/p>","1.3.0":"<p>Adds column sorting and file type filter.<\/p>","1.2.0":"<p>Adds search functionality to filter images.<\/p>","1.1.0":"<p>Adds Trash All button and scheduled auto-cleanup.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":0},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3507455,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3507455,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3507461,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3507461,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.0","1.5.1","1.5.10","1.5.11","1.5.12","1.5.13","1.5.15","1.5.2","1.5.20","1.5.21","1.5.3","1.5.4","1.5.5","1.5.6","1.5.7","1.5.8","1.5.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3494793,"resolution":"1","location":"assets","locale":"","width":1109,"height":871},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3494793,"resolution":"2","location":"assets","locale":"","width":1109,"height":871}},"screenshots":{"1":"Main dashboard with stats cards and scan button","2":"Unused media list with bulk actions","3":"Whitelist tab","4":"Scan sources information panel"}},"plugin_section":[],"plugin_tags":[3786,17705,84,227565,146945],"plugin_category":[50],"plugin_contributors":[256856],"plugin_business_model":[],"class_list":["post-289568","plugin","type-plugin","status-publish","hentry","plugin_tags-cleanup","plugin_tags-disk-space","plugin_tags-media","plugin_tags-media-cleaner","plugin_tags-unused-images","plugin_category-media","plugin_contributors-bigrat95","plugin_committers-bigrat95"],"banners":{"banner":"https:\/\/ps.w.org\/oli-media-cleaner\/assets\/banner-772x250.png?rev=3507461","banner_2x":"https:\/\/ps.w.org\/oli-media-cleaner\/assets\/banner-1544x500.png?rev=3507461","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/oli-media-cleaner\/assets\/icon-128x128.png?rev=3507455","icon_2x":"https:\/\/ps.w.org\/oli-media-cleaner\/assets\/icon-256x256.png?rev=3507455","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/oli-media-cleaner\/assets\/screenshot-1.png?rev=3494793","caption":"Main dashboard with stats cards and scan button"},{"src":"https:\/\/ps.w.org\/oli-media-cleaner\/assets\/screenshot-2.png?rev=3494793","caption":"Unused media list with bulk actions"}],"raw_content":"<!--section=description-->\n<p><strong>Oli Media Cleaner<\/strong> scans your entire WordPress site to find media files that are no longer in use. It performs a deep analysis across multiple sources to accurately determine which files are safe to remove.<\/p>\n\n<h4>What Gets Scanned<\/h4>\n\n<ul>\n<li><strong>Post &amp; page content<\/strong> \u2014 all post types, Gutenberg blocks, classic editor<\/li>\n<li><strong>Featured images<\/strong> \u2014 all post types including WooCommerce product variations<\/li>\n<li><strong>Custom fields (post meta)<\/strong> \u2014 any plugin or theme that stores attachment IDs or URLs<\/li>\n<li><strong>ACF (Advanced Custom Fields)<\/strong> \u2014 image, file, gallery, repeater, flexible content, group, clone fields, and Options pages<\/li>\n<li><strong>WooCommerce<\/strong> \u2014 product galleries, variation images<\/li>\n<li><strong>Elementor<\/strong> \u2014 page builder widget data<\/li>\n<li><strong>Theme files<\/strong> \u2014 PHP, CSS, JS templates scanned for hardcoded image references<\/li>\n<li><strong>CSS background images<\/strong> \u2014 inline styles in post content<\/li>\n<li><strong>Widgets<\/strong> \u2014 image, gallery, text, custom HTML widgets<\/li>\n<li><strong>Site identity<\/strong> \u2014 site logo, site icon, theme mods<\/li>\n<li><strong>Serialized data<\/strong> \u2014 deep scan of complex plugin data structures<\/li>\n<\/ul>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Batch scanning<\/strong> \u2014 processes 50 attachments per batch to avoid timeouts<\/li>\n<li><strong>Whitelist<\/strong> \u2014 protect files you want to keep even if unused<\/li>\n<li><strong>Bulk actions<\/strong> \u2014 trash, whitelist, restore, or permanently delete multiple files at once<\/li>\n<li><strong>CSV export<\/strong> \u2014 export the current view (respects search, type filter, and sort) for offline analysis in Excel, Numbers, or Google Sheets<\/li>\n<li><strong>Trash All<\/strong> \u2014 one-click batch trash of all unused images with progress bar (handles thousands)<\/li>\n<li><strong>Scheduled auto-cleanup<\/strong> \u2014 enable daily, twice daily, or weekly automatic scan and trash via WP-Cron<\/li>\n<li><strong>Progress bar<\/strong> \u2014 real-time scanning progress<\/li>\n<li><strong>No external dependencies<\/strong> \u2014 uses native WordPress admin styles, no Bootstrap or jQuery UI<\/li>\n<li><strong>Zero custom database tables<\/strong> \u2014 stores data in WordPress options<\/li>\n<li><strong>Clean uninstall<\/strong> \u2014 removes all plugin data on deletion<\/li>\n<\/ul>\n\n<h4>How to Use<\/h4>\n\n<ol>\n<li>Go to <strong>Media Cleaner<\/strong> under <strong>Media<\/strong> in the WordPress admin sidebar<\/li>\n<li>Click <strong>Scan for Unused Media<\/strong><\/li>\n<li>Review the results in the <strong>Unused<\/strong> tab<\/li>\n<li><strong>Whitelist<\/strong> any files you want to keep<\/li>\n<li><strong>Trash<\/strong> files you don't need<\/li>\n<li>Go to the <strong>Trash<\/strong> tab to permanently delete or restore files<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>oli-media-cleaner<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress<\/li>\n<li>Go to <strong>Media Cleaner<\/strong> under <strong>Media<\/strong> in the admin sidebar<\/li>\n<li>Click <strong>Scan for Unused Media<\/strong> to start<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20it%20safe%20to%20delete%20unused%20media%3F\"><h3>Is it safe to delete unused media?<\/h3><\/dt>\n<dd><p>The plugin moves files to WordPress trash first. You can review and restore them before permanently deleting. We recommend making a full backup before any bulk deletion.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20acf%3F\"><h3>Does it work with ACF?<\/h3><\/dt>\n<dd><p>Yes. The plugin uses the ACF API to discover all field groups and recursively scans image, file, gallery, repeater, flexible content, group, and clone fields \u2014 including ACF Options pages.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. Product featured images, gallery images, and variation images are all detected as \"in use.\"<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20elementor%3F\"><h3>Does it work with Elementor?<\/h3><\/dt>\n<dd><p>Yes. The plugin scans Elementor's <code>_elementor_data<\/code> post meta for image references.<\/p><\/dd>\n<dt id=\"does%20it%20scan%20theme%20files%3F\"><h3>Does it scan theme files?<\/h3><\/dt>\n<dd><p>Yes. All PHP, CSS, and JS files in the active theme (and parent theme) are scanned for hardcoded references to <code>wp-content\/uploads\/<\/code>.<\/p><\/dd>\n<dt id=\"what%20about%20images%20hardcoded%20in%20theme%20templates%3F\"><h3>What about images hardcoded in theme templates?<\/h3><\/dt>\n<dd><p>Those are detected by the theme file scanner. It finds both URL paths and <code>wp_get_attachment_image()<\/code> function calls.<\/p><\/dd>\n<dt id=\"can%20i%20whitelist%20images%3F\"><h3>Can I whitelist images?<\/h3><\/dt>\n<dd><p>Yes. You can whitelist individual images or use bulk select to whitelist multiple at once. Whitelisted images are never flagged as unused.<\/p><\/dd>\n<dt id=\"which%20languages%20are%20supported%3F\"><h3>Which languages are supported?<\/h3><\/dt>\n<dd><p>The plugin ships with complete translations for every locale listed on <a href=\"https:\/\/translate.wordpress.org\/projects\/wp-plugins\/oli-media-cleaner\/\">translate.wordpress.org<\/a> (except joke locales such as Emoji and Pirate). Unique translations cover major languages including French, German, Spanish, Italian, Portuguese, Dutch, Japanese, Chinese, Korean, Russian, Polish, Arabic, Turkish, Hebrew, Hindi, Indonesian, Vietnamese, Thai, and many more, plus regional variants (Swiss German, Latin American Spanish, Brazilian vs European Portuguese, and others). Improvements can still be contributed on GlotPress.<\/p><\/dd>\n<dt id=\"does%20it%20create%20custom%20database%20tables%3F\"><h3>Does it create custom database tables?<\/h3><\/dt>\n<dd><p>No. The plugin uses WordPress options only. Clean and lightweight.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.21<\/h4>\n\n<ul>\n<li>NEW: Protection system for externally referenced files \u2014 prevent deletion of files still in use outside WordPress (e.g. receipts, external systems)<\/li>\n<li>NEW: Global protected paths setting \u2014 protect files by path, URL, or glob pattern (one per line in settings)<\/li>\n<li>NEW: Per-attachment protection checkbox \u2014 \"Protect from deletion\" in the attachment edit screen and media modal<\/li>\n<li>FIX: Protected files are never listed as unused by the scan and all deletion attempts (AJAX, bulk, cron, background) are refused server-side with clear admin messages<\/li>\n<li>CHANGE: Thumbnails and derivative files (.webp, .avif) are automatically protected when their original is protected<\/li>\n<\/ul>\n\n<h4>1.5.20<\/h4>\n\n<ul>\n<li>FIX: A file that another attachment still references is kept on every deletion path. Trash, the 30-day empty, and the Media Library go through the same guard. Imagify is not allowed to delete the WebP, AVIF, or backup of a shared file<\/li>\n<li>FIX: The plugin's own options, transients, and meta are ignored while scanning, so a previous result list is not treated as usage<\/li>\n<li>FIX: Edited-image backups in _wp_attachment_backup_sizes count as shared files. The file index is read once per request<\/li>\n<\/ul>\n\n<h4>1.5.19<\/h4>\n\n<ul>\n<li>FIX: Upload URLs inside HTML stop at the closing quote, tag, parenthesis, query string, or anchor, so a linked file such as a PDF in page content is kept<\/li>\n<li>FIX: An attachment that shares its file or a generated size with an attachment that is in use is marked used. Permanent delete never unlinks a file another attachment still references<\/li>\n<\/ul>\n\n<h4>1.5.18<\/h4>\n\n<ul>\n<li>FIX: ACF meta keys that contain a hyphen (for example highlight-image) are included. Values are passed through $wpdb-&gt;prepare() instead of being dropped by a character whitelist<\/li>\n<li>FIX: Upload URL detection uses wp_upload_dir() (base URL, protocol-less URL, path, and directory, including multisite) so Bedrock sites under \/app\/uploads match the ACF URL return format<\/li>\n<li>FIX: When ACF is active, a chunked raw-meta pass still counts non-ACF references (page builders, SEO, serialized IDs, URLs in meta) as used<\/li>\n<li>CHANGE: AJAX and cron keep separate scan state, a lock, and a pending-results option so they cannot overwrite each other or rewrite the full unused list on every batch<\/li>\n<\/ul>\n\n<h4>1.5.17<\/h4>\n\n<ul>\n<li>FIX: ACF image fields (including the default array return format on custom post types such as concert) are detected with indexed meta_key lookups from acf_get_field_groups() \/ acf_get_fields(), instead of one LIKE query per stored key<\/li>\n<li>FIX: Load ACF local JSON and PHP field groups before scanning, so cron does not miss field groups that are not registered yet<\/li>\n<li>FIX: Nested repeater, flexible content, group and clone fields (for example content_blocks_4_image_carousel_images) are resolved from the ACF reference meta, then loaded in batches<\/li>\n<li>FIX: If ACF is inactive or field groups cannot be resolved, a chunked raw-meta scan is used. An incomplete or failed scan marks nothing as unused<\/li>\n<li>CHANGE: Scans resume across AJAX and cron requests. Scheduled runs still only scan \u2014 they never trash or delete media<\/li>\n<\/ul>\n\n<h4>1.5.16<\/h4>\n\n<ul>\n<li>FIX: Reliable ACF attachment detection from raw post meta (including <code>_field<\/code> references), even when ACF is inactive \u2014 fixes false \u201cunused\u201d results for CPT fields such as concert <code>image<\/code> (ID, array, and URL return formats)<\/li>\n<li>FIX: Gallery and repeater\/flexible\/clone sub-fields, options pages, term meta, and user meta are scanned with a generic fallback for any attachment ID stored in meta<\/li>\n<li>CHANGE: Scheduled auto-cleanup now runs a scan only; media are never trashed or deleted automatically (manual confirmation still required in the admin)<\/li>\n<li>CHANGE: Trash and delete confirmations show a filename preview; trash actions remind you that files go to Media Trash first<\/li>\n<\/ul>\n\n<h4>1.5.15<\/h4>\n\n<ul>\n<li>NEW: CSV export includes a Status column (Unused \/ Whitelist \/ Trash) and exports all three categories in one file so you can filter\/categorize in a spreadsheet. Search, type filter, and sort still apply.<\/li>\n<\/ul>\n\n<h4>1.5.14<\/h4>\n\n<ul>\n<li>CHANGE: \"Trash All Unused\" is always visible on the Unused tab when there are unused items \u2014 no selection required<\/li>\n<\/ul>\n\n<h4>1.5.13<\/h4>\n\n<ul>\n<li>CHANGE: Whitelist and Trash selection actions (Remove from Whitelist, Restore Selected, Delete Selected) only appear when items are selected<\/li>\n<li>NEW: \"Remove All from Whitelist\" always visible when the Whitelist tab has items<\/li>\n<li>CHANGE: \"Restore All\" and \"Empty Trash\" always visible when the Trash tab has items; \"Delete Permanently\" renamed to \"Delete Selected\"<\/li>\n<li>CHANGE: Empty Trash confirmation now warns that the action is irreversible and recommends a backup first<\/li>\n<\/ul>\n\n<h4>1.5.12<\/h4>\n\n<ul>\n<li>NEW: Settings and Donate links on the Plugins screen (Settings opens Media &gt; Media Cleaner)<\/li>\n<li>NEW: Optional support notice on the Media Cleaner screen (dismissible per user) and a small footer donation link<\/li>\n<li>NEW: Donate link on the WordPress.org plugin page (PayPal)<\/li>\n<\/ul>\n\n<h4>1.5.11<\/h4>\n\n<ul>\n<li>CHANGE: The \"per page\" selection (20 \/ 50 \/ 100) is now remembered across page reloads and tab navigation, so the list and pagination keep showing your chosen page size instead of resetting to 20<\/li>\n<\/ul>\n\n<h4>1.5.10<\/h4>\n\n<ul>\n<li>CHANGE: Removed the duplicate \"Select All\" checkbox from the toolbar \u2014 the standard checkbox in the table header column now handles select all<\/li>\n<\/ul>\n\n<h4>1.5.9<\/h4>\n\n<ul>\n<li>NEW: Export to CSV \u2014 an \"Export CSV\" button exports the current list for analysis in a spreadsheet. The export honors the active tab, search, file-type filter, and sort order, and includes every matching row (not just the current page). Columns: ID, title, filename, URL, type, MIME type, size in bytes, human-readable size, and date<\/li>\n<\/ul>\n\n<h4>1.5.8<\/h4>\n\n<ul>\n<li>CHANGE: The \"Trash Selected\" and \"Whitelist Selected\" buttons on the Unused tab now appear only when at least one item is selected, keeping the toolbar clean until there is something to act on<\/li>\n<\/ul>\n\n<h4>1.5.7<\/h4>\n\n<ul>\n<li>NEW: \"Restore All\" button on the Trash tab \u2014 batch-restores every trashed file with a progress bar, no need to select items first (mirrors \"Empty Trash\")<\/li>\n<\/ul>\n\n<h4>1.5.6<\/h4>\n\n<ul>\n<li>CHANGE: The \"Trash All Unused\" button now appears only when more than one item is selected, so it stays out of the way until you are working with a batch<\/li>\n<\/ul>\n\n<h4>1.5.5<\/h4>\n\n<ul>\n<li>FIX: The file type filter is now populated immediately after a scan completes \u2014 no page refresh needed. The dropdown stays in sync with the latest scan results via AJAX<\/li>\n<li>NEW: Clearer scan feedback \u2014 the Scan button shows a spinner and the progress bar animates with an \"Analyzing your site\u2026\" message during the initial analysis step, so it is obvious the scan is working before the percentage starts counting<\/li>\n<\/ul>\n\n<h4>1.5.4<\/h4>\n\n<ul>\n<li>Confirmed compatibility with WordPress 7.1<\/li>\n<li>Updated \"Tested up to\" to 7.1 so the plugin no longer shows an \"untested with your version of WordPress\" warning<\/li>\n<\/ul>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li>Bundled translations for every WordPress.org locale (200+), including French, German, Spanish, Italian, Portuguese, Dutch, Japanese, Chinese, Korean, Russian, Arabic, and many more<\/li>\n<li>Regional variants (e.g. Swiss German, Latin American Spanish, Brazilian and European Portuguese)<\/li>\n<li>English (Canada) and English (UK) locale support<\/li>\n<li>All remaining admin JavaScript strings are now translatable<\/li>\n<li>Translation template (POT) for WordPress.org GlotPress<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>FIX: Bulk action toolbar now updates immediately when switching tabs<\/li>\n<li>Restore Selected, Delete Permanently, and Empty Trash appear on the Trash tab without a page refresh<\/li>\n<li>Trash All Unused is hidden when viewing Whitelist or Trash<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>FIX: Detect ACF gallery\/image\/file fields nested inside clone fields (e.g. flexible content \u2192 clone \u2192 gallery)<\/li>\n<li>Clone field groups and individual cloned fields are now resolved via the ACF API<\/li>\n<li>Nested clone-prefixed meta keys (e.g. content_blocks_4_image_carousel_images) are treated as used<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Renamed plugin from \"Delete Unused Images\" to \"Oli Media Cleaner\"<\/li>\n<li>New slug: oli-media-cleaner, new prefix: olimc_<\/li>\n<li>Added \"Empty Trash\" button \u2014 batch-deletes all trashed attachments with progress bar<\/li>\n<li>Added taxonomy image scanning: WooCommerce category thumbnails, term descriptions, attribute descriptions<\/li>\n<li>Added termmeta deep scan for images stored by third-party plugins<\/li>\n<li>Live tab count updates during Trash All and Empty Trash batch operations<\/li>\n<li>Fixed trash tab count not updating after single\/bulk trash, delete, or restore actions<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Fixed all WordPress Plugin Check errors<\/li>\n<li>Proper output escaping (esc_html_e, esc_html__, esc_html)<\/li>\n<li>Translators comments for all placeholder strings<\/li>\n<li>Ordered placeholders (%1$d, %2$d) for multi-placeholder strings<\/li>\n<li>Fixed SQL preparation: inline $wpdb-&gt;prepare(), esc_like() for LIKE queries<\/li>\n<li>Dynamic file type filter (only shows detected extensions)<\/li>\n<li>Per-page selector (20, 50, 100)<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Clickable column headers to sort by Name, Size, Type, or Date (asc\/desc)<\/li>\n<li>File type filter dropdown (JPG, PNG, GIF, WebP, SVG, PDF, MP4)<\/li>\n<li>Sort indicators (arrows) on active column<\/li>\n<li>Filters, sort, and search all reset when switching tabs<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added search box to filter images by name, filename, type, or ID<\/li>\n<li>Search works across all tabs (Unused, Whitelist, Trash)<\/li>\n<li>Search clears automatically when switching tabs<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added \"Trash All Unused\" button \u2014 batch-processes all unused images with progress bar<\/li>\n<li>Added scheduled auto-cleanup via WP-Cron (daily, twice daily, or weekly)<\/li>\n<li>Settings panel for enabling\/disabling auto-cleanup and choosing frequency<\/li>\n<li>Native WordPress admin UI refinements (postbox, form-table, nav-tab-wrapper, widefat)<\/li>\n<li>Reduced custom CSS from 500+ lines to ~20 lines<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Deep scanning: post content, featured images, post meta, ACF fields, WooCommerce, Elementor, theme files, widgets, site identity<\/li>\n<li>Whitelist feature with bulk actions<\/li>\n<li>Trash and permanent delete with bulk actions<\/li>\n<li>Progress bar during scan<\/li>\n<li>\"What was scanned?\" info panel<\/li>\n<li>Native WordPress admin UI \u2014 no external dependencies<\/li>\n<\/ul>","raw_excerpt":"Scan and remove unused media files from your WordPress site to free up disk space.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/289568","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=289568"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bigrat95"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=289568"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=289568"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=289568"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=289568"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=289568"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=289568"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}