If your WooCommerce product images are not showing, start by copying the image URL and opening it in a new browser tab. If the image loads there, the file is fine and your problem is in your theme, a plugin, or your cache. If it does not load, the file, its path, or your server permissions are the problem.

An empty product page is worse than a slow one. A shopper who cannot see what they are buying does not wait around. The good news is that this problem looks far more mysterious than it is, and there is one simple test that cuts the possible causes in half before you touch a single setting. Let us start there.

The five-second test that tells you where to look

Right-click the broken image on your product page and choose Copy image address. Open a new browser tab, paste it in, and press enter.

If the image loads in that tab: the file exists on your server and your server is happily handing it out. The file is fine. Something on your page is the problem, which means your theme, a plugin, your cache, or a mixed content issue. Skip to the second half of this guide.

If the image does not load in that tab: you will see a broken icon or an error. The file is missing, the address is wrong, or your server is refusing to serve it. Your problem is at the file level. Read the next section.

That one test saves most people an hour of guessing, and almost nobody does it first.

Also: where exactly is it broken?

Worth thirty seconds, because these three situations rarely share a cause.

Where images are brokenWhat it usually means
On the live product page onlyA path, permission, or cache problem
In the Media Library grid in wp-adminUsually a JavaScript issue or a blocked admin request
Only inside the block editorA script conflict or a browser extension

One more useful signal: if every image on your site is broken, look at server-level causes such as permissions or URLs. If one stubborn thumbnail is broken while everything else is fine, it is a file-level problem with that specific image.

Part 1: The image does NOT load in a new tab

The file or its address is the problem. Work through these in order.

Your site moved, and the image addresses did not

This is the most common cause by a wide margin. If you recently changed hosts, changed domains, or moved from a staging site, your database is probably still pointing at the old address.

Your images live in /wp-content/uploads/, and every product references them by full URL. When the domain changes, those stored URLs keep pointing somewhere that no longer exists.

How to fix it properly. Do not edit these by hand, because the old address is stored in dozens of places. Install a search and replace plugin such as Better Search Replace, run a search for your old URL and replace it with the new one, and include the wp_posts and wp_postmeta tables. Take a backup first, because a search and replace touches your whole database.

Then check Settings, then General, and confirm your WordPress Address and Site Address are both correct and both use https.

This is exactly the kind of thing that gets caught before launch when you migrate properly, and discovered by customers when you do not.

Your server cannot read the files

If the files are there but the server refuses to serve them, permissions are usually the reason. This happens after migrations, restores, and some host changes.

Connect over FTP or your host’s file manager, go to wp-content/uploads/, and check permissions. Folders should be 755 and files should be 644. Most FTP tools let you apply this to a folder and everything inside it in one action. If you are not comfortable doing it, your host’s support can set it correctly in about a minute; it is a routine request.

The thumbnail size is missing (and WooCommerce has its own tool for this)

Here is something that catches a lot of store owners out. WordPress does not store one copy of your image; it creates several sizes. WooCommerce then registers its own sizes on top of that, which you can see under WooCommerce, then Settings, then Products.

So a product image can exist perfectly while the specific cropped size your shop page is asking for was never created. The full image opens fine in a new tab, but the product grid shows nothing.

The fix, and this is the part generic guides get wrong. Most WordPress advice tells you to install the Regenerate Thumbnails plugin. For a store, use WooCommerce’s own tool instead: go to WooCommerce, then Status, then Tools, and run Regenerate shop thumbnails. That regenerates the sizes WooCommerce actually uses.

People following generic advice regenerate the wrong set, see no change, and conclude regeneration does not work. Use the WooCommerce tool for a WooCommerce store.

One warning: on a large catalog this is resource-intensive and can take a long time. Run it when your store is quiet.

Your server ran out of memory while making thumbnails

This one explains a genuinely confusing symptom: the image looks perfectly fine in your Media Library, but breaks on the product page.

When you upload an image, WordPress generates all those extra sizes right then. If your PHP memory limit runs out mid-process, it stops. The original saves fine, so everything looks normal in the admin, but the sizes were never created. Any template asking for a missing size shows nothing.

The fix: raise your memory limit by adding this line to wp-config.php, above the line that says “That’s all, stop editing”:

define( ‘WP_MEMORY_LIMIT’, ‘256M’ );

Then re-upload the affected images or run the regeneration tool above. If the limit will not rise, your host caps it and can raise it for you.

Two quieter causes worth checking if nothing above fixed it.

A damaged .htaccess file can stop your server serving media correctly. Rename it to .htaccess_old over FTP, then go to Settings, then Permalinks, and click Save Changes to generate a fresh one.

