External Images Quick Start Guide
External Images lets you use images hosted anywhere else – an affiliate CDN, a supplier feed, S3, your own image subdomain – as your WordPress featured images, galleries and variation images, without downloading them into your Media Library. That means near-zero image storage and dramatically faster imports. This is the fast route to a working setup; for anything deeper see the FAQ and Troubleshooting guides.
Table of Contents
Step 1: Install, activate and enter your licence
Upload the plugin under Plugins > Add New, activate it, then go to the Super Speedy menu and paste your licence key so you get automatic updates. That’s all the setup the plugin itself needs – the default settings are fine for most sites. If you had a very old version installed under its former name External WordPress Images, delete that first.
Step 2: Understand the one field that matters
Everything External Images does is driven by a single custom field: external_image_url. Put your image URLs into it, separated by the pipe | character. The first URL becomes the featured image; the rest become the gallery. The same applies to product variations, via each variation’s own external image area.
Two rules that prevent almost every support ticket:
- Always use the field with no leading underscore. Import into
external_image_url, never_external_image_url(the underscore version is private and internal – importing to it is the #1 cause of “the URL is saved but no image shows”). - Separate with pipes, not commas. Commas can appear inside image URLs; pipes are safe.
You can freely mix products with and without external images – if the field is set it wins, otherwise your normal local/uploaded image is used.
Step 3: Point your import at that field
In WP All Import (or any importer), stop importing images the normal way and instead map your image column to a Custom Field called external_image_url. In WP All Import that means deleting the image field from the Images section and adding it to the Custom Fields section below. WP All Import then treats it as plain text and skips the slow download; External Images picks it up and builds the featured image and gallery on first view.
- Leave “do_action calls” enabled (don’t tick WP All Import’s option that disables them). If you must disable them for speed, also set a custom field
ei_convertedto0so the images still get built. - Combine multiple image columns into one pipe-separated value, e.g.
{image1}|{image2}|{image3}. - Guard against blanks. If you build URLs by prepending a domain, use a small function that returns an empty string when the image part is missing – otherwise you get a blank image at the end of the gallery.
- Alt / title / caption text go into three more fields, in the same order as the URLs:
external_image_alts,external_image_titles,external_image_captions.
Full walkthrough with screenshots: How to alter import jobs to import external images.
Step 4: Or add images by hand
Editing a single post or product? In the Gutenberg editor you’ll find the External Images box in its own collapsible panel near the bottom of the page (for products, in the product data area beneath the gallery). Paste your pipe-separated URLs there and save.
Step 5: Make the images look right
External Images can’t physically resize a remote image, so it sizes them one of two ways from the settings page:
- CSS Image Cropping – forces images to a fixed size in the browser. The quickest way to get a tidy, uniform grid. Turn this on if your archive images come in at odd shapes or don’t fill their box.
- A CDN that resizes on the fly (Cloudflare, BunnyCDN, etc.) – the best option for performance and for PageSpeed’s “properly sized images”. Host your images at something like
images.yourdomain.comand let the CDN shrink them per screen.
If a theme’s product gallery or carousel fights with the images, disable that theme option – External Images ships its own gallery.
Step 6: The settings worth knowing about
You can ignore most of the settings page to start with. These are the ones you might turn on later, on the Super Speedy > External Images settings screen:
- Default Fallback Image – the image shown when a URL is broken. Set your own, or disable it entirely.
- Proxy All Images – serves external images through your own server (cached to
wp-content/uploads/external-images/). Useful so images appear to come from your domain, but it slows the first page load and uses disk – leave it off unless you need it. - Use Photon/Jetpack Image Resizing – an alternative on-the-fly resizer for affiliate-network images.
- Prevent Datafeedr Image Import – turn on if you use Datafeedr, so it stops downloading images (and hit Save).
- Variation Gallery JavaScript – leave enabled so variation images switch; only disable it if a swatch/variation-gallery plugin’s own JS conflicts.
Cheat sheet
The fields (import into the ones without a leading underscore only):
external_image_url– your image URLs, pipe-separated, first = featured. This is the one you use.external_image_alts/external_image_titles/external_image_captions– text, same order as the URLs.ei_converted=0– forces External Images to re-read your URLs (use after changing URLs when do_action calls are disabled)._external_image_url,_ei_wcgallery,ei– private/internal. Never import into these.
Top gotchas:
- URL saved but no image? You imported to
_external_image_url, or do_action calls are disabled (setei_convertedto 0), or you need to flush your object cache. - Gallery images missing but featured image works? Your URLs may be over 255 characters – widen the column with
ALTER TABLE wp_posts MODIFY COLUMN guid varchar(2048);. - Odd image sizes? Turn on CSS Image Cropping, or use a CDN resizer.
- Set it up on a staging site first if you can, and always keep a backup before bulk imports.
In short
Install, enter your licence, and import your image URLs (pipe-separated, first one is the featured image) into the external_image_url custom field instead of downloading them. Turn on CSS Image Cropping if you want uniform sizes. That’s the whole plugin. When something looks off, it’s almost always the wrong field or a disabled do_action call – check the Troubleshooting guide, read the FAQ, or ask us on Discord.