Australcode Uniform Images solves the classic WooCommerce catalog problem: product photos with different proportions that the theme crops brutally to align the grid. This plugin makes them uniform without cropping — it adds smart padding over a colored canvas (white by default), optionally trims the uniform background first to normalize inconsistent margins, and delivers each thumbnail in AVIF + WebP + JPEG using the
<picture> element. The result:
same size product images across your whole shop — resize product images without cropping and regenerate product thumbnails in bulk, with no catalog limit.
Key differentiators
- Alt text from the product, not the filename — your uploads are called
IMG_4832.jpg. Image SEO reads the WooCommerce product title, category and brand and writes real alt text: "Vape Pod XYZ — Pods, Brand Z". Automatic on every new upload, free, no AI and no API calls. It never overwrites alt text you wrote yourself.
- No accidental crops — the entire product fits inside the thumbnail, always. The plugin pads to a uniform canvas instead of guessing where to crop.
- Real
<picture> markup — multi-source with AVIF + WebP + JPEG fallback. Survives any page cache (LiteSpeed, WP Rocket, Cloudflare APO, W3 Total Cache) because it does not use Vary: Accept. The browser picks the optimal format; the cache serves HTML without negotiation.
- 4-tier quality preset — Maximum / High / Standard / Economy with per-format values calibrated (e.g. Standard = AVIF Q60, WebP Q82, JPEG Q85 — visually indistinguishable from the original at half the size).
- HPOS-ready from day one — declares
custom_order_tables and cart_checkout_blocks compatibility without any setup.
- Cloudflare Image Transformations (CIT) — optional integration to serve via Cloudflare edge (
/cdn-cgi/image/format=auto) with automatic availability detection on your zone. If CIT is not enabled on your CF plan, the plugin keeps serving local derivatives without breaking anything.
Free (no license required)
- Bulk regenerate with Action Scheduler — async processing resumable after worker death, error classification (
oom, missing_original, engine_failed, fs_permission), scope filters (auto = products only based on Settings; all-used = every image referenced in posts/products/Bricks templates/terms).
- Embedded sample test — processes 1-5 images on demand and shows the before/after grid with bytes and % savings. Available on the Settings page ("Quick preview") and on Bulk regenerate ("Generate sample").
- Health page with CDN detection — engine diagnostics, encoders, filesystem permissions, detected competing plugins (Smush/EWWW/ShortPixel/Imagify), Cloudflare Polish status (alerts if active — incompatible with the plugin's AVIF/WebP), Image Prioritizer (Performance Lab) status with automatic detection.
- Image SEO on every upload — new product images get alt text, title and caption built from the product title, category and brand (caption off by default — WordPress fills it from the photo's IPTC data, and that text is usually the photographer's). Deterministic, no AI, no API calls. Existing images can be filled one at a time from the Media Library; filling the whole library in one pass is Pro.
- Extreme-padding detection — the Dashboard flags product images that get squared with a lot of empty canvas (panoramic or very tall photos) and a gentle, dismissible notice points you to how each aspect is handled. Detection is free; the per-aspect fix is a Pro upgrade.
- WP-CLI — 9 commands — 7 free:
wp acimg health, stats, regenerate, derivatives <id>, purge-cache (orphans; --stale/--all require Pro), restore-originals, migrate-from-sir. 2 Pro: wp acimg doctor (extended diagnostics) and wp acimg reset (full state reset).
Pro (license required)
- Cloudflare Image Transformations (CIT) delivery — emits
<img> with CIT URLs (/cdn-cgi/image/format=auto) instead of local derivatives when CIT is enabled on your zone. Defensive automatic fallback to the normal path if CIT is unavailable.
- Media Library audit + cleanup — orphan image detector that understands Bricks Builder (PHP serialize),
wp_termmeta, WooCommerce shortcodes, custom meta. Trash mode with typed confirmation, immutable audit log, and an untrash endpoint for rollback.
- Image Health Monitor — weekly cron that scans for missing derivatives, stale derivatives, Cloudflare Polish conflicts, and storage usage. Email digest to the admin only when there are actionable findings.
- Image SEO bulk backfill — fill the alt text, title and caption your library is missing in one pass, with a dry-run preview before anything is written. It only writes where the field is empty and never touches text you wrote yourself. (This is the fix at scale for the backlog the free Dashboard counts.)
- AI Alt Text BYOK — alt text generation per attachment via OpenAI Vision (
gpt-4o-mini) or Anthropic Vision (claude-haiku-4-5). Bring Your Own Key (no Merchant of Record over AI costs). Context enrichment with WooCommerce product title + category + brand. Complements Image SEO rather than replacing it: use it on the photos where the product name doesn't describe the picture.
- Catalog Watch + Auto-Heal — daily cron that detects ghost derivatives (DB rows without files), orphan files (files without DB rows), products with broken thumbnails. Auto-heal with dry-run preview + strict path validation. Persistent admin notice when there are actionable issues.
- Multi-Site Manager (Agency) — centralized dashboard to monitor up to 25 client sites from a single wp-admin. BYO Application Password, aggregated metrics (derivatives + bytes + issues), automatic hourly sync + ad-hoc. No external services: direct wp-admin ↔ wp-admin communication via native REST.
- CIT Cost Analyzer — daily pull from Cloudflare GraphQL Analytics API. MTD cost + monthly projection + peak day to identify spikes. BYO API token (CF authenticates directly).
- Per-aspect-ratio override — within a single WordPress size, process each aspect ratio (1:1, 4:3, 16:9, vertical, horizontal) differently: uniform with canvas, proportional without cropping, or skip. Keep square photos proportional while the rest follow the base mode. Wired into upload + bulk regeneration + derivative invalidation. (This is the fix for the extreme-padding the free Dashboard flags below.)
Integration with other plugins
- Image Prioritizer / Performance Lab — Australcode Uniform Images detects
fetchpriority="high" and propagates correct loading/decoding to the final <picture>. Native LCP optimization.
- Bricks Builder — supports
wp_get_attachment_image and optional output buffer rewriter for themes/page builders that bypass that filter.
- WP Rocket / a3 Lazy Load — compatible with
data-src/data-sizes lazy loaders (reads both if present).
v1.0 non-goals
- Smart crop — would break the "no cropping" promise. If you need that, this plugin is not for you.
- SaaS-only / phone home — the plugin is 100% local. All optimization happens on your own server.
- JPEG XL — format still immature in browsers. We will reevaluate in 2027.
Why this approach
- Padded canvas, never cropped — every thumbnail pads the product onto a uniform canvas, so the full product is always visible. No subject-guessing, no accidental crops.
<picture> element, cache-safe by design — AVIF + WebP + JPEG fallback served without Vary: Accept, so it survives any HTTP page cache (LiteSpeed, WP Rocket, Cloudflare APO, W3 Total Cache). The browser picks the format; the cache serves one HTML.
- AVIF + WebP + JPEG, all free — modern formats are part of the free core, not a paid add-on.
- Unlimited bulk on Free — regenerate your whole catalog with no image cap and no monthly credit quota.
- 100% local — all processing happens on your own server. No SaaS, no phone-home, your images never leave the site.
- Built for WooCommerce grids — reads
wp_get_registered_image_subsizes() and respects the WC thumbnail-cropping setting, so it targets exactly the product sizes your theme uses.
Australcode Uniform Images does one job: uniform product thumbnails for WooCommerce grids, served cache-safe. It only touches images on registered WooCommerce sizes, so it coexists with any general image optimizer you already run.
Via WordPress Admin (recommended)
- Go to Plugins → Add new in your WP admin, search for "Australcode Uniform Images" and click Install + Activate.
- Navigate to the new top-level menu Australcode Image → Settings and choose your quality preset (default Standard works well for most cases).
- Go to Australcode Image → Bulk regenerate, run a Sample Test with one product to validate visually, then click "Start bulk" to process the full catalog.
Via WP-CLI
wp plugin install australcode-uniform-images --activate
wp acimg health # verify everything is OK
wp acimg regenerate # bulk dry-run
wp acimg regenerate --start --yes # starts bulk in the background
wp acimg reset --yes # Pro: wipe all plugin state (tables, options, dirs) without deactivating
The
wp acimg reset command (Pro) clears every persisted artifact — the 6 custom tables, options, post meta, transients and derivative directories — without deactivating the plugin. It's destructive and defaults to an interactive confirm; pass
--yes to skip it. Useful to start from a clean slate when re-testing settings or migrating.
0.42.0
- New: Image SEO (free). Alt text, title and caption built from your WooCommerce product data — title, category and brand — instead of from the filename. Runs on every new upload, deterministic, no AI and no API calls. Off by default: nothing is written until you turn it on.
- New: "Missing alt text" on the Dashboard (free). Counts how many product images Image SEO can actually fill, and says plainly how many aren't attached to a product — because those have nothing to read from and no upgrade fixes that.
- New: Image SEO bulk backfill (Pro). Fills the alt text your library is missing in one pass, with a dry-run preview of real rows before anything is written.
- Fix (data): AI alt text no longer overwrites alt text you wrote yourself. The bulk action applied the generated text unconditionally, replacing hand-written alt text. It now skips those images unless you explicitly pick the new "replace existing alt text" action — and it skips them before calling the provider, so no tokens are spent on a result that gets discarded.
- Improved: AI alt text now gets product context on gallery and variation images. It previously only recognized featured images; the rest reached the model with no context at all.
- The media modal now has a single "Image SEO" field with both buttons ("Fill from product data" and, with a key configured, "Generate with AI") instead of two separate rows writing the same field.
0.41.0
- New: full-bleed photo detection (free). The plugin now recognizes photos that already fill the frame — lifestyle shots, banners — as opposed to product cutouts on a plain background. The Dashboard and Health page flag how many are being shrunk and framed in white, with an honest "N of M analyzed" count.
- New: "Keep full-bleed photos" setting (opt-in). Turn it on and those photos are served edge to edge instead of scaled down to the content size; real cutouts are still scaled as before. Off by default — your existing derivatives are untouched until you enable it.
- New: the "Content size (%)" is now editable in Settings. It controls how much of the canvas the subject fills in Uniform sizes (85% leaves a margin, 100% fills edge to edge). It was previously fixed and only reachable via WP-CLI.
- Fix (data): saving Settings no longer resets the content size. Sites that had customized it — for example after migrating from Perfect Image Resize, where it defaulted to 100% — silently lost the value on every save and needlessly regenerated their whole catalog. Fixed.
- Fix: with "Apply trim to the original" enabled, full-bleed photos are no longer re-encoded. When the trim finds nothing to crop, the original is now left byte-for-byte untouched instead of being re-saved at a lower quality with no benefit.
- Internal: static-analysis cleanups. No breaking changes — safe in-place upgrade.
0.40.1
- Maintenance: removed the "More by Australcode" cross-promotion section from the Upgrade screen.
0.40.0
- New: "Heavily padded" detection (free). The Dashboard now flags product photos that get squared with a lot of empty canvas — panoramic or very tall images — and a gentle, dismissible notice points you to how each aspect ratio is handled. Detection is free; the per-aspect fix is a Pro upgrade.
- Admin theme now fully matches the Australcode family. Every page header shows the product app-icon and the sidebar menu icon recolors like a native WordPress icon (de-forked onto the shared Admin Kit) — consistent chrome across every Australcode plugin.
- Polish: the Upgrade page header gained the product icon + a one-line intro, the Catalog Watch and Multi-Site tables now scroll cleanly on mobile instead of squashing, smoother transitions throughout, and the Freemius account screen picks up the green accent.
- No data or settings changes — safe in-place upgrade.
0.39.1
- New "Upgrade" page replaces the separate "Family" submenu — it bundles the Pro feature pitch and the "More by Australcode" cross-sell into a single, less intrusive growth surface (the family catalog still lives there, ad-free).
- Refined menu icon — the sidebar now shows the product glyph (the 2×2 uniform-grid mark), matching the plugin icon for a consistent identity.
- Completed Spanish translations for the Pro weekly health digest email, the health severity labels, and the Cloudflare cost analyzer placeholders.
- Housekeeping: SPDX license identifier in the headers, refreshed static-analysis tooling (PHPStan 2.x), and documentation tidy-up. No behavior changes for the free version.
0.39.0
- New look: the Australcode admin theme. Every plugin page now ships the Australcode Admin Kit — same typography, spacing and the new green accent across the whole plugin family. No settings change; purely visual.
- English-first interface. The admin UI source language is now English, with complete Spanish translations bundled (
es_ES and es_CL, 100% coverage). WordPress picks your site language automatically.
- New "Family" page — discover the other Australcode plugins, see which ones you already run, and install the free ones in one click. No ads, no admin notices — it lives quietly as the last submenu.
- Fixed: PHP notices when the premium and free builds are swapped in place (constant guards).
- Fixed: the WooCommerce cropping how-to path in Settings was untranslatable.
0.38.0
- Licensing and checkout moved to Freemius. Pro licensing, purchases and the in-plugin account now run through Freemius — our new billing platform and Merchant of Record — replacing the previous provider. Image processing, bulk regeneration and delivery are unchanged; this release only swaps the billing/licensing layer.
- Privacy-first, optional opt-in. The connection screen is fully WordPress.org-compliant: clicking "Skip" keeps every free feature working and sends no data to any external service.
- The free version stays 100% functional with no account required.
- Updated the "External services" disclosure in this readme to reflect the move from Lemon Squeezy to Freemius.
0.37.0
wp acimg migrate-from-sir is now free — import your Smart Image Resize settings (background color, trim, sizes) into Australcode with one command. Makes switching effortless.
- New output-format controls (free) — force JPEG-only or PNG-only output per your needs, plus an optional delivery filesystem check on the Health page. Off by default; existing sites unaffected.
- Catalog Watch repair now runs in the background — on large catalogs the repair (and its preview) no longer time out behind Cloudflare. Progress is shown and you can close the page; the job continues. (Pro)
- Cleanup, Multi-Site and CIT Cost pages redesigned — Cleanup is now a 3-step wizard (Audit → Review → Move), Multi-Site has a guided empty state, and CIT Cost leads with a budget KPI + projection.
- Fixed — Settings page polish: the AI Alt Text and aspect-ratio override sections now align with the settings column, and their "Pro" badges correctly disappear once a Pro license is active.
0.36.1
- Page-builder coverage extended to Beaver Builder (
_fl_builder_data) and Oxygen (ct_builder_shortcodes). The detection now combines two strategies per builder: structured ID extraction (precise for Bricks/Elementor) and a universal URL scan of the builder's stored markup (covers Beaver, Oxygen, and any builder that embeds the image URL). Divi/WPBakery remain covered via post_content.
0.36.0
- Page-builder coverage: Bulk Regenerate ("All used images" scope) now detects images placed directly in Bricks and Elementor templates — they live in the builder's own storage (
_bricks_page_content, _elementor_data), outside post_content, so previous versions never found or optimized them. Divi was already covered (it stores in post_content). The frontend delivery already handled any <img> from any builder; this closes the generation side.
- Bulk runs now process exactly what the chosen scope selected: the "All used images" scope optimizes every used image (products and non-products alike), instead of silently skipping images whose post type isn't in the processing filter. The per-type filter still governs automatic processing on upload.
0.35.0
- New (opt-in): auto-detect transparency. When enabled, images whose original has significant transparency (logos, cut-out products with shadows) keep their alpha channel — the plugin uses a transparent canvas and a PNG raster fallback instead of flattening onto the canvas color. WebP and AVIF already preserve transparency. Off by default, so existing sites are unaffected until you turn it on (which regenerates derivatives). Set it in Settings → Formats & quality → Transparency.
0.34.1
- Internationalization: the admin JavaScript layer is now fully translatable. All dynamic UI text in Bulk Regenerate and Clean Library (counters, confirmations, progress, summaries, error messages) — plus the previously localized Catalog Watch, Multi-Site, CIT Cost Analyzer and settings preview — now routes through WordPress translations instead of hardcoded strings.
- The English (en_US) translation bundle is now 100% complete.
- No behavior changes: every string keeps its original fallback until the site's active language provides a translation.
0.34.0
- Pro: new per-aspect-ratio mode overrides. For each main WooCommerce size you can choose how each aspect ratio is processed (square 1:1, 4:3, 16:9, portrait, etc.): uniform with canvas, proportional without cropping, or skip. For example, keep square images on "proportional" while the rest of the size follows its base mode. Available on all paid plans.
- The per-aspect override is wired into the generation pipeline (upload and bulk regeneration) and into derivative invalidation, so changing it regenerates only what is needed.
- Visibility: the Dashboard now shows how many images were skipped by the context filter (not attached to a processable post type), with a shortcut to adjust the filter. Avoids the "I uploaded an image and nothing happened" confusion.
0.33.2
- Security: REST endpoints that operate on attachments now verify the edit/delete capability per attachment (current_user_can edit_post/delete_post), in addition to the general manage_woocommerce gate.
0.33.1
WP.org re-submission compliance + listing polish. No user-facing behavior changes — safe in-place upgrade.
- External services URLs no longer pingable as 404 — the readme's "External services" section referenced API endpoints (
api.lemonsqueezy.com, api.openai.com, api.anthropic.com, api.cloudflare.com) as full URLs. WP.org's review scanner pings every URL in the readme and flagged the Lemon Squeezy endpoint as a broken Terms/Privacy URL. Endpoints are now declared as host + path (not full clickable URLs); Terms/Privacy links remain and resolve.
- Explicit output-buffer close —
OutputBufferHook (opt-in feature, off by default) now closes its ob_start() buffer explicitly on shutdown, guarded by ob_get_level(). Same rewritten output, paired open/close as WP.org guidelines expect. WP 6.5+ compatible.
- Banners + branding — re-generated WP.org banners with the current name (Australcode Uniform Images) and version; renamed the last legacy global variable in the bootstrap file.
- Listing polish — sharper short description and tags for the target niche, added Upgrade Notice, fixed screenshot #8 caption, aligned WP-CLI command count between Description and FAQ.
Internal: 296/296 unit tests passing.
Full history of older versions (0.33.0 and earlier) is preserved in the project's archive — contact support@australcode.io if you need detail on a specific legacy version.