WordPress HEIC plugin · Auto-Convert iPhone photos on upload

Christopher Ross

4 min read

WordPress & CMS engineering · Fort Erie, Ontario

Your iPhone takes photos in HEIC. WordPress doesn’t display HEIC. Most browsers don’t either. Until last year I was telling clients to convert their photos before upload, which is the kind of advice editors politely nod at and then ignore. So I built this. Drop a .heic file into the Media Library and the plugin produces a JPEG twin server-side, registers it as the canonical image, and keeps the original on disk in case you ever want it back.

What you get

  • Automatic JPEG generation for every .heic and .heif upload
  • The JPEG is the version WordPress hands to the front end: your existing themes and templates “just work”
  • Original HEIC kept on disk: non-destructive, fully reversible
  • Quality setting 88 (slightly higher than WebP defaults, HEIC source files reward less aggressive compression)
  • No external API, no cloud round-trip, no monthly bill

Who it’s for

WordPress site owners whose contributors are mostly on iPhones: agency editors, real-estate teams, hospitality operators, travel writers. The pattern is always the same: someone uploads a beautiful photo, the page renders an empty image box, and twenty minutes of debugging later you realize the file is HEIC. This plugin closes that loop so the upload “just works” the first time.

How to install and verify

  1. Download the plugin .zip from the button below.
  2. Upload via WordPress Admin → Plugins → Add New → Upload Plugin → Install Now → Activate.
  3. Activate. The MIME-type registration and conversion hook fire on activation. No settings page.
  4. Verify it’s working. Take a photo on an iPhone (default settings produce HEIC), AirDrop or email it to yourself, and upload it via Media → Add New. The Library should show a JPEG thumbnail immediately and the file should be insertable into a post. Before this plugin: an upload error or an empty thumbnail. After: a working image.

Server requirement: the plugin uses Imagick with HEIC support compiled in. Most managed WordPress hosts ship this; some bare-metal VPS images don’t. If a test upload doesn’t produce a JPEG, run convert -list format | grep -i heic on your host to confirm support.

Why I keep the original on disk

HEIC stores 10-bit colour and the JPEG twin is 8-bit. If you’re an editorial site that ever wants to publish a higher-fidelity version (a print-quality download, an Instagram crosspost, a future format upgrade), the source matters. Deleting it on conversion is a one-way door. Keeping it costs ~50% more disk per photo, which is cheap insurance against the future you who needs it back.

File details

  • Version: 1.0.0
  • Last updated: December 19, 2025
  • Format: .zip (single PHP file)
  • License: GPL-2.0-or-later
  • Tested with: WordPress 6.7 · PHP 8.1+ (Imagick with HEIC support required)

Other downloads from this practice

Common questions

Is converting HEIC to WebP a “non-destructive” process?

Yes. The plugin never deletes your originals. Instead of overwriting the high-resolution HEIC files, it archives them in /uploads/heic-backups/, so you can restore the source assets any time. Your original photos stay exactly as your camera saved them.

Does HEIC conversion require specific server settings?

Yes. The standard PHP GD image library can’t read HEIC, so the plugin uses the ImageMagick (Imagick) extension with libheif support on the server. Most managed WordPress hosts already provide it. If yours doesn’t, your host can usually enable it on request.

Can I bulk-convert my existing iPhone photos to WebP?

Yes. The built-in AJAX bulk processor scans your media library and converts files in small batches, so a large library won’t trip a server timeout. You can watch progress and see the storage savings add up as each batch finishes.

Working through something on your own site? Get in touch →

Leave a Reply

Your email address will not be published. Required fields are marked *

Your rating (optional)

Your name and email are stored with your comment; only your display name is shown publicly. See our privacy policy.