{"id":381888,"date":"2026-10-10T12:36:44","date_gmt":"2026-10-10T12:36:44","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/media-verdict\/"},"modified":"2026-10-10T19:43:37","modified_gmt":"2026-10-10T19:43:37","slug":"media-verdict","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/media-verdict\/","author":13640012,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.1","stable_tag":"0.4.1","tested":"7.1.3","requires":"6.4","requires_php":"8.0","requires_plugins":null,"header_name":"Media Verdict","header_author":"Vanf Lab","header_description":"Fail-safe media library usage detector. Shows which images are in use (green) and which have no detected usage (red) right inside the Media Library, with snapshot-first safe deletion, trash and one-click restore.","assets_banners_color":"305e66","last_updated":"2026-10-10 19:43:37","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/media-verdict\/","header_author_uri":"https:\/\/vanflab.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":55,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"0.4.0":{"tag":"0.4.0","author":"Guillermo Kafelnikov","date":"2026-10-10 15:46:36","revision":3738294},"0.4.1":{"tag":"0.4.1","author":"Guillermo Kafelnikov","date":"2026-10-10 19:43:37","revision":3738601}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3738041,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3738041,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3738041,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3738041,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.4.0","0.4.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3738041,"resolution":"1","location":"assets","locale":"","width":1920,"height":1000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3738041,"resolution":"2","location":"assets","locale":"","width":1383,"height":898}},"screenshots":{"1":"Media Library grid with green \"in use\" and red \"no usage detected\" frames.","2":"Scan dashboard: counters, filters and per-file evidence table."}},"plugin_section":[],"plugin_tags":[3786,163,84,233,146945],"plugin_category":[50],"plugin_contributors":[285527],"plugin_business_model":[],"class_list":["post-381888","plugin","type-plugin","status-publish","hentry","plugin_tags-cleanup","plugin_tags-images","plugin_tags-media","plugin_tags-media-library","plugin_tags-unused-images","plugin_category-media","plugin_contributors-guillermo-kafelnikov","plugin_committers-guillermo-kafelnikov"],"banners":{"banner":"https:\/\/ps.w.org\/media-verdict\/assets\/banner-772x250.png?rev=3738041","banner_2x":"https:\/\/ps.w.org\/media-verdict\/assets\/banner-1544x500.png?rev=3738041","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/media-verdict\/assets\/icon-128x128.png?rev=3738041","icon_2x":"https:\/\/ps.w.org\/media-verdict\/assets\/icon-256x256.png?rev=3738041","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/media-verdict\/assets\/screenshot-1.png?rev=3738041","caption":"Media Library grid with green \"in use\" and red \"no usage detected\" frames."},{"src":"https:\/\/ps.w.org\/media-verdict\/assets\/screenshot-2.png?rev=3738041","caption":"Scan dashboard: counters, filters and per-file evidence table."}],"raw_content":"<!--section=description-->\n<p>Media Verdict scans your whole site \u2014 post content (all post types, drafts and revisions), post meta (featured images, WooCommerce galleries, Elementor data), term meta, user meta, options (widgets, customizer, logo, site icon) and builder\/slider sources (Smart Slider 3, Revolution Slider, LayerSlider, Master Slider, Visual Composer, WPBakery, Cornerstone, Oxygen) \u2014 and tells you which media library items are in use and which have <strong>no detected usage<\/strong>.<\/p>\n\n<p>Fail-safe by design:<\/p>\n\n<ul>\n<li>When in doubt, an item is marked as <strong>used<\/strong>.<\/li>\n<li>The UI says \"no detected usage\", never \"guaranteed unused\" \u2014 no scanner can see dynamic references (hardcoded CSS, JS-built URLs, email templates).<\/li>\n<li>Deletion <strong>always<\/strong> creates a ZIP snapshot first (original + all generated sizes, with md5 manifest).<\/li>\n<li>Deletion <strong>always<\/strong> goes to the WordPress trash, never forced.<\/li>\n<li>One-click restore from the snapshot, with integrity verification.<\/li>\n<\/ul>\n\n<p>In the Media Library (grid and list modes) used items get a green frame and unused-detected items a red frame with a badge; hovering or clicking shows the evidence (\"Used in: Post #123, Product #45\").<\/p>\n\n<p>WP-CLI: <code>wp media-verdict scan|list|snapshot|trash|restore|report<\/code>.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>media-verdict<\/code> folder to <code>wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it.<\/li>\n<li>Go to Media \u2192 Media Verdict and run a scan.<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>New: 12 more usage parsers \u2014 Elementor, Divi, ACF, Beaver Builder, Bricks, Breakdance, Fusion Builder (Avada), Meta Box, Toolset, Spectra, Kadence Blocks and SiteOrigin Page Builder. 20 parsers total, all fail-safe (they can only mark files as in use, never as unused).<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>New: Filesystem scan \u2014 walks the uploads directory and flags files with no media library entry (orphans + orphaned derivatives such as thumbnails, retina and WebP whose master is gone). Quarantine zips files into a snapshot first; nothing is deleted outright.<\/li>\n<li>New: Duplicate detection \u2014 SHA-256 hashing during the filesystem scan, with a compare-and-resolve view to keep one file per group and snapshot the rest.<\/li>\n<li>New: References ledger \u2014 every usage reference from the last scan in one searchable table, with one-click CSV export for audit trails.<\/li>\n<li>Plugin header now ships <code>Plugin URI<\/code> and <code>Author URI<\/code> (linked author + plugin name in the plugins list).<\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>Internationalization: all user-facing strings are now English source strings with full Spanish (es_ES) translation shipped in <code>languages\/<\/code> (<code>media-verdict.pot<\/code> included for translators). The UI follows the site language automatically \u2014 no manual switch needed.<\/li>\n<li>WordPress.org review compliance: renamed the internal AJAX action prefix from <code>mv_<\/code> to <code>media_verdict_<\/code> (plus nonces, script handles and related identifiers) to meet the directory prefixing guideline; readme Contributors now uses the WordPress.org username and the short description was shortened to 145 characters.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>Fixed: scans started from wp-admin lost all evidence between AJAX requests (the driver creates a new scanner per request) and marked everything as unused. Evidence is now persisted per batch in the <code>media_verdict_scan_evidence<\/code> option and merged back before finalizing, so admin scans produce the same verdicts as CLI scans.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>New builder parsers: Cornerstone (<code>_cornerstone_data<\/code> \"ID:size\" attachment references) and Oxygen (<code>ct_builder_json<\/code> numeric <code>attachment_id<\/code>s, with stripslashes for its escaped JSON). Both detected and verified against real test pages.<\/li>\n<li>Builder coverage is now: Smart Slider 3, Revolution Slider, LayerSlider, Master Slider, Visual Composer, WPBakery, Cornerstone, Oxygen \u2014 plus Divi, Beaver Builder and Depicter via the generic content matcher.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Builder\/slider parsers: Smart Slider 3, Revolution Slider, LayerSlider, Master Slider, the new Visual Composer and classic WPBakery shortcodes \u2014 each with its own storage format (custom tables, escaped JSON, base64 blobs, template placeholders). Filterable registry (<code>media_verdict_parsers<\/code>).<\/li>\n<li>Fixed: URL normalizer regex that silently broke every URL-based match.<\/li>\n<li>Settings: new \"Parsers activos\" list showing which builders were detected on the site.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release: detection engine, library overlays, snapshot\/trash\/restore flow, WP-CLI.<\/li>\n<\/ul>","raw_excerpt":"Fail-safe media library usage detector: green\/red usage frames, per-item evidence, snapshot-first safe deletion with trash and one-click restore.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/381888","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=381888"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/guillermo-kafelnikov"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=381888"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=381888"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=381888"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=381888"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=381888"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=381888"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}