{"id":368905,"date":"2026-09-28T12:43:56","date_gmt":"2026-09-28T12:43:56","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/broken-image-cleaner\/"},"modified":"2026-09-28T12:01:26","modified_gmt":"2026-09-28T12:01:26","slug":"ghostpix-broken-image-cleaner","status":"publish","type":"plugin","link":"https:\/\/mai.wordpress.org\/plugins\/ghostpix-broken-image-cleaner\/","author":18542176,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.2","requires":"5.6","requires_php":"7.4","requires_plugins":null,"header_name":"Ghostpix Broken Image Cleaner","header_author":"Harit Panchal","header_description":"Finds images in post content whose files are missing from the uploads folder, and removes them safely \u2014 after review, with one-click undo.","assets_banners_color":"242259","last_updated":"2026-09-28 12:01:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/haritpanchal\/ghostpix-broken-image-cleaner","header_author_uri":"https:\/\/profiles.wordpress.org\/haritpanchal\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":38,"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":"haritpanchal","date":"2026-09-28 12:01:26","revision":3717099}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3717098,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3717098,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3717098,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3717098,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3717098,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3717098,"resolution":"1","location":"assets","locale":"","width":1568,"height":722},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3717098,"resolution":"2","location":"assets","locale":"","width":1568,"height":722},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3717098,"resolution":"3","location":"assets","locale":"","width":1568,"height":722}},"screenshots":{"1":"The results table, showing each broken image with the post it appears in.","2":"Reviewing a removal before applying it.","3":"Plugin settings, including which post types to scan and how long to keep undo data."}},"plugin_section":[],"plugin_tags":[128337,155767,234534,253777,205290],"plugin_category":[],"plugin_contributors":[196202],"plugin_business_model":[],"class_list":["post-368905","plugin","type-plugin","status-publish","hentry","plugin_tags-broken-images","plugin_tags-classic-editor","plugin_tags-content-cleanup","plugin_tags-media-cleanup","plugin_tags-missing-images","plugin_contributors-haritpanchal","plugin_committers-haritpanchal"],"banners":{"banner":"https:\/\/ps.w.org\/ghostpix-broken-image-cleaner\/assets\/banner-772x250.png?rev=3717098","banner_2x":"https:\/\/ps.w.org\/ghostpix-broken-image-cleaner\/assets\/banner-1544x500.png?rev=3717098","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/ghostpix-broken-image-cleaner\/assets\/icon.svg?rev=3717098","icon":"https:\/\/ps.w.org\/ghostpix-broken-image-cleaner\/assets\/icon.svg?rev=3717098","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ghostpix-broken-image-cleaner\/assets\/screenshot-1.jpg?rev=3717098","caption":"The results table, showing each broken image with the post it appears in."},{"src":"https:\/\/ps.w.org\/ghostpix-broken-image-cleaner\/assets\/screenshot-2.jpg?rev=3717098","caption":"Reviewing a removal before applying it."},{"src":"https:\/\/ps.w.org\/ghostpix-broken-image-cleaner\/assets\/screenshot-3.jpg?rev=3717098","caption":"Plugin settings, including which post types to scan and how long to keep undo data."}],"raw_content":"<!--section=description-->\n<p>Over the years, a WordPress site loses image files. Migrations drop them, media\nlibraries get purged, folders get reorganised. The <code>&lt;img&gt;<\/code> tags stay behind in your\npost content, pointing at files that are no longer there. Visitors see a broken-image\nicon, your server answers a 404, and the damage is spread across thousands of old\nposts that nobody is going to open by hand.<\/p>\n\n<p>Ghostpix Broken Image Cleaner finds those references and removes them from the content itself.<\/p>\n\n<p><strong>It edits your content, so it is built to be careful about it:<\/strong><\/p>\n\n<ul>\n<li><strong>Nothing is changed without your say-so.<\/strong> Scanning is read-only. It produces a\nlist. You decide which entries to act on.<\/li>\n<li><strong>Detection is based on the filesystem, not guesswork.<\/strong> The plugin checks whether\nthe file actually exists in your uploads folder. There are no network requests, so\nthere is nothing to be confused by a slow server, a timeout, or hotlink protection.<\/li>\n<li><strong>Every removal can be undone.<\/strong> The post's original content is saved before the\nedit, and a single click puts it back.<\/li>\n<li><strong>The rest of your post is left alone, byte for byte.<\/strong> Only the broken image is\ntouched. Your markup, shortcodes and formatting are not reformatted around it.<\/li>\n<\/ul>\n\n<p><strong>It cleans up the leftovers, too.<\/strong> Removing an <code>&lt;img&gt;<\/code> usually strands the markup\nthat wrapped it. The plugin also removes the container when nothing else is left in\nit \u2014 the Classic Editor's <code>[caption]<\/code> shortcode, a link that only wrapped the image,\nand empty <code>&lt;figure&gt;<\/code>, <code>&lt;figcaption&gt;<\/code> and <code>&lt;picture&gt;<\/code> elements. No empty boxes or\norphaned captions left behind.<\/p>\n\n<h4>Built for Classic Editor content<\/h4>\n\n<p>This plugin targets content where images live as raw HTML in the post body, which is\nhow the Classic Editor stores them. That is exactly the older content most likely to\nhave accumulated broken images.<\/p>\n\n<h4>No external services<\/h4>\n\n<p>This plugin makes no outbound connections of any kind. It does not phone home, does\nnot send your content anywhere, and does not require an account. Everything happens\non your own server.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin to <code>\/wp-content\/plugins\/ghostpix-broken-image-cleaner<\/code>, or install it\nthrough the Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>Tools \u2192 Broken Images<\/strong> and start a scan.<\/li>\n<li>Review the results, select the entries you want to clean, and choose <strong>Remove<\/strong>.<\/li>\n<\/ol>\n\n<p>Taking a database backup before your first bulk removal is always a good idea, even\nthough the plugin keeps its own undo data.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20delete%20my%20image%20files%3F\"><h3>Does this delete my image files?<\/h3><\/dt>\n<dd><p>No. It never deletes, moves or modifies any file, and it never deletes anything from\nyour Media Library. It only edits the HTML in your post content, and only where the\nfile is already missing.<\/p><\/dd>\n<dt id=\"what%20counts%20as%20a%20broken%20image%3F\"><h3>What counts as a broken image?<\/h3><\/dt>\n<dd><p>An image is reported when its file cannot be found in your uploads folder, or when\nthe file exists but is empty. Images hosted on other websites are not checked in this\nversion.<\/p><\/dd>\n<dt id=\"an%20image%20shows%20up%20that%20i%20know%20is%20fine.%20why%3F\"><h3>An image shows up that I know is fine. Why?<\/h3><\/dt>\n<dd><p>The most common cause is a missing generated size \u2014 for example, <code>photo-150x150.jpg<\/code>\nis gone but <code>photo.jpg<\/code> is still there. Those are reported separately and are <em>not<\/em>\nincluded in the default selection, because the right fix is usually to regenerate\nyour thumbnails, not to delete the image.<\/p><\/dd>\n<dt id=\"an%20image%20that%20displays%20perfectly%20well%20is%20in%20the%20list.%20why%3F\"><h3>An image that displays perfectly well is in the list. Why?<\/h3><\/dt>\n<dd><p>Responsive images offer the browser several sizes through a <code>srcset<\/code> attribute.\nIf one of those sizes has gone missing the image still displays, because the\nbrowser falls back to the one that works. Cleaning it edits only the <code>srcset<\/code>\nlist \u2014 the image itself is left exactly where it is.<\/p><\/dd>\n<dt id=\"can%20i%20undo%20a%20removal%3F\"><h3>Can I undo a removal?<\/h3><\/dt>\n<dd><p>Yes. The post's original content is stored before every edit, and the Undo button in\nthe results table restores it. Undo data is kept for 30 days by default, and you can\nchange that in the settings.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20block%20editor%3F\"><h3>Does it work with the Block Editor?<\/h3><\/dt>\n<dd><p>Detection works on any content stored as HTML, but this version is designed and\ntested for Classic Editor content. Block editor support is planned.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20site%3F\"><h3>Will it slow down my site?<\/h3><\/dt>\n<dd><p>No. Scanning runs in the background in small batches and only in the admin. Nothing\nruns on the front end at all.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Background scanning of post content for images missing from the uploads folder.<\/li>\n<li>Review table with bulk remove, ignore and re-check.<\/li>\n<li>Removal of stranded <code>[caption]<\/code> shortcodes and empty link, figure and picture wrappers.<\/li>\n<li>Missing responsive sizes are dropped from <code>srcset<\/code>, leaving the image itself in place.<\/li>\n<li>Per-post undo with configurable retention.<\/li>\n<\/ul>","raw_excerpt":"Find images whose files are missing from your uploads folder and remove them from post content safely \u2014 after review, with one-click undo.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368905","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=368905"}],"author":[{"embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/haritpanchal"}],"wp:attachment":[{"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368905"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368905"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368905"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368905"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368905"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mai.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368905"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}