Hotlink protection stops other sites embedding your images, which is useful, but set too aggressively can block your own site or your CDN from loading them. If you turned this on recently, turn it off temporarily and see if your images come back.

The file type is not supported

If images from a phone will not upload or show, check the format. WordPress does not support HEIC, the default format on iPhones, and blocks SVG by default for security reasons. Convert HEIC files to JPEG or WebP before uploading. Our guide to preparing images for WordPress covers the formats that work and the sizes to use.

Part 2: The image DOES load in a new tab

The file is fine. Something on your page is stopping it from appearing.

Mixed content after switching to HTTPS

If your site moved to HTTPS but some image addresses still start with http://, browsers block them for security. The image is there, and the browser refuses to show it.

Press F12, open the Console tab, and reload the page. Mixed content warnings appear in the console and name the exact files being blocked.

Where the old addresses hide is the part people underestimate. Check all of these:

  • WordPress Address and Site Address under Settings, then General
  • Post and product content, including custom HTML blocks
  • Page builder data. Elementor, Divi and similar tools store image URLs inside their saved layouts and generated CSS, so a builder-heavy store often keeps HTTP addresses long after everything else is fixed
  • Theme and plugin settings that store image paths
  • Your CDN or proxy, which may be misreporting whether the connection is secure

Fix these with the same search and replace method as above, changing http://yourdomain.com to https://yourdomain.com.

Cache and CDN are serving an old broken copy

This wastes more time than almost anything else on the list, so the order matters.

Clearing your cache does not fix a bad URL, and fixing a bad URL does not clear your cache. You need both, in this order:

  1. Fix the actual cause (URLs, permissions, thumbnails)
  2. Clear your caching plugin
  3. Purge your CDN separately, such as Cloudflare
  4. Hard refresh your browser with Ctrl+Shift+R, or check in a private window

A cached broken page can outlive the fix by days, which makes a working fix look like a failure. Always verify in a private window before deciding something did not work.

An image plugin is the problem

Image optimization and lazy loading plugins are common causes, and one scenario deserves a real warning.

Two lazy loading plugins fighting is a frequent cause of images that load sometimes, or only after scrolling oddly. Many themes and caching plugins include lazy loading built in, and WordPress has it natively too, so you may be running three without realising. Keep one.

An optimization plugin that deleted your originals is the serious one. Some plugins offer to delete original files after converting or compressing them, to save space. If that conversion went wrong, or the plugin is later removed, the originals may be gone for good. This is a real data loss risk, not a display bug.

Before running any bulk image optimization, take a full backup, and ideally test the plugin on a staging copy first. That is a ten-minute precaution against losing an entire product photo library.

To find which plugin is responsible, deactivate them one at a time and reload the product page after each. The full method is in our guide to finding the plugin that is breaking your site.

Your theme is overriding WooCommerce templates

Themes can replace WooCommerce’s own product templates with their own versions. If the theme is old, or was built for a much earlier version of WooCommerce, those templates can use functions that no longer work, so images never get output at all even though everything else is fine.

Test it: switch temporarily to a default theme such as Storefront and reload a product page. If your images appear, your theme is the cause, and you need either a theme update or a developer to correct the outdated template. If your store uses a page builder for product layouts, builder-specific issues can produce the same result.

Part 3: Variation images (the WooCommerce-only headache)

Variable products have three separate image systems, and it helps enormously to know which one is misbehaving:

  1. The featured image (the main product image)
  2. The product gallery (extra photos on the product page)
  3. Variation images (the photo that swaps when a shopper picks red instead of blue)

They fail independently, so “images not showing” on a variable product needs one more question: which of the three?

The variation image was never assigned

The simplest cause, and worth ruling out before anything technical. Open the product, click the Variations tab, expand a variation, and look at the Image field. Each variation needs its own image assigned individually. Setting up variations does not automatically give each one a picture.

If most variations have images and one does not, that is your answer for that variation.

The image is assigned but does not swap

The shopper selects an option and the main image just sits there. This is a different problem: the image exists, but the front-end script that swaps it cannot match the selection.

Things to check:

Regenerate shop thumbnails (WooCommerce, then Status, then Tools). Variation swapping relies on the correct sizes existing.

Check for a JavaScript error. Press F12, open Console, and click through your variation options. A red error tells you a script is failing, and often names the plugin responsible.

Local versus global attributes

In one documented case, variation images failed to swap because the product used attributes created directly on the product (local) rather than global attributes set up under Products, then Attributes. The front-end script matches attribute keys, and local attributes can break that match. Converting to global attributes and regenerating the variations fixed it. This is not the cause every time, but it is worth checking if the usual fixes do nothing, especially on products imported in bulk or translated into other languages.

