=== Oli Media Cleaner === Contributors: bigrat95 Tags: media, cleanup, unused images, media cleaner, disk space Requires at least: 5.8 Tested up to: 6.9 Requires PHP: 7.4 Stable tag: 1.5.2 License: GPL-2.0-or-later License URI: https://www.gnu.org/licenses/gpl-2.0.html Scan and remove unused media files from your WordPress site to free up disk space. == Description == **Oli Media Cleaner** 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. = What Gets Scanned = * **Post & page content** — all post types, Gutenberg blocks, classic editor * **Featured images** — all post types including WooCommerce product variations * **Custom fields (post meta)** — any plugin or theme that stores attachment IDs or URLs * **ACF (Advanced Custom Fields)** — image, file, gallery, repeater, flexible content, group, clone fields, and Options pages * **WooCommerce** — product galleries, variation images * **Elementor** — page builder widget data * **Theme files** — PHP, CSS, JS templates scanned for hardcoded image references * **CSS background images** — inline styles in post content * **Widgets** — image, gallery, text, custom HTML widgets * **Site identity** — site logo, site icon, theme mods * **Serialized data** — deep scan of complex plugin data structures = Features = * **Batch scanning** — processes 50 attachments per batch to avoid timeouts * **Whitelist** — protect files you want to keep even if unused * **Bulk actions** — trash, whitelist, restore, or permanently delete multiple files at once * **Trash All** — one-click batch trash of all unused images with progress bar (handles thousands) * **Scheduled auto-cleanup** — enable daily, twice daily, or weekly automatic scan and trash via WP-Cron * **Progress bar** — real-time scanning progress * **No external dependencies** — uses native WordPress admin styles, no Bootstrap or jQuery UI * **Zero custom database tables** — stores data in WordPress options * **Clean uninstall** — removes all plugin data on deletion = How to Use = 1. Go to **Oli Media Cleaner** under **Media** in the WordPress admin sidebar 2. Click **Scan for Unused Media** 3. Review the results in the **Unused** tab 4. **Whitelist** any files you want to keep 5. **Trash** files you don't need 6. Go to the **Trash** tab to permanently delete or restore files == Installation == 1. Upload the `oli-media-cleaner` folder to `/wp-content/plugins/` 2. Activate the plugin through the **Plugins** menu in WordPress 3. Go to **Oli Media Cleaner** under **Media** in the admin sidebar 4. Click **Scan for Unused Media** to start == Frequently Asked Questions == = Is it safe to delete unused media? = 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. = Does it work with ACF? = 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 — including ACF Options pages. = Does it work with WooCommerce? = Yes. Product featured images, gallery images, and variation images are all detected as "in use." = Does it work with Elementor? = Yes. The plugin scans Elementor's `_elementor_data` post meta for image references. = Does it scan theme files? = Yes. All PHP, CSS, and JS files in the active theme (and parent theme) are scanned for hardcoded references to `wp-content/uploads/`. = What about images hardcoded in theme templates? = Those are detected by the theme file scanner. It finds both URL paths and `wp_get_attachment_image()` function calls. = Can I whitelist images? = Yes. You can whitelist individual images or use bulk select to whitelist multiple at once. Whitelisted images are never flagged as unused. = Does it create custom database tables? = No. The plugin uses WordPress options only. Clean and lightweight. == 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 == Changelog == = 1.5.2 = * FIX: Bulk action toolbar now updates immediately when switching tabs * Restore Selected, Delete Permanently, and Empty Trash appear on the Trash tab without a page refresh * Trash All Unused is hidden when viewing Whitelist or Trash = 1.5.1 = * FIX: Detect ACF gallery/image/file fields nested inside clone fields (e.g. flexible content → clone → gallery) * Clone field groups and individual cloned fields are now resolved via the ACF API * Nested clone-prefixed meta keys (e.g. content_blocks_4_image_carousel_images) are treated as used = 1.5.0 = * Renamed plugin from "Delete Unused Images" to "Oli Media Cleaner" * New slug: oli-media-cleaner, new prefix: olimc_ * Added "Empty Trash" button — batch-deletes all trashed attachments with progress bar * Added taxonomy image scanning: WooCommerce category thumbnails, term descriptions, attribute descriptions * Added termmeta deep scan for images stored by third-party plugins * Live tab count updates during Trash All and Empty Trash batch operations * Fixed trash tab count not updating after single/bulk trash, delete, or restore actions = 1.4.0 = * Fixed all WordPress Plugin Check errors * Proper output escaping (esc_html_e, esc_html__, esc_html) * Translators comments for all placeholder strings * Ordered placeholders (%1$d, %2$d) for multi-placeholder strings * Fixed SQL preparation: inline $wpdb->prepare(), esc_like() for LIKE queries * Dynamic file type filter (only shows detected extensions) * Per-page selector (20, 50, 100) = 1.3.0 = * Clickable column headers to sort by Name, Size, Type, or Date (asc/desc) * File type filter dropdown (JPG, PNG, GIF, WebP, SVG, PDF, MP4) * Sort indicators (arrows) on active column * Filters, sort, and search all reset when switching tabs = 1.2.0 = * Added search box to filter images by name, filename, type, or ID * Search works across all tabs (Unused, Whitelist, Trash) * Search clears automatically when switching tabs = 1.1.0 = * Added "Trash All Unused" button — batch-processes all unused images with progress bar * Added scheduled auto-cleanup via WP-Cron (daily, twice daily, or weekly) * Settings panel for enabling/disabling auto-cleanup and choosing frequency * Native WordPress admin UI refinements (postbox, form-table, nav-tab-wrapper, widefat) * Reduced custom CSS from 500+ lines to ~20 lines = 1.0.0 = * Initial release * Deep scanning: post content, featured images, post meta, ACF fields, WooCommerce, Elementor, theme files, widgets, site identity * Whitelist feature with bulk actions * Trash and permanent delete with bulk actions * Progress bar during scan * "What was scanned?" info panel * Native WordPress admin UI — no external dependencies == Upgrade Notice == = 1.5.2 = Fixes bulk action buttons not appearing when switching to the Trash or Whitelist tab. = 1.5.1 = Fixes false unused-media positives for ACF galleries stored inside clone fields. = 1.5.0 = Adds Empty Trash, taxonomy image scanning, and live tab count updates. = 1.4.0 = Fixes all WordPress Plugin Check errors for WP.org compliance. = 1.3.0 = Adds column sorting and file type filter. = 1.2.0 = Adds search functionality to filter images. = 1.1.0 = Adds Trash All button and scheduled auto-cleanup. = 1.0.0 = Initial release.