{"id":15051,"date":"2026-11-11T19:01:00","date_gmt":"2026-11-11T17:01:00","guid":{"rendered":"https:\/\/shortpixel.com/blog\/?p=15051"},"modified":"2026-11-11T19:02:58","modified_gmt":"2026-11-11T17:02:58","slug":"5-reasons-your-wordpress-images-are-broken-and-how-to-fix-them","status":"publish","type":"post","link":"https:\/\/shortpixel.com\/blog\/5-reasons-your-wordpress-images-are-broken-and-how-to-fix-them\/","title":{"rendered":"5 Reasons Your WordPress Images Are Broken and How to Fix Them"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Oftentimes, a broken image icon only tells you some of the information needed to fix it. It tells you that the page failed to deliver an image, but it does not explain why, nor does it solve the problem of spotting broken images before visitors notice. The file may have been deleted, the page may reference an outdated URL, a thumbnail may be missing, or a cache, CDN, or optimization plugin may be serving the wrong response.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes, re-uploading the image or clearing the cache can fix it quickly, and these are usually the first things to try. However, when this doesn\u2019t work, it is better to identify where the image-delivery process is failing and what changed before the problem appeared.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-2.png\"><img decoding=\"async\" width=\"914\" height=\"568\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-2.png\" alt=\"\" class=\"wp-image-15054\" style=\"aspect-ratio:1.6082474226804124;width:624px;height:auto\" title=\"\" srcset=\"https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-2.png 914w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-2-300x186.png 300w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-2-768x477.png 768w\" sizes=\"(max-width: 914px) 100vw, 914px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">In this guide, you will learn how to inspect failed image requests, connect the results to their likely causes, fix common WordPress image problems, and find affected images across a larger site.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>For upload errors, blurry images, duplicate media, and other problems, see our broader<\/em> <a href=\"https:\/\/shortpixel.com\/blog\/wordpress-image-issues\/\"><em>guide to common WordPress image issues<\/em><\/a><em>.<\/em><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to Identify Broken Images<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Missing images do not always appear as a broken-image icon. Depending on the theme, browser, or lazy-loading setup, they may appear as:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>An empty space<\/li>\n\n\n\n<li>The image\u2019s alternative text<\/li>\n\n\n\n<li>A loading placeholder that never disappears<\/li>\n\n\n\n<li>A missing background image<\/li>\n\n\n\n<li>A blank product-gallery item<\/li>\n\n\n\n<li>An image that works on desktop but not on mobile<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image.png\"><img decoding=\"async\" width=\"1024\" height=\"354\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-1024x354.png\" alt=\"\" class=\"wp-image-15052\" style=\"aspect-ratio:2.888888888888889;width:624px;height:auto\" title=\"\" srcset=\"https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-1024x354.png 1024w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-300x104.png 300w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-768x265.png 768w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image.png 1318w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A visual check can reveal the problem, but it does not explain which image URL failed or why. To find out why the request failed, inspect it in your browser using these steps:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Open <strong>Developer Tools > Network<\/strong>\u00a0<\/li>\n\n\n\n<li>Reload the page<\/li>\n\n\n\n<li>Filter the requests by images\u00a0<\/li>\n\n\n\n<li>Select the failed or unexpected request.<\/li>\n<\/ol>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-3.png\"><img decoding=\"async\" width=\"914\" height=\"483\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-3.png\" alt=\"\" class=\"wp-image-15055\" style=\"aspect-ratio:1.8192419825072885;width:624px;height:auto\" title=\"\"><\/a><\/figure>\n\n\n\n<ol start=\"5\" class=\"wp-block-list\">\n<li>Inspect and review the following details:<\/li>\n<\/ol>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Request URL:<\/strong> The exact image address requested by the page<\/li>\n\n\n\n<li><strong>Hostname:<\/strong> Your server, a CDN, or an external website<\/li>\n\n\n\n<li><strong>Status:<\/strong> For example, 404, 403, or 500<\/li>\n\n\n\n<li><strong>Content-Type:<\/strong> It should normally be an image format<\/li>\n\n\n\n<li><strong>Response:<\/strong> The image, an HTML error page, a redirect, or a placeholder<\/li>\n\n\n\n<li><strong>Initiator:<\/strong> HTML, CSS, JavaScript, or another resource<\/li>\n\n\n\n<li><strong>Source:<\/strong> src, srcset, a lazy-loading attribute, or CSS<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-3.png\"><img decoding=\"async\" width=\"914\" height=\"483\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-3.png\" alt=\"\" class=\"wp-image-15056\" style=\"aspect-ratio:1.8966565349544073;width:624px;height:auto\" title=\"\" srcset=\"https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-3.png 914w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-3-300x159.png 300w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-3-766x405.png 766w\" sizes=\"(max-width: 914px) 100vw, 914px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The <strong>Status code<\/strong> result helps determine where to investigate next:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Request result<\/strong><\/td><td><strong>Likely cause<\/strong><\/td><\/tr><tr><td>404 Not Found<\/td><td>Deleted file, incorrect URL, missing generated size, or incomplete migration<\/td><\/tr><tr><td>403 Forbidden<\/td><td>Permissions, firewall, hotlink protection, authentication, or security rules<\/td><\/tr><tr><td>500\u2013504<\/td><td>Origin server, proxy, CDN, or application failure<\/td><\/tr><tr><td>Repeated redirects<\/td><td>Incorrect domain, protocol, or CDN configuration<\/td><\/tr><tr><td>200 OK with text\/html<\/td><td>An error page, login page, challenge, or placeholder was returned instead of an image<\/td><\/tr><tr><td>Mixed-content warning<\/td><td>An HTTPS page is requesting an HTTP image<\/td><\/tr><tr><td>ERR_BLOCKED_BY_CLIENT<\/td><td>A browser extension or local filter blocked the request<\/td><\/tr><tr><td>Valid image response but no display<\/td><td>CSS, JavaScript, layout, decoding, or responsive-image problem<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">5 Common Reasons WordPress Images Break and How to Fix Them<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Most broken image issues fall into one of the following categories.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">#1 The image file was deleted<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The page may still contain an image URL even after the file has been deleted. This can happen when:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Someone deletes an image from the Media Library.<\/li>\n\n\n\n<li>A media-cleanup plugin incorrectly classifies an image as unused.<\/li>\n\n\n\n<li>A deployment or migration misses part of the uploads directory.<\/li>\n\n\n\n<li>A file is deleted through FTP, SSH, or a hosting control panel.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to check:<\/strong> Start with the exact URL shown in the Network panel. Open the image URL directly and check whether the page shows a 404 error. Then search for the image in the WordPress Media Library.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the deletion happened through WordPress, an activity log plugin like <a href=\"https:\/\/melapress.com\/wordpress-activity-log\/\" target=\"_blank\" rel=\"noopener\">WP Activity Log<\/a> will show which user deleted the attachment and when.\u00a0 This can be useful for tracking user activity, identifying what changed, and troubleshooting the issue faster.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-7.png\"><img decoding=\"async\" width=\"1024\" height=\"226\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-7-1024x226.png\" alt=\"\" class=\"wp-image-15060\" style=\"aspect-ratio:4.554744525547445;width:624px;height:auto\" title=\"\" srcset=\"https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-7-1024x226.png 1024w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-7-300x66.png 300w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-7-766x169.png 766w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-7.png 1419w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to fix:<\/strong> Re-uploading the image to WordPress may seem like the simplest fix, but it does not always solve the problem. If only the physical file is missing, restore the original file to its previous location under <strong>wp-content\/uploads<\/strong>. This keeps the same URL, so existing pages continue to work without changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you upload through the Media Library instead, WordPress usually creates a new file with a different URL. Any page still referencing the old URL will show a broken image, so make sure to update the image link.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">#2 The image URL is incorrect&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Typical signs include image URLs that still contain a staging hostname, an old company domain, or <em>http:\/\/<\/em> instead of <em>https:\/\/<\/em>. Images often break after:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>A staging-to-production migration<\/li>\n\n\n\n<li>A domain change<\/li>\n\n\n\n<li>An HTTPS migration<\/li>\n\n\n\n<li>An incorrect CDN hostname<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to check:<\/strong> Review the broken image URL and compare it with the current site address. Similarly, you can use an activity log plugin to help identify recent changes to the WordPress Address, Site Address, content, plugin configuration, or related settings.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-1.png\"><img decoding=\"async\" width=\"1024\" height=\"227\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-1-1024x227.png\" alt=\"\" class=\"wp-image-15053\" style=\"aspect-ratio:4.489208633093525;width:624px;height:auto\" title=\"\" srcset=\"https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-1-1024x227.png 1024w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-1-300x67.png 300w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-1-767x170.png 767w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-1.png 1249w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to fix:<\/strong> You can use a plugin such as <a href=\"https:\/\/wordpress.org\/plugins\/better-search-replace\/\" target=\"_blank\" rel=\"noopener\">Better Search Replace<\/a> to safely update old image URLs across the WordPress database.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then clear the cache and test the page while logged out.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">#3 The generated image size is missing&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">WordPress usually creates several files when an image is uploaded. These may include thumbnails, medium and large sizes, and additional dimensions registered by themes or plugins.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The original file might work, while a different size, such as <em>product-photo-768&#215;768.png<\/em>, returns a 404 error. An incomplete migration, a theme change, or the removal of generated files usually causes this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to check:<\/strong> Copy the failed image URL from the <strong>DevTools<\/strong> and compare it with the original. Look for appended dimensions (like 300&#215;300, 150&#215;150, 768&#215;768), and check the page&#8217;s <strong>srcset<\/strong> to see if a responsive size is missing. If the original loads but a generated version returns a 404, the attachment exists, but that specific size is missing.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-6.png\"><img decoding=\"async\" width=\"1024\" height=\"370\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-6-1024x370.png\" alt=\"\" class=\"wp-image-15059\" style=\"aspect-ratio:2.7733333333333334;width:624px;height:auto\" title=\"\" srcset=\"https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-6-1024x370.png 1024w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-6-300x108.png 300w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-6-767x277.png 767w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-6.png 1500w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to fix:<\/strong> Use a plugin like <a href=\"https:\/\/wordpress.org\/plugins\/regenerate-thumbnails-advanced\/\" target=\"_blank\" rel=\"noopener\">reGenerate Thumbnails Advanced<\/a> to rebuild missing image sizes. For sites with command-line access, you can also use <a href=\"https:\/\/developer.wordpress.org\/cli\/commands\/media\/regenerate\/\" target=\"_blank\" rel=\"noopener\">WP-CLI to regenerate sizes<\/a> for selected attachments or the entire Media Library.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-4.png\"><img decoding=\"async\" width=\"1024\" height=\"532\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-4-1024x532.png\" alt=\"\" class=\"wp-image-15057\" style=\"aspect-ratio:1.9259259259259258;width:624px;height:auto\" title=\"\" srcset=\"https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-4-1024x532.png 1024w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-4-300x156.png 300w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-4-766x398.png 766w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-4.png 1504w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Source: <a href=\"https:\/\/ps.w.org\/regenerate-thumbnails-advanced\/assets\/screenshot-1.png?rev=2069168\" target=\"_blank\" rel=\"noopener\">https:\/\/ps.w.org\/regenerate-thumbnails-advanced\/assets\/screenshot-1.png?rev=2069168<\/a>&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">#4 Access to the image is blocked<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The image may exist at the correct URL, but the server can still refuse the request. Common causes include incorrect file permissions, firewall rules, hotlink protection, password protection, or authentication requirements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to check:<\/strong> Check the failed request in the <strong>Network panel<\/strong> for access-related responses such as 401, 403, redirects to login pages, or HTML returned instead of an image. Also note any differences between logged-in and logged-out views.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to fix:<\/strong> Correct the specific permissions or access rule causing the problem. Avoid disabling all security controls unless you are doing a brief diagnostic test.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">#5 The optimized or CDN image is not loading&nbsp;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Image optimization plugins and CDNs replace the original image URL with an optimized or cached version. This can fail when the CDN serves an outdated copy, or when a caching plugin, CDN, and optimizer all handle the same image and <a href=\"https:\/\/shortpixel.com\/knowledge-base\/article\/known-plugin-and-theme-conflicts-issues-and-workarounds\/\">conflict with each other<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to check:<\/strong> Open the failed image URL in a new tab. If it returns an error or does not load, compare it with the original image URL in the WordPress Media Library. If the original loads correctly, the problem is likely with the optimized version, CDN URL, or image-rewriting process.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How to fix:<\/strong> Clear your WordPress and optimization plugin caches, purge the CDN cache, and regenerate optimized images if the plugin provides that option. Temporarily disable CDN delivery or image optimization to identify which service is causing the issue. Also check that multiple plugins are not optimizing or rewriting the same images.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to Find Broken Images Across a Larger Site<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Manual checks are useful for individual pages and smaller sites, but impractical across large WordPress sites. You can use a crawler such as <a href=\"https:\/\/www.screamingfrog.co.uk\/\" target=\"_blank\" rel=\"noopener\">Screaming Frog<\/a> or <a href=\"https:\/\/ahrefs.com\/site-audit\" target=\"_blank\" rel=\"noopener\">Ahrefs Site Audit<\/a> to find image requests that return client or server errors, such as 404, 403, or 500 responses.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Configure the crawl to:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Check both <strong>src<\/strong> and <strong>srcset<\/strong> image URLs<\/li>\n\n\n\n<li>Enable JavaScript rendering for lazy-loaded images<\/li>\n\n\n\n<li>Crawl as a logged-out visitor<\/li>\n\n\n\n<li>Include desktop and mobile pages<\/li>\n\n\n\n<li>Show which pages reference each broken image<\/li>\n<\/ul>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large is-resized\"><a href=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-5.png\"><img decoding=\"async\" width=\"1024\" height=\"370\" src=\"https:\/\/shortpixel.com/blog\/wp-content\/uploads\/2026\/11\/image-5-1024x370.png\" alt=\"\" class=\"wp-image-15058\" style=\"aspect-ratio:2.7733333333333334;width:624px;height:auto\" title=\"\" srcset=\"https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-5-1024x370.png 1024w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-5-300x109.png 300w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-5-766x277.png 766w, https:\/\/shortpixel.com\/blog\/wp-content\/uploads\/2026\/11\/image-5.png 1327w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Source: <a href=\"https:\/\/help.ahrefs.com\/en\/articles\/2699397-page-has-broken-image-error-in-site-audit\" target=\"_blank\" rel=\"noopener\">https:\/\/help.ahrefs.com\/en\/articles\/2699397-page-has-broken-image-error-in-site-audit<\/a>&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Some visually broken images still return 200 OK; in such cases, use screenshot monitoring tools such as <a href=\"https:\/\/playwright.dev\/\" target=\"_blank\" rel=\"noopener\">Playwright<\/a> or <a href=\"https:\/\/percy.io\/\" target=\"_blank\" rel=\"noopener\">Percy<\/a> for important pages. Crawlers detect failed requests, while screenshots reveal empty placeholders, missing background images, and other visual problems.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How to Prevent Broken Images&nbsp;<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">To reduce the risk of broken images, focus on four areas: tool conflicts, backups, testing, and monitoring.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Don&#8217;t run multiple plugins for the same task, such as image optimization, lazy loading, caching, or CDN delivery. When several tools rewrite the same image URLs or loading attributes, they can interfere with each other and produce inconsistent results.<\/li>\n\n\n\n<li>Before migrations, domain changes, media cleanup, or major optimization changes, back up the WordPress database and the wp-content\/uploads directory. The database stores image URLs and attachment references; the uploads directory holds the actual files.<\/li>\n\n\n\n<li>Review the site as a logged-out visitor after migrations, plugin updates, or delivery changes. Check desktop and mobile layouts, key page types, galleries, background images, lazy-loaded images, and both origin and CDN URLs.\u00a0<\/li>\n\n\n\n<li>Retain activity log records long enough to cover your normal maintenance and deployment cycle. This makes it easier to trace media deletions, content edits, plugin or theme changes, URL updates, and file permission changes if an image breaks later.<\/li>\n<\/ol>\n\n\n\n<h2 class=\"wp-block-heading\">Find the Cause, Then Fix It<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The most reliable way to investigate broken images is to divide the process into two tasks:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Find the cause:<\/strong> Determine whether the issue is with the original file, the stored URL, the generated image size, the optimizer, the CDN, the cache, or the browser.<\/li>\n\n\n\n<li><strong>Reconstruct the change:<\/strong> Use WordPress activity logs, hosting logs, deployment history, and CDN records to identify what changed and when.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Once both are known, the fix is usually simple. More importantly, you can improve the process rather than repeatedly reuploading individual images or clearing caches without knowing why the problem occurred.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently Asked Questions<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Why is an image in the Media Library but not visible on the page?&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The attachment may still exist in WordPress even if the original file or a generated thumbnail is missing. The page may also be requesting a different URL, such as a CDN version, a WebP file, an old-domain URL, or a responsive image size. Check the exact image URL requested in the browser&#8217;s Network panel.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>How can you see who deleted an image?&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If the image was deleted through WordPress, you can use an activity log plugin like WP Activity Log to see who and when an image was deleted. The log can record details such as the user, role, time, IP address, and affected file.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Does clearing the cache fix broken images?&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Only if the issue is cache-related. Clearing the cache will not restore deleted files, fix outdated URLs, regenerate missing thumbnails, or correct permissions and firewall rules. In some cases, clearing a CDN cache can also remove the last working copy of a missing image.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What should I check after migrating a WordPress site?&nbsp;<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check the site URLs, old domains in content, the wp-content\/uploads directory, permissions, thumbnails, CDN settings, cached pages, and mobile image versions. Use a serialization-aware search-and-replace method instead of a direct SQL replacement.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oftentimes, a broken image icon only tells you some of the information needed to fix it. It tells you that the page failed to deliver an image, but it does not explain why, nor does it solve the problem of spotting broken images before visitors notice. The file may have been deleted, the page may [&hellip;]<\/p>\n","protected":false},"author":37,"featured_media":15061,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-15051","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-world-of-wordpress"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/posts\/15051","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/users\/37"}],"replies":[{"embeddable":true,"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/comments?post=15051"}],"version-history":[{"count":3,"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/posts\/15051\/revisions"}],"predecessor-version":[{"id":15065,"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/posts\/15051\/revisions\/15065"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/media\/15061"}],"wp:attachment":[{"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/media?parent=15051"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/categories?post=15051"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/shortpixel.com\/blog\/wp-json\/wp\/v2\/tags?post=15051"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}