Test with a default theme and with plugins off. Variation swapping is JavaScript, and both themes and plugins interfere with it regularly.

If a variable product shows the placeholder image instead of your gallery, check whether your variations have images assigned at all. WooCommerce’s handling of gallery display on variable products with imageless variations has caused this in the past. Assign images to your variations, or remove the empty variations you are not using, and reload.

“It worked yesterday” versus “it never worked”

This one question narrows things down fast.

If it worked yesterday, something changed. The usual suspects: a plugin or WooCommerce update, an SSL certificate activation that changed URLs, a CDN or caching change, or something your host changed on the server. Start with whatever changed, then check the URL and cache sections above.

If it never worked on a new store or a newly moved one, start at the file level: permissions, memory limits, thumbnail regeneration, and file paths.

Your quick checklist

  1. Copy the image URL and open it in a new tab
  2. Note where it is broken: live site, media library, or editor
  3. Check the browser console (F12) for errors
  4. Confirm your site URLs under Settings, then General
  5. Run a search and replace if you moved site or domain
  6. Check uploads folder permissions (755 folders, 644 files)
  7. Run WooCommerce, then Status, then Tools, then Regenerate shop thumbnails
  8. Raise the PHP memory limit if thumbnails are missing
  9. Clear caching plugin, then CDN, then browser, in that order
  10. Deactivate image plugins one at a time
  11. Test with a default theme
  12. For variations, confirm each has an image assigned

Stopping it happening again

A few habits prevent most of this.

Take a backup before any bulk image operation. Optimization plugins working across thousands of product photos is exactly when things go wrong, and it is the one scenario where recovery may not be possible.

Test image plugins on staging first. A plugin that mishandles your library is far cheaper to discover on a copy.

Run one lazy loader, not three. Check whether your theme and caching plugin already include it before adding another.

Check your images after every migration, SSL change, and CDN change. Load a few product pages and a category page. Two minutes now beats a customer telling you later.

Upload images in supported formats at sensible sizes. Our image guide for WordPress covers what to use and why, which also keeps your store loading quickly.

Key takeaways

Start with the new-tab test, because whether the image loads there tells you immediately whether you are dealing with a file problem or a page problem, and stops you working through fixes that cannot possibly apply. File-level causes are usually old URLs after a move, wrong permissions, missing thumbnail sizes, or a memory limit that quietly stopped thumbnails being generated at upload.

Page-level causes are usually mixed content after an SSL change, a stale cache, an image plugin, or a theme overriding WooCommerce templates. Use WooCommerce’s own Regenerate shop thumbnails tool rather than a generic plugin, since it handles the sizes your store actually uses. And treat variation images as their own system, because they are, and check first whether the image was ever assigned before assuming something is broken.

Frequently Asked Questions

Why are my WooCommerce product images not showing? 

Usually either the file cannot be found, or the page cannot display it. Copy the image URL into a new browser tab: if it loads, the file is fine and your theme, a plugin or your cache is the cause. If it does not load, the problem is the file path, permissions, or a missing thumbnail size.

Why do images show in my Media Library but not on the product page? 

The original image uploaded fine, but the smaller sizes your store needs were never generated, often because the server ran out of memory mid-upload. Raise your PHP memory limit to 256M in wp-config.php, then run WooCommerce, Status, Tools, Regenerate shop thumbnails.

How do I regenerate WooCommerce thumbnails? 

Go to WooCommerce, then Status, then Tools, and run Regenerate shop thumbnails. This is different from the generic Regenerate Thumbnails plugin, and it handles the image sizes WooCommerce actually registers. On a large catalog it is resource-intensive, so run it during a quiet period.

Why did my images break after moving my site? 

Your database still references the old domain, so every image URL points somewhere that no longer exists. Use a search and replace plugin to update the old URL to the new one across wp_posts and wp_postmeta, and confirm your site URLs under Settings, then General. Back up before running it.

Why is my variation image not changing when I select an option? 

The image exists but the front-end script cannot match your selection. Regenerate shop thumbnails first, then check the browser console for JavaScript errors while clicking options. In some cases, products using local attributes rather than global ones break the matching, and converting to global attributes resolves it.

Can I get back images and an optimization plugin deleted? 

Only from a backup. Some optimization plugins offer to delete original files after converting them, and if that goes wrong the originals are gone. This is why a full backup before any bulk image operation matters, and why testing such plugins on a staging copy first is worth the ten minutes.

Why are my images broken only on some pages? 

Different templates request different image sizes, so a missing size breaks some layouts and not others. It can also be caching, where some pages are serving an older copy. Regenerate your shop thumbnails, then clear your caching plugin, CDN and browser in that order before retesting.