Features
Everything Tempaloo WebP does, in one place. From per-upload conversion stats to the Diagnostic tab that surfaces drift between WordPress meta and disk state — every feature is visible in your WP admin without extra setup.
Compression stats — every uploaded image
The moment an upload finishes on /wp-admin/media-new.php, a stats line appears right under the filename — no need to click Edit to see what just happened.
The same data is visible in three other places:
- Media Library list view — a new Optimized column with the saved % and before/after sizes.
- Attachment edit modal — a green stats block in the right sidebar.
- Block editor / Gutenberg — every
attachmentobject now carries atempaloofield readable by any custom block.
.webp /.avif siblings on disk — a filesize() call. Zero API round-trips, zero storage, zero quota.Restore originals — one click, no risk
Found in Tempaloo WebP → Settings, at the bottom: a button that wipes every.webp / .avif sibling we ever wrote.
What gets deleted
- Every
.webpfile matching{filename}.{ext}.webpin your uploads folder. - Every
.aviffile similarly. - The
tempaloo_webpmeta block on each attachment.
What stays untouched
- Your originals (
.jpg,.png,.gif) — never written, never deleted. - Your monthly quota — restoring doesn't refund credits because the work was already done.
.webp files with new settings (different quality, different format). It's a clean reset, not a destruction.Resize on upload — shrink huge photos automatically
Most photos uploaded by editors are 4000–8000 px wide — way more than any browser will ever display. Resize-on-upload caps the width before WordPress generates thumbnails, saving disk space, conversion quota, and outbound bandwidth.
How it works
The plugin hooks into WordPress core's big_image_size_threshold filter (added in WP 5.3). When a user uploads an image wider than the threshold, WP automatically scales it down and saves the untouched original as {filename}-scaled-original.{ext} for safekeeping.
Quality presets — three buttons covering 95% of cases
The quality slider is still there for power users. But picking 72 vs 78 isn't a decision most users want to make. Three named presets do the work:
What each preset means
- Normal (q=85) — visually identical to the original on any monitor. Use for portfolios, photography sites, anything where image quality is part of the product.
- Aggressive (q=75) — the default, recommended for blogs, news sites, e-commerce. Indistinguishable from the original at typical viewing distances.
- Ultra (q=60) — 30%+ smaller than Aggressive. You'll start to see banding on gradients, but typical photos still look fine. Use on landing pages where speed beats fidelity.
tempaloo_webp_quality_for filter — see Developer hooks.Media Library actions — per-image control
The Optimized column on /wp-admin/upload.php is more than a status indicator. Every row carries a complete control surface: the conversion badge, savings breakdown, an expandable detail panel, and a one-click restore.
Per-row capabilities
- Format badge — color-coded by output: emerald (WebP), violet (AVIF), gradient (Both).
- Detail accordion — expand to see per-size breakdown (original, thumbnail, medium, large…) with bytes-in / bytes-out / saved-percent for each.
- Convert now — for unconverted images, a one-click button that runs the full conversion (1 credit, every WP-generated size).
- Restore original — opens an inline confirm panel (no native browser dialog), wipes the
.webp/.avifsiblings, leaves your original JPEG/PNG/GIF on disk untouched.
Bulk row-actions
The standard WordPress bulk-actions dropdown above the list view also carries our two operations:
- Optimize with Tempaloo — convert every selected image. Already-converted ones are skipped (no credit burn).
- Restore originals (Tempaloo) — restore every selected image at once.
Capped at 100 attachments per submit — beyond that, use the dedicated Bulk page with its pause / resume / retry queue.
Async upload pipeline — uploads never wait on conversion
Conversion-on-upload doesn't run synchronously inside the WordPress filter chain, where it would have to share the request with LiteSpeed Image Optimization, Wordfence, host security scanners, and any other plugin hooked on the same filter. Instead, Tempaloo WebP captures the attachment ID at upload time and dispatches a non-blocking loopback request.
How it works
- You upload an image. WordPress finishes its standard upload flow (DB insert, thumbnail generation).
- The plugin enqueues the attachment ID and returns immediately. The user's upload finishes within milliseconds.
- On
shutdown, a fire-and-forgetwp_remote_posthitsadmin-post.php. - The loopback lands in a fresh PHP process and runs the conversion in isolation. No competing filter, no race condition.
- Result: the converter writes
.webp/.avifsiblings, updates the attachment meta. The Overview "this month" counter reflects the new conversion within seconds.
Emergency rollback
If you need to disable the async pipeline (testing, debugging, host quirks), drop a constant in wp-config.php:
define( 'TEMPALOO_WEBP_DISABLE_ASYNC', true );The plugin reverts to synchronous conversion-on-upload — same behavior as v1.8.x and earlier. Remove the line to switch back.
Diagnostic tab — state audit & repair
The Diagnostic tab in your WP admin is a forensics surface for "what's actually going on with my images". Three tools, one place.
State audit
Walks four sources of truth in parallel and surfaces drift between them:
- Filesystem — what
.webp/.aviffiles actually exist in/wp-content/uploads/. - Attachment meta — what the
_tempaloo_webppost_meta key says was converted. - Bulk state — the running / paused / done state of the last bulk job.
- Retry queue — attachments whose first conversion failed and are scheduled for cron retry.
The audit detects orphans (files on disk with no meta record), ghosts (meta records pointing at missing files), stuck running jobs, and overage retries. Reconcile fixes them in one click.
Inspect attachment by ID
Type any attachment ID, get a forensic dump: meta in both storage locations side-by-side (_tempaloo_webp vs legacy in-metadata), the original file existence + bytes, per-size disk state for .webp and .avif, plus a directory listing of every file matching the attachment's filename pattern. Surfaces immediately whether another optimizer touched the same files.
Filesystem self-test
Writes a real (tiny, 26-byte) .webp into your uploads directory, immediately re-checks existence, sleeps 5 seconds, re-checks, then fetches the file via HTTP and inspects the Content-Type. Returns one verdict line that names the failure mode:
WRITE_FAILED— permissions issue.POST_WRITE_VANISH— host security caught the write.PERSISTENCE_FAILURE— something deleted it within 5 seconds (LiteSpeed Image Opt, Wordfence, host WAF).WRONG_MIME— file persists but served asimage/jpeg→ browser can't decode.OK— write, persistence, and serve all healthy.
Cache compatibility — survives every page-cache plugin
LiteSpeed Cache, WP Rocket, W3 Total Cache, Cache Enabler, and Hummingbird all sometimes cache authenticated REST responses by URL — even when those responses carry per-user data. Without active opt-out, the Overview "this month" counter would freeze after every upload until a manual cache purge.
Four-layer cache opt-out
- Every REST callback sends
nocache_headers()+ definesDONOTCACHEPAGE/DONOTCACHEOBJECT/DONOTCACHEDB— the constants every major page-cache plugin checks. - Explicit
litespeed_control_set_nocacheaction on every request — no-op without LSCache, immediate opt-out where it's installed. - The plugin self-registers its REST namespace with
litespeed_cache_excludes_uri,rocket_cache_reject_uri, andw3tc_minify_pgcache_reject_urifilters, so cache layers skip us at config-resolution time, not just runtime. - Frontend appends a
?_=Date.now()cache-buster on every fetch and sendsCache-Control: no-cache+Pragma: no-cacheheaders — last line of defence against Cloudflare APO and Varnish without ESI.
/wp-json/tempaloo-webp/v1) is already excluded.Troubleshooting — common issues
"This month" counter doesn't update after an upload
Almost always a page-cache layer holding a stale /state response. Open the Diagnostic tab and click the Reconcile button — it forces a fresh audit and bypasses cached data. If the issue persists, your cache plugin needs to be told to skip /wp-json/tempaloo-webp/v1 manually (Tempaloo registers itself automatically with LSCache / Rocket / W3TC; if you're on a different cache, add the rule).
Conversion logs success but .webp files vanish
A host-level scanner (Wordfence, iThemes Security, Hostinger LSCache stack) is quarantining the freshly-written sibling. Run the Filesystem self-test in Diagnostic — if it returns PERSISTENCE_FAILURE orPOST_WRITE_VANISH, you have evidence to escalate to your host. Tempaloo writes via the atomic temp + rename pattern (inspired by WP Smush) so the scanner doesn't catch a half-written file — but if it specifically targets the.jpg.webp pattern post-rename, only host-side allow-listing fixes it.
Free plan AVIF dropdown won't stay selected
AVIF is paid-only. The Free plan's settings UI lets you click AVIF, but it's quietly re-saved as WebP on submit. Upgrade to Starter or above to unlock AVIF and the dual-format Both mode that generates both siblings in one credit.
Bulk page shows "Converting…" but no progress
The Bulk loop pings ajax_tick every 350 ms. If you see no progress, your server's admin-ajax.php is probably rate-limited. Check theAPI health banner — if it shows a 5xx error, the worker is rebooting and Bulk will resume on its own with adaptive backoff (5s → 10s → 15s → 20s).
Need direct help?
Reach out via the contact page — we read every message. Include your site URL, plugin version, and a screenshot of the Diagnostic tab if relevant.