{"id":296983,"date":"2026-04-30T00:24:38","date_gmt":"2026-04-30T00:24:38","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/olivero-media-audit\/"},"modified":"2026-06-14T02:17:24","modified_gmt":"2026-06-14T02:17:24","slug":"oliverodev-media-audit","status":"publish","type":"plugin","link":"https:\/\/bal.wordpress.org\/plugins\/oliverodev-media-audit\/","author":23475617,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"3.4.8","stable_tag":"3.4.8","tested":"7.0","requires":"5.0","requires_php":"7.4","requires_plugins":null,"header_name":"OliveroDev Media Audit \u2013 Media Library Cleaner & Optimizer","header_author":"Alexis Olivero","header_description":"Identifies which media library files are in use in WordPress content and allows you to delete unused ones.","assets_banners_color":"31405c","last_updated":"2026-06-14 02:17:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/oliverodev.com\/","rating":5,"author_block_rating":0,"active_installs":0,"downloads":854,"num_ratings":3,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"3.2.1":{"tag":"3.2.1","author":"oliverodev","date":"2026-04-30 00:27:34"},"3.2.2":{"tag":"3.2.2","author":"oliverodev","date":"2026-05-04 03:37:32"},"3.2.3":{"tag":"3.2.3","author":"oliverodev","date":"2026-05-04 03:54:54"},"3.2.4":{"tag":"3.2.4","author":"oliverodev","date":"2026-05-04 17:20:45"},"3.2.5":{"tag":"3.2.5","author":"oliverodev","date":"2026-05-19 13:55:57"},"3.2.6":{"tag":"3.2.6","author":"oliverodev","date":"2026-05-19 14:07:07"},"3.2.7":{"tag":"3.2.7","author":"oliverodev","date":"2026-05-19 15:53:07"},"3.2.8":{"tag":"3.2.8","author":"oliverodev","date":"2026-05-20 23:08:02"},"3.2.9":{"tag":"3.2.9","author":"oliverodev","date":"2026-05-21 14:10:18"},"3.3.0":{"tag":"3.3.0","author":"oliverodev","date":"2026-05-25 16:56:13"},"3.3.1":{"tag":"3.3.1","author":"oliverodev","date":"2026-05-25 18:26:27"},"3.3.10":{"tag":"3.3.10","author":"oliverodev","date":"2026-06-10 03:48:19"},"3.3.11":{"tag":"3.3.11","author":"oliverodev","date":"2026-06-10 04:43:08"},"3.3.2":{"tag":"3.3.2","author":"oliverodev","date":"2026-06-01 00:27:01"},"3.3.3":{"tag":"3.3.3","author":"oliverodev","date":"2026-06-01 01:56:12"},"3.3.4":{"tag":"3.3.4","author":"oliverodev","date":"2026-06-01 02:10:51"},"3.3.5":{"tag":"3.3.5","author":"oliverodev","date":"2026-06-01 03:13:27"},"3.3.6":{"tag":"3.3.6","author":"oliverodev","date":"2026-06-09 15:50:44"},"3.3.7":{"tag":"3.3.7","author":"oliverodev","date":"2026-06-09 16:58:24"},"3.3.8":{"tag":"3.3.8","author":"oliverodev","date":"2026-06-09 19:56:58"},"3.3.9":{"tag":"3.3.9","author":"oliverodev","date":"2026-06-09 21:10:27"},"3.4.0":{"tag":"3.4.0","author":"oliverodev","date":"2026-06-11 01:05:33"},"3.4.1":{"tag":"3.4.1","author":"oliverodev","date":"2026-06-11 01:25:11"},"3.4.2":{"tag":"3.4.2","author":"oliverodev","date":"2026-06-11 23:03:54"},"3.4.3":{"tag":"3.4.3","author":"oliverodev","date":"2026-06-11 23:43:06"},"3.4.4":{"tag":"3.4.4","author":"oliverodev","date":"2026-06-12 01:03:24"},"3.4.5":{"tag":"3.4.5","author":"oliverodev","date":"2026-06-12 01:19:57"},"3.4.6":{"tag":"3.4.6","author":"oliverodev","date":"2026-06-12 01:32:11"},"3.4.7":{"tag":"3.4.7","author":"oliverodev","date":"2026-06-12 01:47:42"},"3.4.8":{"tag":"3.4.8","author":"oliverodev","date":"2026-06-14 02:17:24"}},"upgrade_notice":{"3.2.7":"<p>New: See exactly where each file is used, real-time scan progress, safer delete confirmation modal, and CSV export of unused files.<\/p>","3.2.6":"<p>Important fix: resolves false positives that caused unused media files to appear as &quot;Used&quot;. Upgrade recommended for all users.<\/p>","3.2.5":"<p>Minor update. Hides the PRO upgrade banner when the PRO add-on is already active.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":3},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3569475,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-772x250.png":{"filename":"banner-772x250.png","revision":3569475,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["3.2.1","3.2.2","3.2.3","3.2.4","3.2.5","3.2.6","3.2.7","3.2.8","3.2.9","3.3.0","3.3.1","3.3.10","3.3.11","3.3.2","3.3.3","3.3.4","3.3.5","3.3.6","3.3.7","3.3.8","3.3.9","3.4.0","3.4.1","3.4.2","3.4.3","3.4.4","3.4.5","3.4.6","3.4.7","3.4.8"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3540487,"resolution":"1","location":"assets","locale":"","width":3024,"height":3047},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3540487,"resolution":"2","location":"assets","locale":"","width":3024,"height":2690},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3540487,"resolution":"3","location":"assets","locale":"","width":3024,"height":3530},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3540487,"resolution":"4","location":"assets","locale":"","width":3024,"height":3189}},"screenshots":{"1":"Dashboard with total library size, files in use, and storage to recover.","2":"Unused Files tab \u2014 full list of unreferenced media ready for cleanup.","3":"Media Library tab \u2014 full library view with used\/unused status and file details.","4":"Settings \u2014 configure batch size, scan frequency, and file type filters."}},"plugin_section":[],"plugin_tags":[227565,253777,233,254768,219749],"plugin_category":[],"plugin_contributors":[261471,261470],"plugin_business_model":[],"class_list":["post-296983","plugin","type-plugin","status-publish","hentry","plugin_tags-media-cleaner","plugin_tags-media-cleanup","plugin_tags-media-library","plugin_tags-media-optimizer","plugin_tags-unused-media","plugin_contributors-alexis-olivero","plugin_contributors-oliverodev","plugin_committers-oliverodev"],"banners":{"banner":"https:\/\/ps.w.org\/oliverodev-media-audit\/assets\/banner-772x250.png?rev=3569475","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/oliverodev-media-audit\/assets\/icon-256x256.png?rev=3569475","icon_2x":"https:\/\/ps.w.org\/oliverodev-media-audit\/assets\/icon-256x256.png?rev=3569475","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/oliverodev-media-audit\/assets\/screenshot-1.png?rev=3540487","caption":"Dashboard with total library size, files in use, and storage to recover."},{"src":"https:\/\/ps.w.org\/oliverodev-media-audit\/assets\/screenshot-2.png?rev=3540487","caption":"Unused Files tab \u2014 full list of unreferenced media ready for cleanup."},{"src":"https:\/\/ps.w.org\/oliverodev-media-audit\/assets\/screenshot-3.png?rev=3540487","caption":"Media Library tab \u2014 full library view with used\/unused status and file details."},{"src":"https:\/\/ps.w.org\/oliverodev-media-audit\/assets\/screenshot-4.png?rev=3540487","caption":"Settings \u2014 configure batch size, scan frequency, and file type filters."}],"raw_content":"<!--section=description-->\n<p><strong>Is your WordPress media library full of files nobody is using?<\/strong> Over time, images, documents, and other uploads accumulate without ever being referenced in posts, pages, or theme settings. OliveroDev Media Audit scans every corner of your site and tells you exactly which files are safe to delete \u2014 so you can recover disk space without breaking anything.<\/p>\n\n<p><strong>Smart detection that actually works.<\/strong> Most media cleaner plugins miss references stored in page builders, widgets, or serialized data. OliveroDev Media Audit checks post content, post meta, term meta, user meta, theme mods, widget options, and more \u2014 all in a single optimized scan \u2014 to reduce false positives and keep your site intact.<\/p>\n\n<h4>What you get for FREE<\/h4>\n\n<ul>\n<li><strong>Media library scan<\/strong> \u2014 Identify unused images, documents, videos, and audio files in your WordPress uploads.<\/li>\n<li><strong>Dashboard overview<\/strong> \u2014 See used vs. unused file counts and the total storage you can recover at a glance.<\/li>\n<li><strong>Safe, controlled cleanup<\/strong> \u2014 Review every file before deleting. No surprises, no bulk wipes you didn't authorize.<\/li>\n<li><strong>Batch scanning<\/strong> \u2014 Scans run in configurable batches to avoid server timeouts, even on large libraries.<\/li>\n<li><strong>Automatic background scans<\/strong> \u2014 Schedule recurring WP-Cron scans (hourly, daily, weekly) to keep your library clean over time.<\/li>\n<li><strong>File type filtering<\/strong> \u2014 Focus on images, documents, videos, audio, or archives depending on what you need to clean.<\/li>\n<li><strong>Image format support<\/strong> \u2014 JPEG, PNG, GIF, WebP, and SVG all covered.<\/li>\n<li><strong>Zero configuration required<\/strong> \u2014 Install, run a scan, and start recovering space.<\/li>\n<\/ul>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>Go to <strong>Tools \u2192 OliveroDev Media Audit<\/strong> in your WordPress admin.<\/li>\n<li>Click <strong>Start New Scan<\/strong>. The plugin checks every attachment in your library against all content on your site.<\/li>\n<li>Review the results. Files marked <strong>Unused<\/strong> are not referenced anywhere on your site.<\/li>\n<li>Delete unused files individually \u2014 or switch to the <strong>Unused Files<\/strong> tab to work through the full cleanup list.<\/li>\n<\/ol>\n\n<h4>What it checks<\/h4>\n\n<p>The detection engine searches for media references in:<\/p>\n\n<ul>\n<li>Posts, pages, and custom post types (including draft and private)<\/li>\n<li>Post meta and serialized data (including Gutenberg block attributes)<\/li>\n<li>Theme options and customizer settings (logo, header image, background image)<\/li>\n<li>Widget data and sidebar configurations<\/li>\n<li>Term meta and user meta<\/li>\n<li>WordPress options table<\/li>\n<li>Featured images (post thumbnails)<\/li>\n<li>Site icon setting<\/li>\n<li>All registered image sizes (thumbnails, medium, large)<\/li>\n<\/ul>\n\n<h4>PRO: Go deeper<\/h4>\n\n<p>The <strong>PRO add-on<\/strong> (available separately) unlocks integrations with the most popular WordPress tools:<\/p>\n\n<ul>\n<li><strong>Deep Detection<\/strong> for Advanced Custom Fields (ACF), Divi Builder, Elementor, WooCommerce product images, and more.<\/li>\n<li><strong>Storage Analysis<\/strong> with visual charts \u2014 see MB\/GB breakdown by file type, identify your heaviest content.<\/li>\n<li><strong>Intelligent Trash System<\/strong> \u2014 move files to trash before permanent deletion for an extra safety layer.<\/li>\n<li><strong>One-click Bulk Cleanup<\/strong> \u2014 delete all unused files in a single operation.<\/li>\n<li><strong>Extended file type support<\/strong> \u2014 full coverage for documents (PDF, DOC, XLS), video, audio, and archive files.<\/li>\n<li><strong>Advanced automation<\/strong> \u2014 fine-grained scheduling and cleanup triggers.<\/li>\n<\/ul>\n\n<p><a href=\"https:\/\/checkout.freemius.com\/product\/23055\/\">Get PRO \u2192<\/a><\/p>\n\n<h4>Who is this plugin for?<\/h4>\n\n<ul>\n<li><strong>Site owners<\/strong> who want to free up hosting disk space without hiring a developer.<\/li>\n<li><strong>Agencies<\/strong> managing multiple WordPress sites that accumulate unused uploads over time.<\/li>\n<li><strong>Developers<\/strong> who need a reliable way to audit a client's media library before a migration.<\/li>\n<li><strong>WooCommerce stores<\/strong> where product images are frequently updated or deleted from the catalog.<\/li>\n<li><strong>Bloggers and content creators<\/strong> who upload many images and want to keep their library organized.<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin does not collect any personal data, make external HTTP requests, or send usage statistics anywhere. All scanning happens locally on your server.<\/p>\n\n<!--section=installation-->\n<p><strong>From the WordPress plugin directory:<\/strong><\/p>\n\n<ol>\n<li>Search for \"OliveroDev Media Audit\" in <strong>Plugins \u2192 Add New<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<li>Open <strong>Tools \u2192 OliveroDev Media Audit<\/strong> and run your first scan.<\/li>\n<\/ol>\n\n<p><strong>Manual installation:<\/strong><\/p>\n\n<ol>\n<li>Download the plugin ZIP from WordPress.org.<\/li>\n<li>Upload the contents to <code>\/wp-content\/plugins\/oliverodev-media-audit\/<\/code>.<\/li>\n<li>Activate from <strong>Plugins<\/strong> in your WordPress admin.<\/li>\n<li>Open <strong>Tools \u2192 OliveroDev Media Audit<\/strong> and run your first scan.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20it%20safe%20to%20use%20on%20a%20live%20production%20site%3F\"><h3>Is it safe to use on a live production site?<\/h3><\/dt>\n<dd><p>Yes. The plugin reads content to determine whether a file is in use; it never deletes anything automatically. You review the results first and choose which files to remove one at a time.<\/p><\/dd>\n<dt id=\"will%20it%20detect%20media%20used%20in%20elementor%20or%20divi%3F\"><h3>Will it detect media used in Elementor or Divi?<\/h3><\/dt>\n<dd><p>The free version searches all post content, including raw Elementor and Divi data stored in post meta. The PRO version adds dedicated deep-detection integrations for these builders to catch edge cases in their proprietary storage formats.<\/p><\/dd>\n<dt id=\"can%20it%20detect%20images%20used%20in%20acf%20%28advanced%20custom%20fields%29%3F\"><h3>Can it detect images used in ACF (Advanced Custom Fields)?<\/h3><\/dt>\n<dd><p>The free version scans post meta values and will find most ACF image references stored as attachment IDs or URLs. The PRO version includes a dedicated ACF integration for complete coverage of repeaters and flexible content fields.<\/p><\/dd>\n<dt id=\"how%20do%20i%20find%20unused%20images%20in%20wordpress%3F\"><h3>How do I find unused images in WordPress?<\/h3><\/dt>\n<dd><p>Install the plugin, go to <strong>Tools \u2192 OliveroDev Media Audit<\/strong>, click <strong>Start New Scan<\/strong>, and open the <strong>Unused Files<\/strong> tab when the scan finishes. Every file listed there was not found in any post, page, or site setting.<\/p><\/dd>\n<dt id=\"how%20long%20does%20a%20scan%20take%3F\"><h3>How long does a scan take?<\/h3><\/dt>\n<dd><p>It depends on your library size. The scan runs in batches (configurable from 1 to 200 files per batch) directly in your browser via AJAX, so it won't time out even on large libraries with thousands of files.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20a%20file%3F\"><h3>What happens when I delete a file?<\/h3><\/dt>\n<dd><p>The plugin calls WordPress's native <code>wp_delete_attachment()<\/code> function, which removes the attachment post, all registered image sizes, and the original file from your server. This is the same process WordPress uses in the media library.<\/p><\/dd>\n<dt id=\"can%20i%20recover%20a%20deleted%20file%3F\"><h3>Can I recover a deleted file?<\/h3><\/dt>\n<dd><p>No. Deletion is permanent. If you need a safety net before bulk cleanup, the PRO version includes an intelligent Trash System that lets you move files to a staging area before committing to deletion.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>The free version scans product descriptions, product gallery meta, and variation image meta. The PRO version adds dedicated WooCommerce detection to cover featured product images and gallery references more reliably.<\/p><\/dd>\n<dt id=\"will%20deleting%20unused%20media%20affect%20my%20seo%3F\"><h3>Will deleting unused media affect my SEO?<\/h3><\/dt>\n<dd><p>Only if those files were indexed by search engines and linked from external sites. For files that are truly unused (not referenced in any post or page on your site), there is no SEO impact. If you are unsure, review each file individually before deleting.<\/p><\/dd>\n<dt id=\"where%20does%20the%20plugin%20appear%20in%20the%20wordpress%20admin%3F\"><h3>Where does the plugin appear in the WordPress admin?<\/h3><\/dt>\n<dd><p>Go to <strong>Tools \u2192 OliveroDev Media Audit<\/strong>.<\/p><\/dd>\n<dt id=\"does%20it%20support%20multisite%3F\"><h3>Does it support multisite?<\/h3><\/dt>\n<dd><p>The plugin is designed for single-site installations. Multisite compatibility is on the roadmap.<\/p><\/dd>\n<dt id=\"can%20i%20schedule%20automatic%20scans%3F\"><h3>Can I schedule automatic scans?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>Tools \u2192 OliveroDev Media Audit \u2192 Settings<\/strong> and choose a scan frequency: hourly, twice daily, daily, or weekly. The scan runs in the background via WP-Cron.<\/p><\/dd>\n<dt id=\"what%20file%20types%20does%20the%20free%20version%20support%3F\"><h3>What file types does the free version support?<\/h3><\/dt>\n<dd><p>Images: JPEG, PNG, GIF, WebP, SVG. The PRO version extends this to PDF, DOC, DOCX, XLS, XLSX, MP4, MP3, ZIP, RAR, and more.<\/p><\/dd>\n<dt id=\"i%20found%20a%20false%20positive%20%E2%80%94%20a%20file%20shown%20as%20%22unused%22%20that%20i%20know%20is%20in%20use.%20what%20should%20i%20do%3F\"><h3>I found a false positive \u2014 a file shown as \"unused\" that I know is in use. What should I do?<\/h3><\/dt>\n<dd><p>Do not delete it. The free version covers the most common storage locations. If you are using a plugin or theme with a custom database structure, the file may be referenced in a table the free version does not scan. The PRO version covers the most popular third-party tools. You can also filter the detection using the <code>oliverodev_media_audit_is_media_used<\/code> WordPress filter hook.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>3.4.8<\/h4>\n\n<ul>\n<li>Fix: PHP fatal error in Logger \u2014 <code>includes()<\/code> is not a valid PHP function. Replaced with the correct <code>ABSPATH . wp-admin\/includes\/<\/code> path with <code>file_exists()<\/code> guard, matching the pattern used in the Scanner class.<\/li>\n<\/ul>\n\n<h4>3.4.7<\/h4>\n\n<ul>\n<li>Fix: Elementor 4.x Grid background images (Spacer widget inside Grid container) are now detected during scans \u2014 the scanner explicitly processes all <code>_elementor_data<\/code> rows for atomic $$type format IDs, including rows without upload URLs that step 7's URL filter previously skipped.<\/li>\n<\/ul>\n\n<h4>3.4.6<\/h4>\n\n<ul>\n<li>Fix: Broaden Elementor 4.x $$type detection to match ANY <code>$$type<\/code> object (image, background, grid, etc.) with a numeric <code>\"value\"<\/code>, not only <code>\"image-attachment-id\"<\/code>. Previously missed backgrounds on Grid \u2192 Spacer and similar nested element structures.<\/li>\n<\/ul>\n\n<h4>3.4.5<\/h4>\n\n<ul>\n<li>Fix: Elementor 4.x atomic format detection now covers all keys, not just <code>\"id\"<\/code>. Background images stored under <code>\"background_image\"<\/code>, <code>\"image\"<\/code>, or any other key using <code>$$type<\/code> objects are now detected.<\/li>\n<li>Fix: \"Where is it used?\" now searches <code>_elementor_data<\/code> and <code>_elementor_css<\/code> postmeta for both classic and atomic ID patterns + URL, fixing the \"No specific location found\" message for Elementor content.<\/li>\n<\/ul>\n\n<h4>3.4.4<\/h4>\n\n<ul>\n<li>Fix: Elementor 4.x compatibility \u2014 the scanner now detects attachment IDs stored in the new atomic JSON format (<code>$$type<\/code> descriptors). Elementor 4.x stores <code>\"id\": {\"$$type\":\"image-attachment-id\",\"value\":N}<\/code> instead of the classic <code>\"id\":N<\/code>, and the previous regex missed it entirely. Background images on Containers\/Sections now show as \"used\" on Elementor 4.x sites.<\/li>\n<\/ul>\n\n<h4>3.4.3<\/h4>\n\n<ul>\n<li>Fix: Protocol-agnostic URL matching \u2014 the scanner now checks both http and https variants when scanning postmeta, options, usermeta, and termmeta. Fixes false positives where page builders (Elementor, etc.) stored URLs with a different scheme than the current site URL.<\/li>\n<li>Fix: Elementor CSS transient is now cleared on <code>save_post<\/code>, so newly generated CSS files are picked up on the next scan instead of being missed due to stale cache.<\/li>\n<\/ul>\n\n<h4>3.4.2<\/h4>\n\n<ul>\n<li>Security: Hardened SQLi prevention \u2014 table and column names are validated against a whitelist before being used in database queries.<\/li>\n<li>Security: Added <code>realpath()<\/code> resolution to prevent symlink-based path traversal in file deletion routines.<\/li>\n<li>Security: File size helper now validates the path is within the uploads directory.<\/li>\n<li>Security: Escaped <code>wp_get_attachment_image()<\/code> output to prevent stored XSS via image alt text.<\/li>\n<li>Security: Replaced <code>FILTER_UNSAFE_RAW<\/code> with direct <code>sanitize_key()<\/code> calls for all input variables.<\/li>\n<li>Security: Added <code>index.php<\/code> to logs directory for directory listing hardening.<\/li>\n<li>Security: Elementor CSS file reading now validates files are within the expected directory.<\/li>\n<\/ul>\n\n<h4>3.4.1<\/h4>\n\n<ul>\n<li>Fix: \"Start New Scan\" \/ \"Resume\" button icon now stays white at rest (was inheriting an inconsistent blue\/green from the admin color scheme) and turns purple while the scan animation is running.<\/li>\n<\/ul>\n\n<h4>3.4.0<\/h4>\n\n<ul>\n<li>New: Slider safety net \u2014 the scanner now also checks Smart Slider 3 and LayerSlider tables (in addition to the existing Slider Revolution check). Images used inside these sliders are detected as \"in use\" and protected from accidental deletion, even when only referenced via shortcode.<\/li>\n<\/ul>\n\n<h4>3.3.11<\/h4>\n\n<ul>\n<li>Rewrite: Inverted-Index scan engine \u2014 builds a complete set of in-use attachment IDs once per scan (scanning every content source in a single DB pass), then per-file checks are O(1) array lookups. Eliminates the N\u00d7M LIKE queries that caused false negatives and timeouts.<\/li>\n<li>Fix: \"everything shows as unused\" \u2014 root cause was unreliable LIKE-query approach. The new engine uses PHP regex on fetched content, exact ID queries, and a URL\u2192ID reverse map, eliminating LIKE escaping bugs entirely.<\/li>\n<li><p>Detection now covers: post_content (regex), postmeta, wp_options, wp_usermeta, wp_termmeta, Elementor CSS files (disk), Elementor compressed data, Slider Revolution, featured images, WooCommerce galleries, ACF ID fields, shortcode gallery IDs, site icon, custom logo.<\/p><\/li>\n<li><p>New: Real-time scan counter \u2014 dashboard shows \"X unused found\" updating live while scan runs, eliminating the perception that the plugin found nothing during long scans.<\/p><\/li>\n<li>Fix: Sort by Size on Unused tab no longer breaks the unused filter \u2014 the OR clause was overriding the unused-only condition.<\/li>\n<li>Fix: Sort by Size on Library tab now includes all files regardless of scan status.<\/li>\n<\/ul>\n\n<h4>3.3.8<\/h4>\n\n<ul>\n<li>Fix: Library tab no longer shows blank page on fresh installs \u2014 rows without scan data show a \"Not scanned\" badge instead of triggering 1000+ live queries per page load.<\/li>\n<li>Fix: Sorting by Size without a prior scan no longer returns zero results.<\/li>\n<li>New: \"Not scanned\" status badge with muted style for files not yet analyzed.<\/li>\n<\/ul>\n\n<h4>3.3.7<\/h4>\n\n<ul>\n<li>Fix: WooCommerce product gallery images (<code>_product_image_gallery<\/code>) now correctly detected as in-use \u2014 previously showed as unused on WooCommerce sites.<\/li>\n<li>Fix: ACF image and file fields storing attachment IDs now detected via ACF shadow key join \u2014 eliminates false positives on ACF-powered sites.<\/li>\n<li>Security: Replaced <code>data-imghtml<\/code> + <code>.html()<\/code> in delete modal with <code>data-imgurl<\/code> + <code>document.createElement('img')<\/code> \u2014 removes potential XSS vector in file preview.<\/li>\n<\/ul>\n\n<h4>3.3.6<\/h4>\n\n<ul>\n<li>New: AJAX tab navigation \u2014 switching between Dashboard, Unused Files, Library, and Settings no longer triggers a full page reload. Includes skeleton loader for instant visual response.<\/li>\n<li>New: Adaptive scan engine \u2014 batch size auto-adjusts based on server throughput, memory limit, and PHP time limit. Starts at 5 items and grows or shrinks per batch to prevent timeouts on any hosting environment.<\/li>\n<li>New: Offset-based scan pagination \u2014 replaces page-based approach so batch size can safely change between requests without skipping or double-scanning files.<\/li>\n<li>Fix: <code>render_media_row()<\/code> no longer calls the full scanner on every page render \u2014 reads cached postmeta instead, reducing page load from 1000+ queries to ~20.<\/li>\n<li>Fix: Cron scan updated to use offset-based <code>scan_batch()<\/code> signature.<\/li>\n<\/ul>\n\n<h4>3.3.5<\/h4>\n\n<ul>\n<li>Fix: Elementor CSS scan \u2014 now scans all <code>*.css<\/code> files in <code>uploads\/elementor\/css\/<\/code> without a stale post-ID filter, using a 1-minute file-list transient and 2-minute per-file object cache.<\/li>\n<\/ul>\n\n<h4>3.3.1<\/h4>\n\n<ul>\n<li>Fix: Fatal error on activation \u2014 <code>oliverodev_media_audit_get_filesystem()<\/code> called <code>includes()<\/code> which is not a valid PHP or WordPress function. Replaced with a direct <code>filesize()<\/code> call; WP_Filesystem is unnecessary for reading file sizes.<\/li>\n<\/ul>\n\n<h4>3.3.0<\/h4>\n\n<ul>\n<li>New: CSS background-image detection \u2014 now detects media files used in inline styles and custom CSS (parallax backgrounds, hero sections, etc). Fixes issue where background images were incorrectly marked as unused and deleted.<\/li>\n<li>New: Private method <code>check_css_background_usage()<\/code> searches for <code>url()<\/code> patterns in post_content and postmeta.<\/li>\n<li>Fix: RevSlider table check was using undefined <code>$terms<\/code> variable \u2014 changed to <code>$search_terms<\/code>.<\/li>\n<\/ul>\n\n<h4>3.2.9<\/h4>\n\n<ul>\n<li>Fix: \"Where is it used?\" now correctly finds Gutenberg block references. Previously returned \"No specific location found\" for images inserted via Gutenberg blocks because the search only used the full URL. Now also searches for <code>wp-image-{id}<\/code> CSS class and <code>\"id\":N<\/code> JSON block patterns \u2014 matching all detection methods used by the scanner.<\/li>\n<\/ul>\n\n<h4>3.2.8<\/h4>\n\n<ul>\n<li>Improved: PRO upgrade banner completely redesigned with benefit-focused messaging, risk-oriented copy, and trial-first CTA (\"Try PRO Free \u2014 3 Days\"). Dynamic unused file count shown in the banner copy.<\/li>\n<\/ul>\n\n<h4>3.2.7<\/h4>\n\n<ul>\n<li>New: \"Where is it used?\" button on every Used file \u2014 shows the exact posts, pages, or theme settings referencing each file.<\/li>\n<li>New: Real-time scan counter \u2014 displays \"Scanning X of Y files \u00b7 Z remaining\" during active scans.<\/li>\n<li>New: Delete confirmation modal \u2014 shows file thumbnail, name, and size before permanent deletion instead of a plain browser dialog.<\/li>\n<li>New: Export CSV \u2014 download a spreadsheet of all unused files directly from the Unused Files tab.<\/li>\n<\/ul>\n\n<h4>3.2.6<\/h4>\n\n<ul>\n<li>Fix: Removed false positive detections caused by overly broad serialized-integer patterns (<code>i:N;<\/code>, <code>,N,<\/code>, <code>,N\"<\/code>) being matched in postmeta, usermeta, termmeta, and options tables.<\/li>\n<li>Fix: Removed unreliable exact-integer postmeta match that incorrectly flagged files as used when unrelated meta keys (e.g. <code>_edit_last<\/code>, counters) happened to store the same number as a media ID.<\/li>\n<li>Improvement: JSON and HTML id-based patterns (<code>\"id\":N<\/code>, <code>data-id=\"N\"<\/code>, etc.) are now scoped exclusively to post_content where Gutenberg blocks live, eliminating false positives in meta tables.<\/li>\n<\/ul>\n\n<h4>3.2.5<\/h4>\n\n<ul>\n<li>Hide the \"Get PRO\" banner when PRO is already active via license integration.<\/li>\n<\/ul>\n\n<h4>3.2.4<\/h4>\n\n<ul>\n<li>Maintenance release for WordPress.org package compliance and metadata alignment.<\/li>\n<\/ul>\n\n<h4>3.2.3<\/h4>\n\n<ul>\n<li>Fixed PRO upgrade link to Freemius checkout.<\/li>\n<\/ul>\n\n<h4>3.2.2<\/h4>\n\n<ul>\n<li>Added animated PRO upgrade banner in dashboard.<\/li>\n<li>Added link to upgrade to PRO version.<\/li>\n<\/ul>\n\n<h4>3.2.1<\/h4>\n\n<ul>\n<li>Improved WordPress.org submission compatibility and plugin metadata.<\/li>\n<li>Added plugin text domain loading.<\/li>\n<li>Refreshed compatibility metadata.<\/li>\n<\/ul>\n\n<h4>3.2.0<\/h4>\n\n<ul>\n<li>Refactored scanning architecture for improved performance.<\/li>\n<li>Updated compatibility metadata.<\/li>\n<\/ul>","raw_excerpt":"Find and delete unused media files in your WordPress media library. Smart scanning, safe cleanup, and storage optimization \u2014 completely free.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/296983","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=296983"}],"author":[{"embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/oliverodev"}],"wp:attachment":[{"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=296983"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=296983"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=296983"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=296983"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=296983"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/bal.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=296983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}