{"id":388769,"date":"2026-10-19T22:04:22","date_gmt":"2026-10-19T22:04:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mediaxray\/"},"modified":"2026-10-20T20:42:26","modified_gmt":"2026-10-20T20:42:26","slug":"mediaxray","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/mediaxray\/","author":23588234,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.2","stable_tag":"1.0.2","tested":"7.1.3","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"MediaXray","header_author":"usman","header_description":"See exactly where every media file is used \u2014 every reference, page and builder \u2014 and clean up unused media through a verified, restorable quarantine.","assets_banners_color":"143b72","last_updated":"2026-10-20 20:42:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/usmaaan.com","rating":5,"author_block_rating":0,"active_installs":0,"downloads":101,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"fixitusman","date":"2026-10-19 22:04:12","revision":3755611},"1.0.1":{"tag":"1.0.1","author":"fixitusman","date":"2026-10-20 01:26:25","revision":3755759},"1.0.2":{"tag":"1.0.2","author":"fixitusman","date":"2026-10-20 20:42:26","revision":3757443}},"upgrade_notice":[],"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3755611,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3755611,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3755611,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3755611,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1","1.0.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3755759,"resolution":"1","location":"assets","locale":"","width":2160,"height":1350},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3755611,"resolution":"2","location":"assets","locale":"","width":2160,"height":1350},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3755759,"resolution":"3","location":"assets","locale":"","width":2160,"height":1350},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3755611,"resolution":"4","location":"assets","locale":"","width":2160,"height":1350}},"screenshots":{"1":"Overview: status totals, scan progress and the media usage list.","2":"Usage details: every reference grouped by page, template and setting.","3":"Quarantine: restore or permanently delete reviewed files.","4":"Media Library integration: usage column and attachment details panel."}},"plugin_section":[],"plugin_tags":[267904,252003,253777,233,146945],"plugin_category":[],"plugin_contributors":[287595],"plugin_business_model":[],"class_list":["post-388769","plugin","type-plugin","status-publish","hentry","plugin_tags-delete-unused-media","plugin_tags-image-usage","plugin_tags-media-cleanup","plugin_tags-media-library","plugin_tags-unused-images","plugin_contributors-fixitusman","plugin_committers-fixitusman"],"banners":{"banner":"https:\/\/ps.w.org\/mediaxray\/assets\/banner-772x250.png?rev=3755611","banner_2x":"https:\/\/ps.w.org\/mediaxray\/assets\/banner-1544x500.png?rev=3755611","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/mediaxray\/assets\/icon-128x128.png?rev=3755611","icon_2x":"https:\/\/ps.w.org\/mediaxray\/assets\/icon-256x256.png?rev=3755611","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/mediaxray\/assets\/screenshot-1.png?rev=3755759","caption":"Overview: status totals, scan progress and the media usage list."},{"src":"https:\/\/ps.w.org\/mediaxray\/assets\/screenshot-2.png?rev=3755611","caption":"Usage details: every reference grouped by page, template and setting."},{"src":"https:\/\/ps.w.org\/mediaxray\/assets\/screenshot-3.png?rev=3755759","caption":"Quarantine: restore or permanently delete reviewed files."},{"src":"https:\/\/ps.w.org\/mediaxray\/assets\/screenshot-4.png?rev=3755611","caption":"Media Library integration: usage column and attachment details panel."}],"raw_content":"<!--section=description-->\n<h4>What makes MediaXray different<\/h4>\n\n<p>Most media cleaners give you a yes\/no \"unused\" list. MediaXray builds a full usage map first and treats deletion as the last, reversible step:<\/p>\n\n<ul>\n<li><strong>Counts every single use, not just \"used \/ unused\".<\/strong> Each occurrence is recorded with the page, product, template or setting it is in, and the exact block, widget, breakpoint or field that uses it.<\/li>\n<li><strong>Understands Elementor at widget level.<\/strong> Image widgets, container backgrounds on every breakpoint, overlays, carousels, dynamic tags, the Global Kit and Theme Builder display conditions (a header shown site-wide makes its logo Global).<\/li>\n<li><strong>Four statuses instead of two.<\/strong> Used, Global (protected), Needs check (not on any live page: only drafts, saved templates, inactive themes, unclear matches) and Unused, so \"no reference found\" never silently becomes \"delete\".<\/li>\n<li><strong>Independent deep verification before cleanup.<\/strong> A brute-force search of the raw database and the active theme's files double-checks every file before it can be removed.<\/li>\n<li><strong>Restorable quarantine.<\/strong> Files (including WebP\/AVIF copies) are moved out of reach, not deleted, so you can check your site and restore with one click.<\/li>\n<li><strong>Built for big sites.<\/strong> Resumable batched scans, an index that updates itself as content changes, and WP-CLI commands.<\/li>\n<\/ul>\n\n<p>MediaXray answers two questions, in this order:<\/p>\n\n<ol>\n<li><strong>Where is this file used?<\/strong> Every individual reference, grouped by page, product, template or setting, with the widget, block or field that uses it.<\/li>\n<li><strong>Is it safe to remove?<\/strong> Only after the first question is answered, and only after an independent deep verification.<\/li>\n<\/ol>\n\n<h4>Statuses<\/h4>\n\n<ul>\n<li><strong>Used<\/strong> \u2014 confirmed references in live (published or private) content.<\/li>\n<li><strong>Global<\/strong> \u2014 logo, site icon, active theme settings, Theme Builder templates shown site-wide, Elementor Global Kit, active widgets. Protected from cleanup.<\/li>\n<li><strong>Needs check<\/strong> \u2014 not on any live page: only referenced by drafts, unassigned templates, inactive themes or widgets, Elementor's stored fallback HTML, or uncertain matches.<\/li>\n<li><strong>Unused<\/strong> \u2014 no reference found by any supported source.<\/li>\n<\/ul>\n\n<h4>How references are counted<\/h4>\n\n<ul>\n<li>A reference is one individual use. The same image twice on a page is 2 references on 1 page.<\/li>\n<li>One image tag with its srcset, wp-image class and a link to its full size is 1 reference.<\/li>\n<li>Unique content counts each page, product, template, term or setting once.<\/li>\n<\/ul>\n\n<h4>What is scanned<\/h4>\n\n<ul>\n<li>All content types (pages, posts, products, custom post types, Elementor templates, block templates, reusable blocks) in every status except Trash.<\/li>\n<li>Gutenberg blocks (block-aware), classic HTML, galleries and shortcodes, featured images, excerpts.<\/li>\n<li>Elementor: every widget and container \u2014 images, backgrounds on every breakpoint, overlays, galleries and carousels, video, links, dynamic tags, page and Global Kit settings, Theme Builder display conditions, embedded templates, atomic elements.<\/li>\n<li>WooCommerce: product images, galleries, variation images (shown on the parent product), category images, downloadable files.<\/li>\n<li>ACF fields (field-type aware when ACF is active), all custom fields, term and user meta, comments, widgets, Customizer, site icon and logo, Yoast SEO images and plugin settings.<\/li>\n<\/ul>\n\n<h4>Safe cleanup<\/h4>\n\n<ul>\n<li>Deep verification searches the raw database and the active theme's files for every file name and ID pattern of the attachment, independently of the parsers.<\/li>\n<li>Quarantine moves all files of an attachment (including WebP\/AVIF copies made by converter plugins) into a protected folder and hides it from the Media Library. One click restores it.<\/li>\n<li>Permanent deletion only works on quarantined items and requires typing DELETE.<\/li>\n<li>Uninstalling the plugin restores everything that is still in quarantine.<\/li>\n<\/ul>\n\n<h4>Built for large sites<\/h4>\n\n<p>Scans run in short, resumable batches, keep the previous results visible until the new scan is complete, and the index updates itself when content, terms, uploads or settings change. WP-CLI: <code>wp mediaxray scan<\/code>, <code>status<\/code>, <code>list<\/code>, <code>usage &lt;id&gt;<\/code>, <code>verify &lt;id&gt;<\/code>.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>MediaXray makes no external requests, sends no data anywhere and adds no tracking. All analysis happens in your own database.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin through Plugins \u2192 Add New \u2192 Upload Plugin, or install it from the plugin directory.<\/li>\n<li>Activate it.<\/li>\n<li>Go to Media \u2192 MediaXray and click Start scan.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20it%20delete%20anything%20automatically%3F\"><h3>Will it delete anything automatically?<\/h3><\/dt>\n<dd><p>No. Nothing is ever deleted automatically. Unused files are only moved to quarantine when you choose to, after a fresh deep verification, and you can restore them at any time.<\/p><\/dd>\n<dt id=\"why%20is%20a%20file%20marked%20needs%20check%20instead%20of%20unused%3F\"><h3>Why is a file marked Needs check instead of Unused?<\/h3><\/dt>\n<dd><p>Something still mentions it, but not in live content \u2014 for example a draft, a saved Elementor template that is not placed anywhere, an inactive theme's settings, or Elementor's stored fallback copy of a page. Open the file's usage details to see exactly where.<\/p><\/dd>\n<dt id=\"can%20it%20detect%20every%20possible%20use%3F\"><h3>Can it detect every possible use?<\/h3><\/dt>\n<dd><p>No tool can. Files referenced only from PHP code outside the active theme, external websites, JavaScript-built URLs or plugins that keep their own database tables cannot be detected. That is why cleanup goes through quarantine: check your site, then delete.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20caches%20and%20cdns%3F\"><h3>Does it work with page caches and CDNs?<\/h3><\/dt>\n<dd><p>Yes. File URLs on other hosts (CDNs) are matched by their uploads path, and MediaXray's own admin requests opt out of page caching.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>\"Review\" is now called \"Needs check\", with a plainer explanation and a shortcut from the dashboard.<\/li>\n<li>Quarantine has a single delete action: choose Delete permanently, then confirm by typing DELETE.<\/li>\n<li>Links to pages and templates open the normal WordPress edit screen.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>New dashboard panel: scan button, live step-by-step progress and status cards in one place.<\/li>\n<li>Shows how much disk space unused media takes up.<\/li>\n<li>WordPress notices now appear at the top of the screen, above the MediaXray panel.<\/li>\n<li>Added the standard \"View details\" link on the Plugins screen.<\/li>\n<li>Refreshed tabs, cards and table styling.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"See where every media file is used \u2014 every reference, page and builder \u2014 and remove unused media through a verified, restorable quarantine.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/388769","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=388769"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/fixitusman"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=388769"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=388769"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=388769"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=388769"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=388769"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=388769"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}