Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Bulk Media Uploader — Import 1,000+ Images into WordPress from a CSV

WordPress bulk media uploader banner: import images to the Media Library from a CSV and ZIP

License: GPL v2 WordPress 5.8+ PHP 7.4+ 100% free

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.

Why this plugin exists

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.

Features

  • CSV + ZIP import — drop both files, the plugin matches rows to images by filename
  • Remote URL import — a url column 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.

How it works

  1. Upload — drop your CSV (and optionally a ZIP of images) on the wizard's first screen
  2. Map columns — headers like filename, title, alt are detected automatically; adjust if needed
  3. Run — watch the progress bar, then download the report

CSV format

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,featured

Installation

From a release (recommended):

  1. Download the latest bulk-media-uploader-anupress.zip from the Releases page
  2. In WordPress: Plugins → Add New → Upload Plugin → choose the ZIP → Activate
  3. Open Bulk Uploader in the admin sidebar

From source:

Clone this repository into wp-content/plugins/ and activate it from the Plugins screen.

Security

  • Every AJAX endpoint checks the upload_files capability 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_sideload with a hard MIME whitelist (JPG, PNG, GIF, WebP)
  • ZIP extraction rejects path traversal (..), __MACOSX folders, and hidden dotfiles
  • Temp files live in a protected folder and are removed after each job, plus a daily cleanup cron

Frequently asked questions

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).

Contributing

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.

License

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.

About

Free WordPress plugin to bulk upload 1,000+ images to the Media Library from a CSV, ZIP or URLs, with alt text, captions and featured images.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages