{"id":315190,"date":"2026-06-03T19:29:18","date_gmt":"2026-06-03T19:29:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/perfect-image-resize\/"},"modified":"2026-06-20T17:55:00","modified_gmt":"2026-06-20T17:55:00","slug":"australcode-uniform-images","status":"publish","type":"plugin","link":"https:\/\/cn.wordpress.org\/plugins\/australcode-uniform-images\/","author":23459699,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.40.0","stable_tag":"trunk","tested":"7.0","requires":"6.5","requires_php":"8.2","requires_plugins":null,"header_name":"Australcode Uniform Images","header_author":"Australcode","header_description":"Uniforma im\u00e1genes de productos de WooCommerce sin recortar y las sirve en formatos modernos (AVIF\/WebP\/JPEG) usando &lt;picture&gt;.","assets_banners_color":"0f1110","last_updated":"2026-06-20 17:55:00","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/uniform-images.australcode.io","header_author_uri":"https:\/\/australcode.io","rating":0,"author_block_rating":0,"active_installs":0,"downloads":308,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.34.0":{"tag":"0.34.0","author":"australcode","date":"2026-06-03 19:28:51"},"0.36.1":{"tag":"0.36.1","author":"australcode","date":"2026-06-04 23:25:45"},"0.37.0":{"tag":"0.37.0","author":"australcode","date":"2026-06-08 03:52:14"},"0.38.0":{"tag":"0.38.0","author":"australcode","date":"2026-06-09 15:02:15"},"0.39.0":{"tag":"0.39.0","author":"australcode","date":"2026-06-10 20:42:39"},"0.39.1":{"tag":"0.39.1","author":"australcode","date":"2026-06-15 20:06:39"},"0.40.0":{"tag":"0.40.0","author":"australcode","date":"2026-06-20 17:55:00"}},"upgrade_notice":{"0.40.0":"<p>New free &quot;heavily padded&quot; detection on the Dashboard flags panoramic or very tall product photos that get squared with empty canvas. The admin theme now fully matches the Australcode family. No data or settings changes \u2014 safe in-place upgrade.<\/p>","0.39.1":"<p>Polish release: the &quot;Family&quot; submenu is now the unified &quot;Upgrade&quot; page (Pro pitch + &quot;More by Australcode&quot; in one place), a refined menu icon, and completed Spanish translations for the Pro weekly digest. Safe in-place upgrade \u2014 no settings or data changes.<\/p>","0.39.0":"<p>Visual refresh: the new Australcode admin theme (green accent) + English-first UI with full Spanish translations included. No data or settings changes \u2014 safe in-place upgrade.<\/p>","0.38.0":"<p>Pro licensing and checkout now run through Freemius (our new billing platform). The free version is unchanged and 100% functional \u2014 the connection screen is optional, so you can safely click &quot;Skip&quot;. Safe in-place upgrade.<\/p>","0.37.0":"<p>Catalog Watch repair now runs in the background \u2014 no more timeouts on large catalogs. New free output-format controls and a free Smart Image Resize import command. Safe in-place upgrade.<\/p>","0.36.1":"<p>Page-builder detection now also covers Beaver Builder and Oxygen. Run a Bulk Regenerate (&quot;All used images&quot; scope) to optimize images placed in their templates.<\/p>","0.36.0":"<p>Bulk regeneration now detects images placed in Bricks and Elementor templates (page-builder content). Run a Bulk Regenerate (&quot;All used images&quot; scope) to optimize them.<\/p>","0.35.0":"<p>New opt-in setting: auto-detect transparency. Off by default \u2014 existing sites are unaffected. Enabling it regenerates derivatives.<\/p>","0.34.1":"<p>The admin UI is now fully translatable (English bundle 100%). No behavior changes \u2014 safe in-place upgrade.<\/p>","0.33.1":"<p>WordPress.org compliance and listing fixes. No user-facing behavior changes. Safe in-place upgrade.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3568057,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3568057,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500-es_ES.png":{"filename":"banner-1544x500-es_ES.png","revision":3573643,"resolution":"1544x500","location":"assets","locale":"es_ES","width":1544,"height":500},"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3573643,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-es_ES.png":{"filename":"banner-772x250-es_ES.png","revision":3573643,"resolution":"772x250","location":"assets","locale":"es_ES","width":772,"height":250},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3573643,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.34.0","0.36.1","0.37.0","0.38.0","0.39.0","0.39.1","0.40.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3580187,"resolution":"1","location":"assets","locale":"","width":2560,"height":1440},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3580187,"resolution":"2","location":"assets","locale":"","width":2560,"height":1440},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3580187,"resolution":"3","location":"assets","locale":"","width":2560,"height":1440},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3580187,"resolution":"4","location":"assets","locale":"","width":2560,"height":1440},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3580187,"resolution":"5","location":"assets","locale":"","width":2560,"height":1440},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3580187,"resolution":"6","location":"assets","locale":"","width":2560,"height":1440},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3580187,"resolution":"7","location":"assets","locale":"","width":2560,"height":1440},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3580030,"resolution":"8","location":"assets","locale":"","width":2560,"height":1440}},"screenshots":{"1":"<strong>Before \/ After<\/strong> \u2014 product photos with mismatched proportions get cropped and misaligned in the grid (left); Australcode pads them onto a uniform canvas so the full product shows and the grid lines up (right).","2":"<strong>Dashboard<\/strong> \u2014 catalog metrics: processed images, generated derivatives, storage used, % savings when serving AVIF vs original, active quality preset, current bulk run.","3":"<strong>Settings<\/strong> \u2014 4-tier quality preset, per-size override, visual canvas color picker, sticky save bar that appears when changes are detected.","4":"<strong>Bulk regenerate<\/strong> \u2014 scope dropdown with real-time count, dry-run with storage and time estimation, embedded sample test with before\/after grid.","5":"<strong>Health<\/strong> \u2014 full diagnostic: active engine + codec capabilities matrix, DB tables with row count, applied migrations, CDN edge (Cloudflare Polish\/Mirage + Image Transformations detection).","6":"<strong>Clean library<\/strong> (Pro) \u2014 orphan image audit with Bricks Builder + wp_termmeta + WooCommerce shortcodes detection. Trash mode with typed confirmation and audit log.","7":"<strong>Catalog Watch<\/strong> (Pro) \u2014 daily cron that detects ghost derivatives, orphan files, and products with broken images. Auto-heal with dry-run preview before applying.","8":"<strong>AI Alt Text<\/strong> (Pro, BYOK) \u2014 generate accessible alt text per image via OpenAI or Anthropic Vision, enriched with the WooCommerce product title, category and brand. Your own key, no markup."}},"plugin_section":[],"plugin_tags":[194661,14337,24716,2956,286],"plugin_category":[45,50],"plugin_contributors":[265691],"plugin_business_model":[],"class_list":["post-315190","plugin","type-plugin","status-publish","hentry","plugin_tags-avif","plugin_tags-image-resize","plugin_tags-product-images","plugin_tags-thumbnails","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_category-media","plugin_contributors-australcode","plugin_committers-australcode"],"banners":{"banner":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/banner-772x250.png?rev=3573643","banner_2x":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/banner-1544x500.png?rev=3573643","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/icon-128x128.png?rev=3568057","icon_2x":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/icon-256x256.png?rev=3568057","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/screenshot-1.png?rev=3580187","caption":"<strong>Before \/ After<\/strong> \u2014 product photos with mismatched proportions get cropped and misaligned in the grid (left); Australcode pads them onto a uniform canvas so the full product shows and the grid lines up (right)."},{"src":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/screenshot-2.png?rev=3580187","caption":"<strong>Dashboard<\/strong> \u2014 catalog metrics: processed images, generated derivatives, storage used, % savings when serving AVIF vs original, active quality preset, current bulk run."},{"src":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/screenshot-3.png?rev=3580187","caption":"<strong>Settings<\/strong> \u2014 4-tier quality preset, per-size override, visual canvas color picker, sticky save bar that appears when changes are detected."},{"src":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/screenshot-4.png?rev=3580187","caption":"<strong>Bulk regenerate<\/strong> \u2014 scope dropdown with real-time count, dry-run with storage and time estimation, embedded sample test with before\/after grid."},{"src":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/screenshot-5.png?rev=3580187","caption":"<strong>Health<\/strong> \u2014 full diagnostic: active engine + codec capabilities matrix, DB tables with row count, applied migrations, CDN edge (Cloudflare Polish\/Mirage + Image Transformations detection)."},{"src":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/screenshot-6.png?rev=3580187","caption":"<strong>Clean library<\/strong> (Pro) \u2014 orphan image audit with Bricks Builder + wp_termmeta + WooCommerce shortcodes detection. Trash mode with typed confirmation and audit log."},{"src":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/screenshot-7.png?rev=3580187","caption":"<strong>Catalog Watch<\/strong> (Pro) \u2014 daily cron that detects ghost derivatives, orphan files, and products with broken images. Auto-heal with dry-run preview before applying."},{"src":"https:\/\/ps.w.org\/australcode-uniform-images\/assets\/screenshot-8.png?rev=3580030","caption":"<strong>AI Alt Text<\/strong> (Pro, BYOK) \u2014 generate accessible alt text per image via OpenAI or Anthropic Vision, enriched with the WooCommerce product title, category and brand. Your own key, no markup."}],"raw_content":"<!--section=description-->\n<p><strong>Australcode Uniform Images<\/strong> 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 \u2014 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 <code>&lt;picture&gt;<\/code> element.<\/p>\n\n<h4>Key differentiators<\/h4>\n\n<ul>\n<li><strong>No accidental crops<\/strong> \u2014 the entire product fits inside the thumbnail, always. The plugin pads to a uniform canvas instead of guessing where to crop.<\/li>\n<li><strong>Real <code>&lt;picture&gt;<\/code> markup<\/strong> \u2014 multi-source with AVIF + WebP + JPEG fallback. <strong>Survives any page cache<\/strong> (LiteSpeed, WP Rocket, Cloudflare APO, W3 Total Cache) because it does not use <code>Vary: Accept<\/code>. The browser picks the optimal format; the cache serves HTML without negotiation.<\/li>\n<li><strong>4-tier quality preset<\/strong> \u2014 Maximum \/ High \/ Standard \/ Economy with per-format values calibrated (e.g. Standard = AVIF Q60, WebP Q82, JPEG Q85 \u2014 visually indistinguishable from the original at half the size).<\/li>\n<li><strong>HPOS-ready from day one<\/strong> \u2014 declares <code>custom_order_tables<\/code> and <code>cart_checkout_blocks<\/code> compatibility without any setup.<\/li>\n<li><strong>Cloudflare Image Transformations (CIT)<\/strong> \u2014 optional integration to serve via Cloudflare edge (<code>\/cdn-cgi\/image\/format=auto<\/code>) 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.<\/li>\n<\/ul>\n\n<h4>Free (no license required)<\/h4>\n\n<ul>\n<li><strong>Bulk regenerate with Action Scheduler<\/strong> \u2014 async processing resumable after worker death, error classification (<code>oom<\/code>, <code>missing_original<\/code>, <code>engine_failed<\/code>, <code>fs_permission<\/code>), scope filters (<code>auto<\/code> = products only based on Settings; <code>all-used<\/code> = every image referenced in posts\/products\/Bricks templates\/terms).<\/li>\n<li><strong>Embedded sample test<\/strong> \u2014 processes 1-5 images on demand and shows the before\/after grid with bytes and % savings. Available on the <strong>Settings<\/strong> page (\"Quick preview\") and on <strong>Bulk regenerate<\/strong> (\"Generate sample\").<\/li>\n<li><strong>Health page with CDN detection<\/strong> \u2014 engine diagnostics, encoders, filesystem permissions, detected competing plugins (Smush\/EWWW\/ShortPixel\/Imagify), Cloudflare Polish status (alerts if active \u2014 incompatible with the plugin's AVIF\/WebP), Image Prioritizer (Performance Lab) status with automatic detection.<\/li>\n<li><strong>Extreme-padding detection<\/strong> \u2014 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.<\/li>\n<li><strong>WP-CLI \u2014 9 commands<\/strong> \u2014 7 free: <code>wp acimg health<\/code>, <code>stats<\/code>, <code>regenerate<\/code>, <code>derivatives &lt;id&gt;<\/code>, <code>purge-cache<\/code> (orphans; <code>--stale<\/code>\/<code>--all<\/code> require Pro), <code>restore-originals<\/code>, <code>migrate-from-sir<\/code>. 2 Pro: <code>wp acimg doctor<\/code> (extended diagnostics) and <code>wp acimg reset<\/code> (full state reset).<\/li>\n<\/ul>\n\n<h4>Pro (license required)<\/h4>\n\n<ul>\n<li><strong>Cloudflare Image Transformations (CIT) delivery<\/strong> \u2014 emits <code>&lt;img&gt;<\/code> with CIT URLs (<code>\/cdn-cgi\/image\/format=auto<\/code>) instead of local derivatives when CIT is enabled on your zone. Defensive automatic fallback to the normal path if CIT is unavailable.<\/li>\n<li><strong>Media Library audit + cleanup<\/strong> \u2014 orphan image detector that understands <strong>Bricks Builder<\/strong> (PHP serialize), <code>wp_termmeta<\/code>, WooCommerce shortcodes, custom meta. Trash mode with typed confirmation, immutable audit log, and an <code>untrash<\/code> endpoint for rollback.<\/li>\n<li><strong>Image Health Monitor<\/strong> \u2014 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.<\/li>\n<li><strong>AI Alt Text BYOK<\/strong> \u2014 alt text generation per attachment via OpenAI Vision (<code>gpt-4o-mini<\/code>) or Anthropic Vision (<code>claude-haiku-4-5<\/code>). Bring Your Own Key (no Merchant of Record over AI costs). Context enrichment with WooCommerce product title + category + brand.<\/li>\n<li><strong>Catalog Watch + Auto-Heal<\/strong> \u2014 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.<\/li>\n<li><strong>Multi-Site Manager<\/strong> (Agency) \u2014 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 \u2194 wp-admin communication via native REST.<\/li>\n<li><strong>CIT Cost Analyzer<\/strong> \u2014 daily pull from Cloudflare GraphQL Analytics API. MTD cost + monthly projection + peak day to identify spikes. BYO API token (CF authenticates directly).<\/li>\n<li><strong>Per-aspect-ratio override<\/strong> \u2014 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 <em>fix<\/em> for the extreme-padding the free Dashboard flags below.)<\/li>\n<\/ul>\n\n<h4>Integration with other plugins<\/h4>\n\n<ul>\n<li><strong>Image Prioritizer \/ Performance Lab<\/strong> \u2014 Australcode Uniform Images detects <code>fetchpriority=\"high\"<\/code> and propagates correct loading\/decoding to the final <code>&lt;picture&gt;<\/code>. Native LCP optimization.<\/li>\n<li><strong>Bricks Builder<\/strong> \u2014 supports <code>wp_get_attachment_image<\/code> and optional output buffer rewriter for themes\/page builders that bypass that filter.<\/li>\n<li><strong>WP Rocket \/ a3 Lazy Load<\/strong> \u2014 compatible with <code>data-src<\/code>\/<code>data-sizes<\/code> lazy loaders (reads both if present).<\/li>\n<\/ul>\n\n<h4>v1.0 non-goals<\/h4>\n\n<ul>\n<li><strong>Smart crop<\/strong> \u2014 would break the \"no cropping\" promise. If you need that, this plugin is not for you.<\/li>\n<li><strong>SaaS-only \/ phone home<\/strong> \u2014 the plugin is 100% local. All optimization happens on your own server.<\/li>\n<li><strong>JPEG XL<\/strong> \u2014 format still immature in browsers. We will reevaluate in 2027.<\/li>\n<\/ul>\n\n<h4>Why this approach<\/h4>\n\n<ul>\n<li><strong>Padded canvas, never cropped<\/strong> \u2014 every thumbnail pads the product onto a uniform canvas, so the full product is always visible. No subject-guessing, no accidental crops.<\/li>\n<li><strong><code>&lt;picture&gt;<\/code> element, cache-safe by design<\/strong> \u2014 AVIF + WebP + JPEG fallback served without <code>Vary: Accept<\/code>, 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.<\/li>\n<li><strong>AVIF + WebP + JPEG, all free<\/strong> \u2014 modern formats are part of the free core, not a paid add-on.<\/li>\n<li><strong>Unlimited bulk on Free<\/strong> \u2014 regenerate your whole catalog with no image cap and no monthly credit quota.<\/li>\n<li><strong>100% local<\/strong> \u2014 all processing happens on your own server. No SaaS, no phone-home, your images never leave the site.<\/li>\n<li><strong>Built for WooCommerce grids<\/strong> \u2014 reads <code>wp_get_registered_image_subsizes()<\/code> and respects the WC thumbnail-cropping setting, so it targets exactly the product sizes your theme uses.<\/li>\n<\/ul>\n\n<p>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.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to external services <strong>only when you explicitly enable or\nuse the corresponding optional feature<\/strong>. The free, core functionality (uniform\nimages, AVIF\/WebP\/JPEG <code>&lt;picture&gt;<\/code>, bulk regenerate, health) runs <strong>100% on your\nown server and contacts no external service<\/strong>.<\/p>\n\n<h4>Freemius (account, licensing &amp; secure checkout)<\/h4>\n\n<p>Australcode uses Freemius as its billing and licensing platform (Freemius is the\nMerchant of Record for Pro purchases). Connecting to Freemius is <strong>optional<\/strong>: on\nactivation you can click <strong>\"Skip\"<\/strong> and the plugin stays fully functional without\never contacting Freemius.<\/p>\n\n<ul>\n<li>If you <strong>opt in<\/strong> (free or Pro), the plugin sends your <strong>admin email<\/strong>, <strong>site\nURL<\/strong> and basic <strong>environment data<\/strong> (WordPress, PHP and plugin versions) to the\nFreemius API (host <code>api.freemius.com<\/code>, path <code>\/v1\/<\/code>) to create your account and\ncheck for updates.<\/li>\n<li>If you <strong>activate a Pro license<\/strong>, the plugin sends your <strong>license key<\/strong> and\n<strong>site domain<\/strong> to Freemius to validate the license and enforce the per-plan\nsite limit. The license is re-validated periodically.<\/li>\n<li>Purchases and license management happen on Freemius-hosted pages\n(hosts <code>freemius.com<\/code>, <code>users.freemius.com<\/code>).<\/li>\n<\/ul>\n\n<p>No data is sent to Freemius if you skip the opt-in and do not enter a license key.<\/p>\n\n<ul>\n<li>Terms of Service: https:\/\/freemius.com\/terms\/<\/li>\n<li>Privacy Policy: https:\/\/freemius.com\/privacy\/<\/li>\n<\/ul>\n\n<h4>OpenAI \/ Anthropic (AI Alt Text \u2014 Pro, Bring Your Own Key)<\/h4>\n\n<p>If you enable <strong>AI Alt Text<\/strong> and provide your own API key, the plugin sends the\n<strong>image<\/strong> (as a base64 data URI) plus the related <strong>WooCommerce product context<\/strong>\n(title, category, brand) to the provider you choose, to generate alt text:<\/p>\n\n<ul>\n<li>OpenAI Vision (<code>gpt-4o-mini<\/code>) \u2014 host <code>api.openai.com<\/code>, path <code>\/v1\/chat\/completions<\/code>\n\n<ul>\n<li>Terms: https:\/\/openai.com\/policies\/terms-of-use<\/li>\n<li>Privacy: https:\/\/openai.com\/policies\/privacy-policy<\/li>\n<\/ul><\/li>\n<li>Anthropic Vision (<code>claude-haiku-4-5<\/code>) \u2014 host <code>api.anthropic.com<\/code>, path <code>\/v1\/messages<\/code>\n\n<ul>\n<li>Terms: https:\/\/www.anthropic.com\/legal\/consumer-terms<\/li>\n<li>Privacy: https:\/\/www.anthropic.com\/legal\/privacy<\/li>\n<\/ul><\/li>\n<\/ul>\n\n<p>This runs only when you trigger alt text generation and only with the key you\nsupply. The plugin is not a Merchant of Record for these AI costs (BYOK).<\/p>\n\n<h4>Cloudflare (Image Transformations + Cost Analyzer \u2014 Pro)<\/h4>\n\n<p>If you enable <strong>Cloudflare Image Transformations (CIT)<\/strong>, image URLs of your own\nsite are served through Cloudflare's edge (<code>\/cdn-cgi\/image\/...<\/code>) so Cloudflare can\ntransform them on-demand. If you enable the <strong>CIT Cost Analyzer<\/strong>, the plugin\nqueries the Cloudflare GraphQL Analytics API\n(host <code>api.cloudflare.com<\/code>, path <code>\/client\/v4\/graphql<\/code>) with the API token <strong>you provide<\/strong>\nand your zone identifier, to report usage and cost. The plugin also performs a\n    HEAD request to one of <strong>your own<\/strong> derivative URLs to detect whether CIT and\nCloudflare Polish are active on your zone (no third-party data is sent in that\ndetection).<\/p>\n\n<ul>\n<li>Terms of Service: https:\/\/www.cloudflare.com\/terms\/<\/li>\n<li>Privacy Policy: https:\/\/www.cloudflare.com\/privacypolicy\/<\/li>\n<\/ul>\n\n<!--section=installation-->\n<h4>Via WordPress Admin (recommended)<\/h4>\n\n<ol>\n<li>Go to <strong>Plugins \u2192 Add new<\/strong> in your WP admin, search for \"Australcode Uniform Images\" and click Install + Activate.<\/li>\n<li>Navigate to the new top-level menu <strong>Australcode Image \u2192 Settings<\/strong> and choose your quality preset (default Standard works well for most cases).<\/li>\n<li>Go to <strong>Australcode Image \u2192 Bulk regenerate<\/strong>, run a Sample Test with one product to validate visually, then click \"Start bulk\" to process the full catalog.<\/li>\n<\/ol>\n\n<h4>Via WP-CLI<\/h4>\n\n<pre><code>`\n<\/code><\/pre>\n\n<p>wp plugin install australcode-uniform-images --activate\nwp acimg health           # verify everything is OK\nwp acimg regenerate       # bulk dry-run\nwp acimg regenerate --start --yes   # starts bulk in the background\nwp acimg reset --yes      # Pro: wipe all plugin state (tables, options, dirs) without deactivating\n    `<\/p>\n\n<p>The <code>wp acimg reset<\/code> command (Pro) clears every persisted artifact \u2014 the 6 custom tables, options, post meta, transients and derivative directories \u2014 without deactivating the plugin. It's destructive and defaults to an interactive confirm; pass <code>--yes<\/code> to skip it. Useful to start from a clean slate when re-testing settings or migrating.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20it%20compatible%20with%20woocommerce%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Is it compatible with WooCommerce HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. Compatibility with <code>custom_order_tables<\/code> and <code>cart_checkout_blocks<\/code> is declared from day one via <code>before_woocommerce_init<\/code>. No manual configuration required.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20cloudflare%3F\"><h3>Does it work with Cloudflare?<\/h3><\/dt>\n<dd><p>Yes, and well. The plugin emits <code>&lt;picture&gt;<\/code> with <code>&lt;source&gt;<\/code> per MIME type \u2014 <strong>it survives Cloudflare APO<\/strong> and any page cache perfectly because it does NOT use <code>Vary: Accept<\/code> (which would break caching).<\/p>\n\n<p>If you have <strong>Cloudflare Pro+<\/strong>, you can enable <strong>Image Transformations<\/strong> from Settings \u2192 CDN edge. The plugin automatically detects whether CIT is available on your zone and emits <code>\/cdn-cgi\/image\/<\/code> URLs that CF transforms on-demand with <code>format=auto<\/code>.<\/p>\n\n<p><strong>Caution with Cloudflare Polish<\/strong>: if active, it re-compresses the AVIF\/WebP that the plugin already optimized \u2014 double compression equals visual artifacts. The plugin detects this on the Health page and alerts you with an admin notice. Recommendation: disable Polish, keep APO.<\/p><\/dd>\n<dt id=\"which%20image%20engine%20does%20it%20use%3F\"><h3>Which image engine does it use?<\/h3><\/dt>\n<dd><p><strong>Imagick<\/strong> (preferred) with <code>libheif<\/code> for AVIF. <strong>GD<\/strong> as fallback. <strong>libvips<\/strong> is wired in the code but requires bundled binaries (not included in v0.x \u2014 future sprint). The active engine and its capabilities (read\/write per format) appear on <strong>Health \u2192 Image engines<\/strong>.<\/p><\/dd>\n<dt id=\"do%20i%20need%20anything%20special%20for%20avif%3F\"><h3>Do I need anything special for AVIF?<\/h3><\/dt>\n<dd><p>Imagick compiled with <code>libheif<\/code> (common on modern hosts: Kinsta, WP Engine, SiteGround, recent Cloudways). If Imagick does not support AVIF, the plugin still emits WebP + JPEG and the Health page reports the limitation. <strong>You do not get stuck without anything<\/strong> \u2014 you just lose the most efficient format.<\/p><\/dd>\n<dt id=\"how%20much%20storage%20does%20it%20use%3F\"><h3>How much storage does it use?<\/h3><\/dt>\n<dd><p>Estimate: ~700 KB of derivatives on average per original image at Standard preset (varies a lot by content type \u2014 product photos with a uniform background compress better). For a catalog of 1,000 products with one image each, that's ~700 MB of derivatives. By default the plugin <strong>never modifies your originals<\/strong> \u2014 derivatives are separate files, so you need space for original + derivatives. The only exception is the optional \"apply trim to original\" setting (off by default), which backs up the pristine file first and is reversible with <code>wp acimg restore-originals<\/code>.<\/p><\/dd>\n<dt id=\"how%20do%20i%20regenerate%20after%20changing%20settings%3F\"><h3>How do I regenerate after changing settings?<\/h3><\/dt>\n<dd><p>Change settings on <strong>Australcode Image \u2192 Settings<\/strong>, save (the plugin shows a modal warning you that existing derivatives are invalidated), and then go to <strong>Bulk regenerate<\/strong> or run <code>wp acimg regenerate --start --yes<\/code>. The plugin keeps serving the old derivatives until regeneration completes \u2014 <strong>zero visual downtime<\/strong>.<\/p><\/dd>\n<dt id=\"conflicts%20with%20smush%20%2F%20ewww%20%2F%20shortpixel%20%2F%20imagify%3F\"><h3>Conflicts with Smush \/ EWWW \/ ShortPixel \/ Imagify?<\/h3><\/dt>\n<dd><p>Yes, <strong>disable those plugins<\/strong> before installing Australcode Uniform Images. The Health \u2192 Doctor page detects them and alerts you. The typical conflict is that those plugins also hook into <code>wp_get_attachment_image<\/code> and rewrite the HTML \u2014 the output ends up inconsistent.<\/p><\/dd>\n<dt id=\"does%20it%20have%20wp-cli%3F\"><h3>Does it have WP-CLI?<\/h3><\/dt>\n<dd><p>Yes, 9 commands under <code>wp acimg &lt;subcommand&gt;<\/code>. Seven are free: health (CI smoke test), stats, regenerate, derivatives , purge-cache, restore-originals, and migrate-from-sir. Two require a Pro license: doctor (extended diagnostics) and reset (resets all persisted state without deactivating). Each command supports <code>--format=json<\/code>. <code>wp help acimg<\/code> lists them all.<\/p><\/dd>\n<dt id=\"how%20do%20i%20report%20a%20bug%20or%20request%20a%20feature%3F\"><h3>How do I report a bug or request a feature?<\/h3><\/dt>\n<dd><p>Open a support thread in the WordPress.org plugin support forum (linked from the plugin page sidebar). For Pro license-related issues, contact support@australcode.io.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.40.0<\/h4>\n\n<ul>\n<li><strong>New: \"Heavily padded\" detection (free).<\/strong> The Dashboard now flags product photos that get squared with a lot of empty canvas \u2014 panoramic or very tall images \u2014 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.<\/li>\n<li><strong>Admin theme now fully matches the Australcode family.<\/strong> 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) \u2014 consistent chrome across every Australcode plugin.<\/li>\n<li><strong>Polish:<\/strong> 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.<\/li>\n<li>No data or settings changes \u2014 safe in-place upgrade.<\/li>\n<\/ul>\n\n<h4>0.39.1<\/h4>\n\n<ul>\n<li><strong>New \"Upgrade\" page<\/strong> replaces the separate \"Family\" submenu \u2014 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).<\/li>\n<li><strong>Refined menu icon<\/strong> \u2014 the sidebar now shows the product glyph (the 2\u00d72 uniform-grid mark), matching the plugin icon for a consistent identity.<\/li>\n<li><strong>Completed Spanish translations<\/strong> for the Pro weekly health digest email, the health severity labels, and the Cloudflare cost analyzer placeholders.<\/li>\n<li><strong>Housekeeping:<\/strong> SPDX license identifier in the headers, refreshed static-analysis tooling (PHPStan 2.x), and documentation tidy-up. No behavior changes for the free version.<\/li>\n<\/ul>\n\n<h4>0.39.0<\/h4>\n\n<ul>\n<li><strong>New look: the Australcode admin theme.<\/strong> Every plugin page now ships the Australcode Admin Kit \u2014 same typography, spacing and the new green accent across the whole plugin family. No settings change; purely visual.<\/li>\n<li><strong>English-first interface.<\/strong> The admin UI source language is now English, with complete Spanish translations bundled (<code>es_ES<\/code> and <code>es_CL<\/code>, 100% coverage). WordPress picks your site language automatically.<\/li>\n<li><strong>New \"Family\" page<\/strong> \u2014 discover the other Australcode plugins, see which ones you already run, and install the free ones in one click. No ads, no admin notices \u2014 it lives quietly as the last submenu.<\/li>\n<li><strong>Fixed:<\/strong> PHP notices when the premium and free builds are swapped in place (constant guards).<\/li>\n<li><strong>Fixed:<\/strong> the WooCommerce cropping how-to path in Settings was untranslatable.<\/li>\n<\/ul>\n\n<h4>0.38.0<\/h4>\n\n<ul>\n<li><strong>Licensing and checkout moved to Freemius.<\/strong> Pro licensing, purchases and the in-plugin account now run through Freemius \u2014 our new billing platform and Merchant of Record \u2014 replacing the previous provider. Image processing, bulk regeneration and delivery are unchanged; this release only swaps the billing\/licensing layer.<\/li>\n<li><strong>Privacy-first, optional opt-in.<\/strong> The connection screen is fully WordPress.org-compliant: clicking \"Skip\" keeps every free feature working and sends no data to any external service.<\/li>\n<li><strong>The free version stays 100% functional<\/strong> with no account required.<\/li>\n<li><strong>Updated the \"External services\" disclosure<\/strong> in this readme to reflect the move from Lemon Squeezy to Freemius.<\/li>\n<\/ul>\n\n<h4>0.37.0<\/h4>\n\n<ul>\n<li><strong><code>wp acimg migrate-from-sir<\/code> is now free<\/strong> \u2014 import your Smart Image Resize settings (background color, trim, sizes) into Australcode with one command. Makes switching effortless.<\/li>\n<li><strong>New output-format controls (free)<\/strong> \u2014 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.<\/li>\n<li><strong>Catalog Watch repair now runs in the background<\/strong> \u2014 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)<\/li>\n<li><strong>Cleanup, Multi-Site and CIT Cost pages redesigned<\/strong> \u2014 Cleanup is now a 3-step wizard (Audit \u2192 Review \u2192 Move), Multi-Site has a guided empty state, and CIT Cost leads with a budget KPI + projection.<\/li>\n<li><strong>Fixed<\/strong> \u2014 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.<\/li>\n<\/ul>\n\n<h4>0.36.1<\/h4>\n\n<ul>\n<li>Page-builder coverage extended to Beaver Builder (<code>_fl_builder_data<\/code>) and Oxygen (<code>ct_builder_shortcodes<\/code>). 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 <code>post_content<\/code>.<\/li>\n<\/ul>\n\n<h4>0.36.0<\/h4>\n\n<ul>\n<li>Page-builder coverage: Bulk Regenerate (\"All used images\" scope) now detects images placed directly in Bricks and Elementor templates \u2014 they live in the builder's own storage (<code>_bricks_page_content<\/code>, <code>_elementor_data<\/code>), outside <code>post_content<\/code>, so previous versions never found or optimized them. Divi was already covered (it stores in <code>post_content<\/code>). The frontend delivery already handled any <code>&lt;img&gt;<\/code> from any builder; this closes the generation side.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>0.35.0<\/h4>\n\n<ul>\n<li>New (opt-in): auto-detect transparency. When enabled, images whose original has significant transparency (logos, cut-out products with shadows) keep their alpha channel \u2014 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 \u2192 Formats &amp; quality \u2192 Transparency.<\/li>\n<\/ul>\n\n<h4>0.34.1<\/h4>\n\n<ul>\n<li>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) \u2014 plus the previously localized Catalog Watch, Multi-Site, CIT Cost Analyzer and settings preview \u2014 now routes through WordPress translations instead of hardcoded strings.<\/li>\n<li>The English (en_US) translation bundle is now 100% complete.<\/li>\n<li>No behavior changes: every string keeps its original fallback until the site's active language provides a translation.<\/li>\n<\/ul>\n\n<h4>0.34.0<\/h4>\n\n<ul>\n<li>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.<\/li>\n<li>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.<\/li>\n<li>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.<\/li>\n<\/ul>\n\n<h4>0.33.2<\/h4>\n\n<ul>\n<li>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.<\/li>\n<\/ul>\n\n<h4>0.33.1<\/h4>\n\n<p>WP.org re-submission compliance + listing polish. No user-facing behavior changes \u2014 safe in-place upgrade.<\/p>\n\n<ul>\n<li><strong>External services URLs no longer pingable as 404<\/strong> \u2014 the readme's \"External services\" section referenced API endpoints (<code>api.lemonsqueezy.com<\/code>, <code>api.openai.com<\/code>, <code>api.anthropic.com<\/code>, <code>api.cloudflare.com<\/code>) 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.<\/li>\n<li><strong>Explicit output-buffer close<\/strong> \u2014 <code>OutputBufferHook<\/code> (opt-in feature, off by default) now closes its <code>ob_start()<\/code> buffer explicitly on <code>shutdown<\/code>, guarded by <code>ob_get_level()<\/code>. Same rewritten output, paired open\/close as WP.org guidelines expect. WP 6.5+ compatible.<\/li>\n<li><strong>Banners + branding<\/strong> \u2014 re-generated WP.org banners with the current name (Australcode Uniform Images) and version; renamed the last legacy global variable in the bootstrap file.<\/li>\n<li><strong>Listing polish<\/strong> \u2014 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.<\/li>\n<\/ul>\n\n<p>Internal: 296\/296 unit tests passing.<\/p>\n\n<p>Full history of older versions (0.33.0 and earlier) is preserved in the project's archive \u2014 contact support@australcode.io if you need detail on a specific legacy version.<\/p>","raw_excerpt":"Make WooCommerce product images the same size without cropping. Unlimited bulk, free AVIF + WebP, and cache-safe delivery. No catalog limit.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/315190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=315190"}],"author":[{"embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/australcode"}],"wp:attachment":[{"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=315190"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=315190"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=315190"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=315190"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=315190"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/cn.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=315190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}