{"id":400859,"date":"2026-11-11T13:10:22","date_gmt":"2026-11-11T13:10:22","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/media-file-fixer\/"},"modified":"2026-11-11T13:09:59","modified_gmt":"2026-11-11T13:09:59","slug":"media-file-fixer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/media-file-fixer\/","author":23601343,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.4","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Media File Fixer","header_author":"Potens Digital","header_description":"Find broken images and media files, see everywhere they are used, understand why they broke, and repair them safely.","last_updated":"2026-11-11 13:09:59","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/mediafilefixer.com\/","header_author_uri":"https:\/\/potensdigital.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":87,"num_ratings":0,"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":"potensdigital","date":"2026-11-11 13:09:59","revision":3796370}},"upgrade_notice":{"1.0.0":"<p>The first stable release. Checking media on other websites is now off until you turn it on in Settings, and the menu item moves to the bottom of the admin menu. Your scans, issues and repair history are kept.<\/p>","1.0.0-rc.12":"<p>Replacement suggestions: the issue page now offers files from your Media Library that are plainly the right replacement, and says why. Nothing is repaired until you choose one.<\/p>","1.0.0-rc.11":"<p>Internal only: no behaviour changes. Safe to skip unless you also run Media File Fixer Pro.<\/p>","1.0.0-rc.10":"<p>Groundwork for the Pro add-on. No change to how the free plugin behaves; take it whenever convenient.<\/p>","1.0.0-rc.9":"<p>Elementor Image widgets are now found and repaired where Elementor actually keeps them. Worth taking if you use Elementor, or used to: broken images in Image widgets are fixable from the plugin, are no longer double-counted, and are correctly dropped if Elementor is removed.<\/p>","1.0.0-rc.8":"<p>Elementor Image widgets are now found and repaired where Elementor actually keeps them, instead of being refused. Worth taking if you use Elementor: broken images in Image widgets are now fixable from the plugin, and are no longer double-counted.<\/p>","1.0.0-rc.7":"<p>Important if you use a page builder: repairs inside Elementor pages could report success while the image stayed blank. Those repairs are now refused with an explanation instead, and repair counts match what you see on the issue.<\/p>","1.0.0-rc.6":"<p>Important if you have replaced a deleted image: repairs could report success while the page still showed a broken image, because only one of the addresses in the image was replaced. Repairs now fix the whole image and are only closed once the page really no longer refers to the old file.<\/p>","1.0.0-rc.5":"<p>Recommended for every site on MySQL or MariaDB: fixes repeat actions on an issue being wrongly refused, and stops database errors from writing table names or saved values into your debug log.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3796370,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3796370,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3796370,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3796370,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3796370,"resolution":"1","location":"assets","locale":"","width":2880,"height":1994},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3796370,"resolution":"2","location":"assets","locale":"","width":2880,"height":2756},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3796370,"resolution":"3","location":"assets","locale":"","width":2880,"height":3094},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3796370,"resolution":"4","location":"assets","locale":"","width":2880,"height":4154},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3796370,"resolution":"5","location":"assets","locale":"","width":2880,"height":3438},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3796370,"resolution":"6","location":"assets","locale":"","width":2880,"height":1800},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3796370,"resolution":"7","location":"assets","locale":"","width":2880,"height":1800}},"screenshots":{"1":"A scan in progress. Scans are batched and resumable, show real progress, and only ever read your site.","2":"The Dashboard: a media health score calculated from the files that were checked, with the counts behind it, the most urgent issues and your recent repairs.","3":"Every issue found, with the file, what is wrong, how many places use it and when it was detected \u2014 filterable by type, severity and status.","4":"An issue in detail: the root cause in plain language, and every page, post and featured image that uses the file.","5":"A repair preview. Nothing has been changed yet \u2014 this is what would change, and what would be left alone.","6":"Repair History: everything the plugin has changed, what the check afterwards found, who did it, and a way to undo it.","7":"Settings. External media checks stay off until you turn them on, and scheduled scans and email notifications are clearly marked as features the free plugin does not include."}},"plugin_section":[],"plugin_tags":[128337,84,233,292034,2956],"plugin_category":[50],"plugin_contributors":[292035],"plugin_business_model":[],"class_list":["post-400859","plugin","type-plugin","status-publish","hentry","plugin_tags-broken-images","plugin_tags-media","plugin_tags-media-library","plugin_tags-missing-files","plugin_tags-thumbnails","plugin_category-media","plugin_contributors-potensdigital","plugin_committers-potensdigital"],"banners":{"banner":"https:\/\/ps.w.org\/media-file-fixer\/assets\/banner-772x250.png?rev=3796370","banner_2x":"https:\/\/ps.w.org\/media-file-fixer\/assets\/banner-1544x500.png?rev=3796370","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/media-file-fixer\/assets\/icon-128x128.png?rev=3796370","icon_2x":"https:\/\/ps.w.org\/media-file-fixer\/assets\/icon-256x256.png?rev=3796370","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/media-file-fixer\/assets\/screenshot-1.png?rev=3796370","caption":"A scan in progress. Scans are batched and resumable, show real progress, and only ever read your site."},{"src":"https:\/\/ps.w.org\/media-file-fixer\/assets\/screenshot-2.png?rev=3796370","caption":"The Dashboard: a media health score calculated from the files that were checked, with the counts behind it, the most urgent issues and your recent repairs."},{"src":"https:\/\/ps.w.org\/media-file-fixer\/assets\/screenshot-3.png?rev=3796370","caption":"Every issue found, with the file, what is wrong, how many places use it and when it was detected \u2014 filterable by type, severity and status."},{"src":"https:\/\/ps.w.org\/media-file-fixer\/assets\/screenshot-4.png?rev=3796370","caption":"An issue in detail: the root cause in plain language, and every page, post and featured image that uses the file."},{"src":"https:\/\/ps.w.org\/media-file-fixer\/assets\/screenshot-5.png?rev=3796370","caption":"A repair preview. Nothing has been changed yet \u2014 this is what would change, and what would be left alone."},{"src":"https:\/\/ps.w.org\/media-file-fixer\/assets\/screenshot-6.png?rev=3796370","caption":"Repair History: everything the plugin has changed, what the check afterwards found, who did it, and a way to undo it."},{"src":"https:\/\/ps.w.org\/media-file-fixer\/assets\/screenshot-7.png?rev=3796370","caption":"Settings. External media checks stay off until you turn them on, and scheduled scans and email notifications are clearly marked as features the free plugin does not include."}],"raw_content":"<!--section=description-->\n<p>Broken media is hard to find and risky to fix. An image disappears from a page, a thumbnail stops loading, a PDF link goes dead \u2014 and the usual advice is to run a search-and-replace across your database and hope for the best.<\/p>\n\n<p>Media File Fixer takes the opposite approach. It scans what your site actually stores, tells you which media files are missing or at risk, explains <strong>why<\/strong> each one is broken in plain language, shows you <strong>every place<\/strong> it is used, and then repairs it in a way you can preview beforehand and undo afterwards.<\/p>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li><strong>Detect<\/strong> \u2014 you start a batched, resumable scan that reads your posts, pages, featured images, Elementor Image widgets and Media Library, and records every media reference it finds. Scans only read; they never change anything.<\/li>\n<li><strong>Diagnose<\/strong> \u2014 each unique file is checked once and given a plain-language root cause, not just \"404\".<\/li>\n<li><strong>See where it is used<\/strong> \u2014 every reference is indexed, so you can see which pages, posts and featured images point at a file before you touch it.<\/li>\n<li><strong>Repair<\/strong> \u2014 fix one location, or every location that uses the file, after previewing the exact change.<\/li>\n<li><strong>Verify and undo<\/strong> \u2014 the file is re-checked afterwards, the whole repair is recorded, and repairs that replaced something can be undone.<\/li>\n<\/ol>\n\n<h4>What it scans<\/h4>\n\n<ul>\n<li>Post and page content, including Gutenberg blocks and plain HTML (images, <code>srcset<\/code>, links to documents, <code>&lt;source&gt;<\/code>, <code>&lt;video&gt;<\/code>, <code>&lt;audio&gt;<\/code>, inline <code>url()<\/code> in style attributes)<\/li>\n<li>Featured images<\/li>\n<li><strong>Elementor Image widgets<\/strong>, read from where Elementor actually keeps them, so they are found even when the page content holds nothing<\/li>\n<li>Media Library attachments, including their generated sizes<\/li>\n<li>Media hosted on other websites, only if you turn on <strong>Check external media URLs<\/strong> in Settings (off by default)<\/li>\n<\/ul>\n\n<p>Published, private, scheduled, draft and pending content is scanned. Trashed content, auto-drafts and revisions are not.<\/p>\n\n<h4>Problems it identifies<\/h4>\n\n<ul>\n<li>Missing local file and missing attachment<\/li>\n<li>Missing featured image<\/li>\n<li>Missing thumbnail or generated size<\/li>\n<li>Broken local URL<\/li>\n<li>Old domain reference, left behind after a move or migration<\/li>\n<li>Broken document, including empty and invalid PDFs<\/li>\n<li>Dead external file (404 or 410)<\/li>\n<li>At-risk external file \u2014 it works today, but a third party controls it<\/li>\n<li>Could not verify \u2014 the check was inconclusive, so the file is never counted as healthy <em>or<\/em> broken<\/li>\n<\/ul>\n\n<p>The last three need <strong>Check external media URLs<\/strong>, which is off by default. While it is off, external files are reported as Not Checked and are never counted as healthy or broken.<\/p>\n\n<h4>Repairs included<\/h4>\n\n<ul>\n<li><strong>Regenerate missing image sizes<\/strong> from the attachment's own original, which is only ever read<\/li>\n<li><strong>Use another file here<\/strong> \u2014 pick an existing Media Library file, or upload one in the same step<\/li>\n<li><strong>Suggested replacements<\/strong> \u2014 when your Media Library already holds a file that is plainly the same one (the same name in another folder, the original of a missing size, a re-upload), it is offered first with the reason it was chosen, and used only if you choose it<\/li>\n<li><strong>Correct the address<\/strong> \u2014 fix a broken or outdated local URL<\/li>\n<li><strong>Repair all locations<\/strong> \u2014 point every place that uses one broken file at the replacement, in a single operation, including a mixture of ordinary pages and Elementor widgets<\/li>\n<li><strong>Repair an Elementor Image widget<\/strong> \u2014 the address and the Media Library item are both updated in Elementor's own data, every other setting is left alone, and Elementor's copy of the page and its stylesheet are rebuilt<\/li>\n<li><strong>Undo<\/strong> \u2014 put back what a repair replaced<\/li>\n<\/ul>\n\n<h4>Built to be safe<\/h4>\n\n<p>Every repair runs the same way: analyse, preview, snapshot, repair, verify, log.<\/p>\n\n<ul>\n<li>Nothing is changed until you confirm, and the preview shows the exact values before and after.<\/li>\n<li>The original value of every field is stored before it is modified.<\/li>\n<li>Only the one occurrence you selected is rewritten. The rest of the content stays byte for byte identical.<\/li>\n<li>Elementor pages are changed widget by widget in Elementor's own data \u2014 never by searching and replacing text in it \u2014 so every other widget and setting is untouched.<\/li>\n<li>If anything else would change, or a page will not save, the content is restored exactly as it was and the repair is recorded as failed.<\/li>\n<li>Repairing several locations is all or nothing. If any of them has been edited since the last scan, nothing is written at all.<\/li>\n<li>An issue is only marked resolved once the file has been re-checked and the problem is genuinely gone.<\/li>\n<li>Undoing is refused \u2014 rather than overwriting newer work \u2014 if the content changed after the repair.<\/li>\n<\/ul>\n\n<h4>Not in the free plugin<\/h4>\n\n<p>So you know what you are getting:<\/p>\n\n<ul>\n<li>Recurring scheduled scans, continuous monitoring and email alerts (in the free plugin, every scan is started by an administrator)<\/li>\n<li>Repairing several different files or issues together in one go<\/li>\n<li>Everything in Elementor other than the Image widget \u2014 background images, galleries, carousels and sliders, and images set in custom CSS<\/li>\n<li>Other page builders, and plugin integrations such as WooCommerce and ACF<\/li>\n<li>Rollback in bulk, advanced reporting and CSV export<\/li>\n<\/ul>\n\n<p>Scanning covers posts, pages, featured images, the Media Library and Elementor Image widgets. Custom post types can be added with the <code>media_file_fixer_scan_post_types<\/code> filter but are not scanned by default. Other page builders' storage, shortcode attributes, widgets, menus and theme or plugin CSS files are not parsed.<\/p>\n\n<h4>What Media File Fixer is not<\/h4>\n\n<p>It is not an image optimiser, a CDN, a backup plugin, a security scanner, an SEO suite, a compression or WebP plugin, or a media cleaner. It never deletes your media, and a file that nothing uses is reported as \"0 locations\" \u2014 information, never a problem.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>Media File Fixer does not send your website URL, media URLs, content, scan results, or any analytics to Media File Fixer or Potens Digital. There is no telemetry, no tracking, no account, and no external service to sign up for.<\/p>\n\n<p>Suggested privacy policy text is available under Settings \u2192 Privacy.<\/p>\n\n<h4>External requests<\/h4>\n\n<p>Out of the box, Media File Fixer contacts no other website. External media checks are <strong>off by default<\/strong>: nothing is sent until an administrator turns on <strong>Check external media URLs<\/strong> under Media File Fixer \u2192 Settings.<\/p>\n\n<p>While it is on, scans and re-checks send a HEAD request (or a GET request limited to 1 KB) directly to each external media URL found in your content, to find out whether that file still loads. These requests go to whichever third-party servers host those files, never to Media File Fixer or Potens Digital, and those servers' own terms and privacy policies apply. Each server receives your server's IP address, the address of the file, and a user agent naming the plugin and its version. The requests carry no cookies, no login details and no information about your visitors. Private and internal network addresses are never contacted.<\/p>\n\n<p>While it is off, no lookup or request is made for external files. They are reported as Not Checked and left out of the health score. Turning the setting off also stops a scan that is already running from contacting anyone, from its next batch on.<\/p>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WordPress 6.5 or later<\/li>\n<li>PHP 7.4 or later (tested on PHP 7.4, 8.0, 8.1, 8.2, 8.3 and 8.4)<\/li>\n<li>MySQL or MariaDB (tested against MySQL 5.7, MySQL 8.0 and MariaDB 10.11)<\/li>\n<\/ul>\n\n<p>The plugin creates its own database tables. It loads nothing on the front end of your site.<\/p>\n\n<h3>Credits<\/h3>\n\n<ul>\n<li>Inter typeface by The Inter Project Authors \u2014 SIL Open Font License 1.1 (assets\/fonts\/Inter-OFL-1.1.txt).<\/li>\n<li>Icon geometry derived from Lucide \u2014 ISC License (assets\/icons-LICENSE.txt).<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install Media File Fixer from <strong>Plugins \u2192 Add New<\/strong>, or upload the <code>media-file-fixer<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>Media File Fixer<\/strong> at the bottom of the admin menu.<\/li>\n<li>Choose what to scan and select <strong>Start First Scan<\/strong>. The first scan only reads your site \u2014 nothing is changed.<\/li>\n<li>When the scan finishes, open <strong>Issues<\/strong> to see what was found, and repair what you want to repair.<\/li>\n<\/ol>\n\n<p>Every scan is started by an administrator from this screen; the free plugin never starts one by itself. Large sites are scanned in small batches, so a scan can be paused, resumed and continued later. Once you have started a scan, you can leave the scan page open to keep it moving quickly, or close it and let WordPress's scheduled tasks (WP-Cron) continue that scan's remaining batches in the background.<\/p>\n\n<p>Media hosted on other websites is not contacted unless you turn on <strong>Check external media URLs<\/strong> in Settings. See \"External requests\" in the description for exactly what that sends.<\/p>\n\n<p>Uninstalling the plugin leaves your data in place unless you switch on <strong>Delete Data on Uninstall<\/strong> in Settings \u2192 Advanced. Your media files are never deleted either way.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20it%20delete%20or%20change%20my%20media%20files%3F\"><h3>Will it delete or change my media files?<\/h3><\/dt>\n<dd><p>No. Media File Fixer never deletes a media file. The only repair that writes a new file is \"Regenerate missing image sizes\", which creates sizes that are missing and never overwrites an existing file. Your original images are only ever read.<\/p><\/dd>\n<dt id=\"will%20it%20change%20my%20posts%20and%20pages%3F\"><h3>Will it change my posts and pages?<\/h3><\/dt>\n<dd><p>Only when you ask it to, and only the exact occurrence you chose. Every content repair is previewed first, the original value is stored before the change, and the content is read back afterwards: if anything beyond that one reference moved, the previous content is written back and the repair is recorded as failed.<\/p><\/dd>\n<dt id=\"can%20i%20undo%20a%20repair%3F\"><h3>Can I undo a repair?<\/h3><\/dt>\n<dd><p>Yes, for repairs that replaced something \u2014 a file or an address. Open <strong>Repair History<\/strong>, choose the repair, and you will see what it changed before you confirm. If the content has been edited since the repair, undoing is refused rather than overwriting that newer work. Regenerating image sizes cannot be undone, because it only ever added files that were missing.<\/p><\/dd>\n<dt id=\"how%20are%20replacement%20files%20suggested%3F\"><h3>How are replacement files suggested?<\/h3><\/dt>\n<dd><p>From your own Media Library, by rules you can read: the same file name in another folder, the original of a missing generated size, a re-upload with a copy number added, the same image dimensions, a matching title. Each suggestion says which of those it matched and is marked a <strong>Strong match<\/strong> or a <strong>Possible match<\/strong> \u2014 never a percentage. Only files of the same kind that really exist on your server are offered, and nothing is suggested when nothing is a confident match. Nothing is sent anywhere, no AI is involved, and a suggestion is never used until you choose it and confirm the preview.<\/p><\/dd>\n<dt id=\"does%20it%20send%20anything%20to%20your%20servers%3F\"><h3>Does it send anything to your servers?<\/h3><\/dt>\n<dd><p>No. See the Privacy section above. The only outbound requests the plugin can make are the optional checks of external media, which are off until an administrator turns them on and go to the host serving that file, not to us.<\/p><\/dd>\n<dt id=\"does%20it%20contact%20other%20websites%3F\"><h3>Does it contact other websites?<\/h3><\/dt>\n<dd><p>Not unless you ask it to. <strong>Check external media URLs<\/strong> is off by default, and while it is off, scans, background batches and re-checks send nothing to anyone. When you turn it on, it sends small requests to the servers hosting the external media your content uses. \"External requests\" in the description says exactly what they receive.<\/p><\/dd>\n<dt id=\"does%20it%20scan%20on%20its%20own%2C%20or%20in%20the%20background%3F\"><h3>Does it scan on its own, or in the background?<\/h3><\/dt>\n<dd><p>A scan only ever starts when an administrator starts one from the Media File Fixer screen in wp-admin. The free plugin never starts a scan by itself; recurring scheduled scans are part of Media File Fixer Pro. Once you have started a scan it runs in small batches: the scan page drives them while it is open, and if you close the page, WordPress's scheduled tasks (WP-Cron) can continue that scan's remaining batches in the background until it finishes. You do not have to keep the page open, but it is quicker if you do.<\/p><\/dd>\n<dt id=\"does%20it%20run%20a%20search%20and%20replace%20on%20my%20database%3F\"><h3>Does it run a search and replace on my database?<\/h3><\/dt>\n<dd><p>Never. Content is re-parsed with the same parser the scan uses, and only the single occurrence you selected is rewritten.<\/p><\/dd>\n<dt id=\"what%20does%20%22could%20not%20verify%22%20mean%3F\"><h3>What does \"Could not verify\" mean?<\/h3><\/dt>\n<dd><p>The check was inconclusive. A server may block automated requests, rate-limit them, time out, or return an error. That is not proof the file is broken, and it is certainly not proof it is fine, so the file is reported honestly as unverified and is never counted as healthy or broken.<\/p><\/dd>\n<dt id=\"why%20is%20a%20working%20file%20on%20another%20website%20shown%20as%20%22at%20risk%22%3F\"><h3>Why is a working file on another website shown as \"at risk\"?<\/h3><\/dt>\n<dd><p>Because someone else controls it. It works today, but it can disappear without warning. If you serve your own media through a CDN, you can tell the plugin that host belongs to you with the <code>media_file_fixer_local_hosts<\/code> filter, and it will be treated as local.<\/p><\/dd>\n<dt id=\"i%20have%20media%20that%20nothing%20uses.%20is%20that%20a%20problem%3F\"><h3>I have media that nothing uses. Is that a problem?<\/h3><\/dt>\n<dd><p>No, and the plugin will never tell you it is. Unused files are still checked so you know whether they are intact, but \"used in 0 locations\" is information, not an issue. Media File Fixer is not a media cleaner.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20builders%20like%20elementor%20or%20divi%3F\"><h3>Does it work with page builders like Elementor or Divi?<\/h3><\/dt>\n<dd><p>Partly, and only where it has been verified. <strong>Elementor Image widgets<\/strong> are fully supported: they are read from Elementor's own data, repaired there, and checked afterwards \u2014 so an image is found and fixed even on a page whose stored content is empty. Everything else in Elementor is not: background images, galleries, carousels, sliders and images set in custom CSS are reported if they happen to appear in the copy of the page Elementor keeps, but they are not repaired.<\/p>\n\n<p>Other builders, including Divi, are not supported in version 1.0. Plain HTML stored in your content is always found normally. Shortcode attributes, widgets and menus are not parsed.<\/p>\n\n<p>Where a page is built by a builder this plugin cannot repair, it says so and refuses rather than changing a copy of the page and reporting a success you could not see.<\/p><\/dd>\n<dt id=\"does%20it%20scan%20custom%20post%20types%3F\"><h3>Does it scan custom post types?<\/h3><\/dt>\n<dd><p>Not by default. Posts, pages, featured images, Elementor Image widgets and the Media Library are scanned. Developers can add more post types with the <code>media_file_fixer_scan_post_types<\/code> filter.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20website%3F\"><h3>Will it slow down my website?<\/h3><\/dt>\n<dd><p>No. Nothing is loaded on the front end \u2014 no scripts and no styles, and none of the scanner, admin or repair code is built when a visitor's page is served. The admin screens only run in wp-admin. A scan runs in small batches with time and memory budgets, so it stays well within what shared hosting allows, and any batches it leaves for the background run through WordPress's scheduled tasks in their own requests, not inside a visitor's page.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Yes. Each site in a network gets its own tables and its own scans and issues. There is no network-wide dashboard.<\/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 how much content and media you have. Scans are batched and resumable, and the Scan screen shows real progress throughout. A site with a few thousand posts is scanned in minutes with the page open.<\/p><\/dd>\n<dt id=\"is%20it%20accessible%20and%20translation-ready%3F\"><h3>Is it accessible and translation-ready?<\/h3><\/dt>\n<dd><p>Yes. The admin screens are checked against WCAG 2.1 A and AA with automated tooling, every string is translatable, and a translation template ships with the plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First stable release. Everything listed below, from detection and diagnosis to repairs you can preview and undo, Elementor Image widgets and replacement suggestions, tested on PHP 7.4 to 8.4, MySQL 5.7 and 8.0, MariaDB 10.11 and WordPress 6.5 to 7.1.<\/li>\n<li>Changed since 1.0.0-rc.12: checking media hosted on other websites is now off until an administrator turns it on, under the new <strong>Check external media URLs<\/strong> setting. The old setting, which was on by default, is not carried over, so after updating nothing is sent to other websites until you opt in, and external files are reported as Not Checked.<\/li>\n<li>Changed since 1.0.0-rc.12: Media File Fixer moved from below Media to the bottom of the admin menu.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.12<\/h4>\n\n<ul>\n<li>New: replacement suggestions. When a broken file's replacement is already in your Media Library \u2014 the same name in another folder, the original of a missing size, a re-upload \u2014 the issue page offers it first, with the reason it was chosen and whether it is a strong or a possible match. Nothing is used until you choose it, and choosing it runs the same preview, snapshot and verification as picking a file yourself. The Media Library picker is still there.<\/li>\n<li>Matching is deterministic and local: no AI, no external service, and a fixed, small number of database queries however large the Media Library is.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.11<\/h4>\n\n<ul>\n<li>Internal: reserves the <code>bulk_repair<\/code> history label used by Media File Fixer Pro. No change to how\nthe free plugin scans, diagnoses or repairs anything, and nothing new runs on a site without Pro.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.10<\/h4>\n\n<ul>\n<li>Internal: Media File Fixer now has one place that knows whether the Pro add-on is active, so a Pro installation can identify itself. Nothing changes on a site without Pro.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.9<\/h4>\n\n<ul>\n<li>Fixed, found while reviewing rc.8: if Elementor was deactivated but its data left behind, the images its widgets used stayed listed as places the file was used \u2014 alongside the page content that renders in its place \u2014 and the plugin offered to repair a widget nothing would draw. Those locations are now retired on the next scan, and the page content counts again.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.8<\/h4>\n\n<ul>\n<li>New: Elementor Image widgets are now found and repaired. Elementor keeps the page in its own data and draws from that, so this is the only place where changing an image changes what visitors see \u2014 and it means an image is found even on a page whose content is otherwise empty.<\/li>\n<li>A repair of an Elementor image updates both the file and the Media Library item it points at, keeps the chosen image size and every other widget setting, and asks Elementor to rebuild its copy of the page and its stylesheet.<\/li>\n<li>\"Repair all locations\" now spans ordinary pages and Elementor widgets together, and is still all or nothing.<\/li>\n<li>An Elementor image is counted as one place, not as the two or three settings that describe it, and the copy Elementor keeps of the page is no longer counted as a second place for the same image.<\/li>\n<li>Undoing a repair restores the Elementor page's own data, and is still refused if the page was edited afterwards.<\/li>\n<li>An issue is resolved only once the widget has been read again and genuinely no longer names the old file.<\/li>\n<li>Fixed: when nothing used a file any more but the issue stayed open, the message blamed the Media Library even when the Media Library was not holding it. It now says what is actually true.<\/li>\n<li>Still not repaired, and not claimed: Elementor background images, galleries, carousels, sliders and custom CSS, and other page builders.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.7<\/h4>\n\n<ul>\n<li>Fixed: repairing an image inside an Elementor page reported success and closed the issue, while the image on the page was still blank. Elementor keeps its own copy of the page and draws from that, so changing the page content only hid the problem from the plugin. Images inside a page a builder controls are no longer repaired automatically: the repair is refused with an explanation, and the issue stays open until the image is replaced in the builder \u2014 or the file itself is repaired, which still works.<\/li>\n<li>Fixed: a repair counted every address inside an image instead of the image itself, so sixteen images were reported as \"All 80 locations now point at the new file.\" Previews, outcomes and Repair History now all count the places you can actually see, and agree with the number shown on the issue.<\/li>\n<li>A repair of a file used in both ordinary pages and builder pages now repairs the ordinary ones and says plainly which it has left alone.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.6<\/h4>\n\n<ul>\n<li>Fixed: replacing an image that had been deleted from the Media Library could leave the page still showing a broken image, even though the repair reported success and the issue was closed. WordPress stores the original and every generated size in the same <code>&lt;img&gt;<\/code> tag, and only the one address was being replaced \u2014 so a browser picking any of the others still asked for a file that was gone.<\/li>\n<li>Repairing an image now repairs the whole image: every address in the tag, the attachment it says it is, and the responsive sizes and dimensions WordPress works out from it. All of them are taken from the replacement.<\/li>\n<li>Fixed: the block in the editor still pointed at the deleted image after a repair, so opening the page showed a block whose image no longer existed.<\/li>\n<li>A repair is now only recorded as resolved once the page has been read again and genuinely no longer refers to the file that was replaced.<\/li>\n<li>Fixed: \"Repair All Locations\" stopped after 50 places while reporting that it had changed all of them. It now changes every one, and refuses outright \u2014 changing nothing \u2014 if there are more than one repair can handle safely.<\/li>\n<li>Repairing one image can clear several issues at once, because the original and each of its generated sizes were each counted as a problem of their own.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.5<\/h4>\n\n<ul>\n<li>Fixed: on MySQL and MariaDB, acting on the same issue twice in quick succession could wrongly report \"This issue has already changed. Reload the page.\" \u2014 for example re-checking an issue you had just ignored. Repeat actions now work as intended.<\/li>\n<li>Fixed: when a database error was logged, the message could include the table name, and for a duplicate-key error the value being saved. Logs now describe what went wrong without naming tables or repeating your data.<\/li>\n<li>Verified on PHP 7.4 through 8.4, WordPress 6.5 and current, and against MySQL 5.7, MySQL 8.0 and MariaDB 10.11.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.4<\/h4>\n\n<ul>\n<li>New: <strong>Repair All Locations<\/strong>. When a missing file is used in several places, you can now point every one of them at a replacement in a single operation, instead of repairing them one at a time.<\/li>\n<li>You see exactly how many places will change before you confirm, and each one is listed.<\/li>\n<li>Repairing several places is all or nothing: if any of them has been edited since the last scan, nothing is changed and you are asked to scan again; and if any page cannot be saved, every page that was already changed is put straight back.<\/li>\n<li>Repairing one location at a time is still available as a second choice.<\/li>\n<li>Repair History records the repair once, with every location it changed, and undoing it restores all of them.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.3<\/h4>\n\n<ul>\n<li>Fixed: when a missing file was used in several places, repairing one place left the issue open with no sign of progress, and the list of places to repair still offered the one you had just fixed.<\/li>\n<li>Repairing one place now says how many were repaired and how many still need attention, and only the places that are left are offered next.<\/li>\n<li>The number of locations shown on the issue updates as you repair, so the page no longer contradicts itself.<\/li>\n<li>Repairing the last place that used a missing file now closes the issue, without waiting for the missing file to come back.<\/li>\n<li>A file that is still in your Media Library keeps its issue open even when nothing uses it any more, because the broken file is still there.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.2<\/h4>\n\n<ul>\n<li>Checked against WordPress.org's official Plugin Check: no errors. Comments were added where an automated check cannot see that a value was already made safe, so the remaining notes are easy to review.<\/li>\n<li>No functional change from 1.0.0-rc.1.<\/li>\n<\/ul>\n\n<h4>1.0.0-rc.1<\/h4>\n\n<ul>\n<li>First release candidate for version 1.0. No new features: this build is about being ready for real websites.<\/li>\n<li>Accessibility: the admin screens pass an automated WCAG 2.1 A\/AA check, including while a scan, a repair and an undo are running. Two low-contrast labels were corrected.<\/li>\n<li>Translation-ready: every string is translatable, the translation template (.pot) ships with the plugin, and translated JavaScript strings are picked up from the plugin's own languages folder.<\/li>\n<li>Privacy: Media File Fixer now offers suggested privacy policy text in Settings \u2192 Privacy, explaining exactly what it stores and what leaves your website (nothing, unless you switch on external file checks).<\/li>\n<li>Honest settings: the \"Auto-suggest Replacements\" switch is gone until the feature it belongs to exists.<\/li>\n<li>Sturdier: every screen keeps working and explains itself if the plugin's database tables are missing or damaged, instead of showing an error.<\/li>\n<li>Verified on WordPress 6.5 (the oldest version supported) and on the current release, and on upgrades from every earlier build.<\/li>\n<\/ul>\n\n<h4>0.7.0-alpha<\/h4>\n\n<ul>\n<li>New <strong>Media Health Score<\/strong>: one number from 0 to 100 with a plain rating (Excellent, Good, Needs Attention, Critical), and a short explanation of what is holding it down.<\/li>\n<li>The score counts media files, not usage locations, so one broken image used on fifty pages counts once. Broken files weigh heaviest, at-risk files less, and files that could not be verified are never counted as healthy.<\/li>\n<li>Files that were not checked are left out of the score entirely rather than flattering it, and are reported separately.<\/li>\n<li>The Dashboard now shows real numbers: the score, broken, at risk, could not verify and healthy files, the latest scan, the most urgent critical issues and your most recent repairs.<\/li>\n<li>First-run onboarding explains what a scan does and offers one button; it makes way for the Dashboard as soon as a scan has finished.<\/li>\n<li>After a scan you can go straight to <strong>Review Issues<\/strong> or <strong>View Dashboard<\/strong>.<\/li>\n<\/ul>\n\n<h4>0.6.4-alpha<\/h4>\n\n<ul>\n<li>Fixed the Repair History table cutting off its right-hand columns: when the table is wider than the space available it now scrolls sideways inside its card, with a soft shadow showing there is more to see.<\/li>\n<li>Every column stays reachable \u2014 when, repair, file, where, result, check, who, and the Details button. Nothing is hidden to make the table fit.<\/li>\n<li>Roomier, more sensible column widths so the table is no wider than it needs to be, and on phones each repair is still shown as a labelled card.<\/li>\n<li>The page itself never scrolls sideways; only the table does.<\/li>\n<\/ul>\n\n<h4>0.6.3-alpha<\/h4>\n\n<ul>\n<li>The \"Repair this issue\" section has been tidied up: the card now has proper inner padding, so nothing sits against its edges.<\/li>\n<li>Clearer spacing between the heading, each repair option, the fields a repair needs and the Preview Repair button.<\/li>\n<li>Repair options are roomier cards with a gentler selected state, and the button now sits in its own clearly separated area.<\/li>\n<li>Better spacing on phones and tablets as well as desktop. Nothing about how repairs work has changed.<\/li>\n<\/ul>\n\n<h4>0.6.2-alpha<\/h4>\n\n<ul>\n<li>New \"Repair History\" page: everything Media File Fixer has changed on your site, newest first \u2014 when it happened, which file and place it changed, whether it worked, whether the check afterwards passed, and who did it.<\/li>\n<li>Open any repair to see the exact value before and after, where it changed, the issue it was fixing and the result of the check.<\/li>\n<li>Undo a repair: when a repair replaced something, you can put the earlier version back. You see exactly what will happen, and confirm it first.<\/li>\n<li>If the content changed after the repair \u2014 by you, another plugin, or a later repair \u2014 undoing is refused instead of overwriting that newer work.<\/li>\n<li>Undoing never deletes a file, and it is recorded too: the repair stays in your history marked as undone, and the undo gets its own entry.<\/li>\n<li>Regenerating missing image sizes is never offered for undo: it only ever created files that were missing, so undoing it would delete images your site is now using.<\/li>\n<\/ul>\n\n<h4>0.6.1-alpha<\/h4>\n\n<ul>\n<li>Two more repairs, each changing one place at a time: put a different file in a chosen location (an existing Media Library file, or one you upload right there through WordPress), or correct a broken address.<\/li>\n<li>Before anything happens you see the content, the location and both values, and you confirm. Only that one occurrence changes \u2014 the same file used elsewhere on the page is left alone, and the rest of your content is not touched.<\/li>\n<li>If saving would change anything beyond that one place, the content is put back exactly as it was and the repair is recorded as failed.<\/li>\n<li>A replacement has to make sense: images replace images, documents replace documents, only file types WordPress allows, and the file has to be there. Addresses must be on your own site and actually lead to a file.<\/li>\n<li>After a repair the file is checked again. The issue is only resolved when the problem is really gone; if the same file is still used somewhere else, the issue stays open and says so.<\/li>\n<\/ul>\n\n<h4>0.6.0-alpha<\/h4>\n\n<ul>\n<li>First repair: an image whose generated size (thumbnail) is missing can be repaired from the issue page. Media File Fixer shows exactly what it will do, waits for your confirmation, creates only the sizes WordPress expects, and checks the result before marking the issue resolved.<\/li>\n<li>Your original image is only ever read \u2014 never changed, replaced or deleted \u2014 and no existing file is overwritten. Your posts and pages are not edited.<\/li>\n<li>If a repair fails, the issue stays open, anything the repair wrote is removed and the attachment details are restored.<\/li>\n<li>Every repair is recorded with what it changed, who ran it, whether the check afterwards passed, and the file details as they were before \u2014 shown as \"Repair history\" on the issue.<\/li>\n<\/ul>\n\n<h4>0.5.0-alpha<\/h4>\n\n<ul>\n<li>The Issues screen can now be worked through: search by file name or URL, filter by issue type, severity, status (open, ignored, resolved) and whether the file is on this site or another website, sort the list, and page through it.<\/li>\n<li>New actions on every issue: Recheck (looks at the file again), Ignore (keeps the issue but takes it out of the open list) and Restore. Nothing is repaired or changed \u2014 repairs come in a later version.<\/li>\n<li>Each issue now states its status, severity, root cause, where the file is used, when it was first detected and when it was last checked. Resolved issues stay available as history and reopen if the problem returns; an ignored issue stays ignored while the problem is still there.<\/li>\n<li>Controls for repair features that do not exist yet were removed, so nothing in the plugin looks like it can fix a file before it can.<\/li>\n<\/ul>\n\n<h4>0.4.1-alpha<\/h4>\n\n<ul>\n<li>\"Healthy\" now means a file was checked successfully and has no open issue. Files with a missing generated size (or any other open issue) are no longer counted as healthy in the scan summary or on the Dashboard.<\/li>\n<li>The health groups \u2014 Healthy, Broken, At risk, Could not verify, Not checked \u2014 never overlap and always add up to the number of files checked.<\/li>\n<li>Fixed: the Scan screen could show out-of-date progress right after pausing a scan.<\/li>\n<\/ul>\n\n<h4>0.4.0-alpha<\/h4>\n\n<ul>\n<li>\"Used in\" now names every place a file is used: the content title and type, whether it is the content or the featured image, where inside the content each occurrence sits, and links to edit or view it.<\/li>\n<li>A file used in several places is listed once per content item with its occurrences; long lists are paginated.<\/li>\n<li>The Issues list says how often and where each file is used. A Media Library file nothing uses shows \"0 locations\" \u2014 information, never a problem.<\/li>\n<li>Locations that stopped using a file are kept as history and reported separately instead of being counted as current usage.<\/li>\n<\/ul>\n\n<h4>0.3.1-alpha<\/h4>\n\n<ul>\n<li>External media status refined: a working file hosted on another website is an \"At-risk external file\" (it depends on that website); access denied, rate limits, server errors, timeouts and connection problems are \"Could not verify\" and are never counted as healthy or broken; 404\/410 remain \"Dead external file\".<\/li>\n<li>The scan summary and Dashboard show files that could not be verified separately. Existing external issues are updated automatically on the next scan.<\/li>\n<\/ul>\n\n<h4>0.3.0-alpha<\/h4>\n\n<ul>\n<li>Media validation after discovery: local files, attachments, metadata and generated sizes are checked on disk; external files are checked safely (HEAD first, limited GET fallback, strict timeouts and redirects, private networks blocked) when enabled.<\/li>\n<li>Diagnosis and real issues: missing local file, attachment missing, missing featured image, missing thumbnail \/ generated size, broken local URL, old domain reference, broken document, dead and at-risk external files. Issues are created, updated, resolved and reopened automatically; ignored issues stay ignored.<\/li>\n<li>Issues list and details, dashboard file counts and scan summaries show real results.<\/li>\n<\/ul>\n\n<h4>0.2.0-alpha<\/h4>\n\n<ul>\n<li>Staging alpha. Media discovery: batched, resumable scans of posts, pages, featured images and the Media Library (Gutenberg blocks and HTML), with live progress, pause, resume and cancel. Scans only read your site.<\/li>\n<li>Scan finalization is a short final step that always runs to completion once it starts.<\/li>\n<li>Database schema version 2.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Plugin foundation: bootstrap, service container, settings, capabilities, database migration framework, REST API base.<\/li>\n<li>Branded admin application shell: Dashboard, Scan, Issues, Issue Details, and Settings screens.<\/li>\n<\/ul>","raw_excerpt":"Find broken images and media files, see everywhere they are used, understand why they broke, and repair them safely.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/400859","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=400859"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/potensdigital"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=400859"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=400859"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=400859"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=400859"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=400859"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=400859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}