A free WordPress plugin that bulk uploads images to the Media Library from a CSV + ZIP, or straight from remote URLs. Every image gets its full metadata in one pass: title, alt text, caption, description, and an optional post attachment or featured image.
No Pro tier. No locked features. The things other CSV importers charge for (remote URL import, featured image assignment) are simply included.
Uploading 20 images through the WordPress media screen is fine. Uploading 1,000 product photos, each needing SEO alt text and a caption, is a day of clicking. This plugin turns that day into one CSV file and a progress bar.
- CSV + ZIP import — drop both files, the plugin matches rows to images by filename
- Remote URL import — a
urlcolumn fetches images over HTTPS, guarded by a per-host allowlist - Full metadata per image — title, alt text, caption, description, all set in one import
- Attach to posts — link each image to a post by ID or slug, as a normal attachment or the featured image
- Auto alt text — empty alt cells are filled from the title or filename (dashes become spaces)
- SEO filenames — optional renaming of each file to a URL-friendly slug of its title
- Duplicate skipping — files already in the Media Library are skipped, not re-uploaded
- Built for big jobs — rows are processed 20 at a time over AJAX, so PHP timeouts never fire, even at 5,000+ images
- Live progress + report — progress bar, colored log, and a downloadable CSV report of every row
Supported formats: JPG, JPEG, PNG, GIF, WebP.
- Upload — drop your CSV (and optionally a ZIP of images) on the wizard's first screen
- Map columns — headers like
filename,title,altare detected automatically; adjust if needed - Run — watch the progress bar, then download the report
Only one column is truly required: filename (when importing from a ZIP) or url (when fetching remotely). Everything else is optional.
| Column | What it does |
|---|---|
filename |
Matches an image inside your ZIP |
url |
HTTPS address to fetch the image from (allowlisted hosts only) |
title |
Media Library title |
alt |
Alt text (_wp_attachment_image_alt) |
caption |
Caption (post_excerpt) |
description |
Long description (post_content) |
post_id |
Numeric post or page ID to attach the image to |
post_slug |
Post or page slug, looked up if post_id is empty |
attach_as |
featured or attachment, overrides the default per row |
A working example ships with the plugin: assets/template.csv.
filename,title,alt,caption,description,url,post_id,post_slug,attach_as
beach.jpg,Beach Sunset,Sunset over the ocean,Taken July 2026,Long description...,,42,,attachment
,Company Logo,Anupress logo,,,https://example.com/logo.png,0,about-us,featuredFrom a release (recommended):
- Download the latest
bulk-media-uploader-anupress.zipfrom the Releases page - In WordPress: Plugins → Add New → Upload Plugin → choose the ZIP → Activate
- Open Bulk Uploader in the admin sidebar
From source:
Clone this repository into wp-content/plugins/ and activate it from the Plugins screen.
- Every AJAX endpoint checks the
upload_filescapability and a nonce - Remote fetches go through
wp_safe_remote_get, which blocks private and internal IP ranges - The URL allowlist is admin-only (
manage_options) and matches hosts plus their subdomains - Uploads pass through
wp_handle_sideloadwith a hard MIME whitelist (JPG, PNG, GIF, WebP) - ZIP extraction rejects path traversal (
..),__MACOSXfolders, and hidden dotfiles - Temp files live in a protected folder and are removed after each job, plus a daily cleanup cron
Can it import 5,000 images at once? Yes. Batching (20 rows per request) keeps each server round-trip short, so shared hosting limits are not a problem. Keep the browser tab open until the bar finishes.
Does it set featured images in bulk?
Yes. Map post_id or post_slug, then either set the default to "Featured image" or put featured in an attach_as column.
Can it generate alt text for images in bulk?
Yes, from your CSV's alt column, or automatically from the title or filename when that column is empty.
Does it modify existing Media Library items? No. Version 1.0 is import-only. Duplicates are skipped, never overwritten.
Which WordPress and PHP versions does it need? WordPress 5.8+ and PHP 7.4+ with the ZipArchive extension (present on virtually all hosts).
Bug reports and pull requests are welcome. Please open an issue with your WordPress version, PHP version, and a sample of the CSV row that misbehaved.
GPL-2.0-or-later. Free to use, modify, and redistribute.
Built by Anupress Tools, a collection of free calculators and generators for WordPress site owners.
