Images and video are usually the largest thing a WordPress site serves, and the slowest. This plugin moves your media library to object storage and serves it from a CDN, so your web server stops sending the bytes and your pages get faster everywhere in the world.
You never enter an access key. Your storage keys are never saved in WordPress, so they are not in your database, your migration exports or your backups.
You turn media offload on in your Zinn Digital® dashboard, paste a short pairing code here once, and this plugin holds a token that works for
this site's folder and nothing else. Before each upload it asks Zinn Digital® for a one-time signed link, and the file goes straight from your web server to storage. If the token is ever exposed, you revoke it from your dashboard in one click.
What it does
- Uploads new media — the original and every thumbnail size WordPress generates — to your Zinn® storage.
- Rewrites image URLs, including
srcset responsive images, to your CDN address.
- Moves your existing media library in the background, a few files at a time, picking up where it left off.
- Optionally removes the local copies once every size has uploaded successfully.
What it does not do
- It adds no REST endpoint, no shortcode, no script and no stylesheet.
- The one thing it does change on a public page is the address of an image or file that has
been offloaded:
wp_get_attachment_url and wp_calculate_image_srcset are filtered so the
markup points at your bucket instead of this server. Nothing is added to the page, and while
Serve from Zinn® storage is off the addresses are left exactly as WordPress wrote them.
- It never deletes anything from storage. Retention is decided in your dashboard.
- It does not delete local files after a partial upload — if any size fails, every local copy stays.
- It never asks for a storage key or a bucket name. Which bucket this site uses is decided in your Zinn Digital® dashboard. Whether addresses are rewritten and whether local copies are removed start as your dashboard's choices when you pair, and you can change them afterwards on the plugin's How media is served tab.
What it needs
- A Zinn Digital® account with object storage enabled for this site.
- Outbound HTTPS from your web server.
- Install and activate the plugin.
- In your Zinn Digital® dashboard, open the site, choose Files & databases, turn on Images & video CDN, and press Get a pairing code.
- In WordPress go to Zinn Digital® → Media Offload, paste the code on the Connection tab, and press Connect this site.
New uploads move immediately. Your existing library moves in the background over the following hours.
1.5.6
- Plural forms in every language now follow that language's own plural rules (Russian, Polish, Czech, Croatian, Serbian, Arabic, Hebrew, French and others), re-filled by the translator with a human check on the forms it could not tell apart.
1.5.5
- The Zinn® panel now appears only on this plugin's own screens, never on the WordPress dashboard (WordPress.org guideline 11).
1.5.4
- Translations follow each language's WordPress.org translation team style guide: its quotation marks, spacing before punctuation, apostrophes and ellipsis, and the forms of address it uses.
1.5.3
- Japanese follows the WordPress.org Japanese team's style guide: a half-width space around Latin text, half-width colons and question marks.
1.5.2
- New: two wp-config.php switches for the Zinn Digital® panel. define( 'ZINN_OFFLOAD_PROMO', false ); removes the panel (dashboard widget, settings block and footer), and define( 'ZINN_OFFLOAD_PROMO_HOSTING_URL', 'https://…' ); points its hosting offer at another https address.
1.5.1
- Every bundled translation is redone with the current Google model: each locale in its own script (Serbian in Cyrillic), in the register its WordPress translation team uses, with the original spacing, placeholders and entities preserved.
1.5.0
- On sites hosted by Zinn Digital®, this plugin is now installed from WordPress.org, so it updates from WordPress.org like any directory plugin. No change to what it does.
1.4.0
- Smaller download: the editable translation sources (.po) are no longer shipped; WordPress only ever loads the compiled .mo and .l10n.php files, which are unchanged.
1.3.0
- Updates install whenever you click Update, even months later: the download link is fetched fresh at install time instead of expiring in WordPress's saved update data.
1.2.11
- Security hardening: the design-token stylesheet validates every component id and strips anything that could close the inline style.
1.2.10
- The Connection tab now names the dashboard screens as they really are: open your site, then Files & databases, then Get a pairing code under Images & video CDN. The installation steps say the same and name the plugin's own screen, Zinn Digital® → Media Offload, and the description no longer says the plugin has no settings of its own. The WordPress.org listing gains three screenshots.
1.2.9
- Readme: clearer description of how the plugin works.
1.2.8
- Translations: a word written in the wrong alphabet (for example a Korean word inside a Malayalam sentence, or an Urdu word ending a Punjabi one) is corrected in every language that had one. Each affected string was translated again and checked.
1.2.7
- Tested up to: 7.1 — the major version only, as WordPress.org's Plugin Check requires (7.1.1 was refused as invalid_tested_upto_minor).
1.2.6
- Tested up to WordPress 7.1.1.
1.2.5
- In a right-to-left admin language, the Zinn Digital® menu entry showed its trademark symbol on the wrong side of the name. The name is now isolated so it reads correctly in Arabic, Hebrew, Persian, Pashto and Urdu.
- Number fields on the settings screen are now wide enough to show the whole value; a long value was cut off to its first few digits.
1.2.4
- The admin screens' styles and scripts are now enqueued through WordPress rather than printed into the page, so they can be dequeued, deferred or optimised by your site like any other asset — and they still work on a site whose security policy forbids inline code.
1.2.3
- Translations: every string this plugin's admin shows is now translated in every bundled language. A few strings the machine translator refused were shipping in English; they are now translated by hand.
- The file-type list on the settings screen now comes from WordPress's own cached answer instead of a direct database query.
1.2.2
- Fixed (first shipped in 1.2.1): offloading a file no longer fails with a fatal error. The class that streams uploads was shipped and never loaded.
- Hardening: a settings rule can no longer be mistaken for a PHP function with the same name. The same shared settings code is what stopped Zinn® Translate saving its settings. Nothing about how this plugin behaves changes.
1.2.0
Everything about offloading is now yours to set: whether new uploads move, whether the existing library keeps moving and how fast, a minimum file size, file types to leave alone, and whether media is served from storage and the local copy deleted.
1.1.3
- Fixed: uploading a large media file could exhaust PHP's memory. Files are now streamed to storage rather than read into memory first.
- Corrected the description: the plugin does rewrite media addresses on public pages when you switch rewriting on, which the readme previously denied.
1.1.2
1.1.0
- Added the Zinn® panel: links to Zinn Digital® hosting, the Zinn® marketplace, Zinn Hub® and this plugin's user guide, from inside the WordPress admin.
1.0.0