{"id":326811,"date":"2026-06-21T15:41:21","date_gmt":"2026-06-21T15:41:21","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/pipe9-media-optimizer\/"},"modified":"2026-06-21T15:41:08","modified_gmt":"2026-06-21T15:41:08","slug":"pipe9-media-optimizer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/pipe9-media-optimizer\/","author":23504778,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.5.2","stable_tag":"1.5.2","tested":"7.0","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"Pipe9 Media Optimizer","header_author":"Pipe9","header_description":"Automatically convert uploaded images to WebP \u2014 smaller, faster, lossless. Zero-config serving via .htaccess, HTML picture, or PHP passthru.","assets_banners_color":"","last_updated":"2026-06-21 15:41:08","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/pipe9.uk","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":38,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.5.2":{"tag":"1.5.2","author":"altunyurt","date":"2026-06-21 15:41:08"}},"upgrade_notice":{"1.5.2":"<p>Bug fix: prevents <code>.webp.webp<\/code> double-extension files and duplicate conversions when WordPress core also converts images to WebP during upload.<\/p>","1.5.1":"<p>Internal refactor: option prefixes are now hardcoded in all register_setting() calls. No functional changes.<\/p>","1.5.0":"<p>Animated GIF \u2192 WebP conversion is now free! Also includes simplified theme image serving, external JS files, and bulk convert UI improvements. Recommended update for all users.<\/p>","1.4.3":"<p>Fixes WebP quality artifacts, adds cwebp binary support, and fixes bulk convert pagination. Recommended update for all users.<\/p>"},"ratings":[],"assets_icons":{"icon-1254x1254.png":{"filename":"icon-1254x1254.png","revision":3581012,"resolution":"1254x1254","location":"assets","locale":"","width":1254,"height":1254}},"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.5.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3581012,"resolution":"1","location":"assets","locale":"","width":1439,"height":823},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3581012,"resolution":"2","location":"assets","locale":"","width":1439,"height":1163},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3581012,"resolution":"3","location":"assets","locale":"","width":1439,"height":2361}},"screenshots":{"1":"Plugin settings page with serving strategy selection","2":"Media Library with format column and row actions","3":"Bulk convert interface with progress bar"}},"plugin_section":[],"plugin_tags":[163,84,187,15376],"plugin_category":[50,52],"plugin_contributors":[268239],"plugin_business_model":[],"class_list":["post-326811","plugin","type-plugin","status-publish","hentry","plugin_tags-images","plugin_tags-media","plugin_tags-optimization","plugin_tags-webp","plugin_category-media","plugin_category-performance","plugin_contributors-altunyurt","plugin_committers-altunyurt"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/pipe9-media-optimizer.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/pipe9-media-optimizer\/assets\/screenshot-1.png?rev=3581012","caption":"Plugin settings page with serving strategy selection"},{"src":"https:\/\/ps.w.org\/pipe9-media-optimizer\/assets\/screenshot-2.png?rev=3581012","caption":"Media Library with format column and row actions"},{"src":"https:\/\/ps.w.org\/pipe9-media-optimizer\/assets\/screenshot-3.png?rev=3581012","caption":"Bulk convert interface with progress bar"}],"raw_content":"<!--section=description-->\n<p>Pipe9 Media Optimizer converts your uploaded images to WebP automatically \u2014 no batch jobs, no manual steps, no complex configuration. When a browser supports WebP (all modern browsers do), the optimized version is served instead of the original, reducing page weight by 25-35% on average with zero visible quality loss.<\/p>\n\n<p><strong>How it works:<\/strong><\/p>\n\n<p>When you upload an image to WordPress, the plugin creates a WebP copy and stores it alongside the original in <code>uploads\/pipe9-media-optimizer\/webp\/<\/code>. When a visitor loads a page, the plugin detects browser support via the <code>Accept<\/code> header and serves the WebP version \u2014 either through server-level rewrite rules, HTML markup, or a lightweight PHP endpoint.<\/p>\n\n<p><strong>Key features:<\/strong><\/p>\n\n<ul>\n<li><strong>Automatic conversion<\/strong> on upload \u2014 JPEG, PNG, and static GIF images are converted to WebP as soon as they hit the media library. Animated GIFs are converted to animated WebP via gif2webp or Imagick (previously a Pro feature \u2014 now free!)<\/li>\n<li><strong>Six serving strategies<\/strong>: Apache rewrite rules (zero PHP cost \u2014 the fastest option), HTML <code>&lt;picture&gt;<\/code> wrapping (single buffer scan per page), Nginx config snippet (paste and go \u2014 includes theme image rules), PHP passthru endpoint (works on any server), WP Engine optimized mode, or conversion-only mode (no serving changes)<\/li>\n<li><strong>Theme image conversion<\/strong> \u2014 scans and converts images inside active theme directories<\/li>\n<li><strong>Bulk conversion<\/strong> \u2014 convert your entire existing media library with one click, with a real-time progress bar<\/li>\n<li><strong>Media Library integration<\/strong> \u2014 each image gets a format column showing WebP status, with per-image convert and remove actions<\/li>\n<li><strong>Memory guard<\/strong> \u2014 automatically detects when an image is too large to convert without blowing through PHP's memory limit, and skips it gracefully<\/li>\n<li><strong>Pluggable architecture<\/strong> \u2014 modules register themselves via WordPress hooks; the Pro add-on adds AVIF and animated format support through the same system<\/li>\n<\/ul>\n\n<p><strong>Pro add-on<\/strong> (separate purchase from pipe9.uk) adds:\n* Static AVIF conversion (JPEG\/PNG\/GIF \u2192 AVIF) \u2014 even smaller files than WebP\n* Animated AVIF conversion (animated GIF \u2192 animated AVIF via ffmpeg)<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>pipe9-media-optimizer<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the Plugins screen<\/li>\n<li>Go to Settings \u2192 Pipe9 Media Optimizer<\/li>\n<li>Choose your serving strategy (Auto-detect works for most setups)<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20image%20formats%20are%20converted%3F\"><h3>What image formats are converted?<\/h3><\/dt>\n<dd><p>JPEG, PNG, and static GIF images are automatically converted to WebP. Animated GIFs are now also converted to animated WebP in the free version (via gif2webp binary or Imagick). For animated AVIF conversion, use the Pro add-on.<\/p><\/dd>\n<dt id=\"how%20much%20will%20this%20reduce%20my%20image%20sizes%3F\"><h3>How much will this reduce my image sizes?<\/h3><\/dt>\n<dd><p>Typical savings are at least 25-35% compared to JPEG, and at least 15-25% compared to PNG. Lossy WebP at quality 80 is visually indistinguishable from the original JPEG but substantially smaller. Lossless WebP preserves PNG transparency with smaller file sizes.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20my%20hosting%20provider%3F\"><h3>Does this work with my hosting provider?<\/h3><\/dt>\n<dd><p>Yes. Apache rewrite mode generates static <code>.htaccess<\/code> rules with zero PHP overhead \u2014 it's the fastest option. Nginx and WP Engine modes show ready-to-paste config snippets. A PHP passthru mode works on any server, including locked-down hosts that don't allow <code>.htaccess<\/code> overrides.<\/p><\/dd>\n<dt id=\"will%20this%20affect%20my%20existing%20images%3F\"><h3>Will this affect my existing images?<\/h3><\/dt>\n<dd><p>No. Only newly uploaded images are converted automatically. Use the Bulk Convert tool on the settings page to convert your existing media library. You can also convert existing images one by one in the media listing section.<\/p><\/dd>\n<dt id=\"how%20do%20i%20verify%20it%27s%20working%3F\"><h3>How do I verify it's working?<\/h3><\/dt>\n<dd><p>Check the \"Formats\" column in Media Library list view \u2014 it shows which WebP copies exist. Or use browser DevTools to inspect response headers (look for <code>Content-Type: image\/webp<\/code>).<\/p><\/dd>\n<dt id=\"does%20the%20pro%20add-on%20require%20a%20separate%20installation%3F\"><h3>Does the Pro add-on require a separate installation?<\/h3><\/dt>\n<dd><p>Yes, the Pro add-on is a separate plugin that requires Pipe9 Media Optimizer (free) to be installed and active.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Fixed double <code>.webp.webp<\/code> bug \u2014 <code>on_media_edited()<\/code> now checks MIME type via <code>get_post_mime_type()<\/code> instead of file extension, preventing re-conversion of images already converted to WebP by WordPress core<\/li>\n<li>Intermediate sizes loop now checks <code>$size['mime-type']<\/code> to skip WebP thumbnails from WordPress core conversion<\/li>\n<li>Upload pipeline switched from hardcoded extension whitelist to MIME-based detection (<code>image\/*<\/code> except <code>image\/webp<\/code>) \u2014 future-proof for any image source format<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Refactored option prefix handling \u2014 removed dynamic <code>$prefix<\/code>\/<code>$option_prefix<\/code> variables from all <code>register_setting()<\/code> calls, replaced with hardcoded module prefixes (e.g. <code>p9mo_webp<\/code>, <code>p9mo_avif<\/code>, <code>p9mo_animated_avif<\/code>)<\/li>\n<li>Removed <code>get_option_prefix()<\/code> method and <code>option_prefix<\/code> format key<\/li>\n<li>Removed <code>$prefix<\/code> parameter from <code>register_extra_settings()<\/code> in all modules<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li><strong>Animated GIF \u2192 WebP now in free version<\/strong> \u2014 animated GIFs are converted to animated WebP inline via gif2webp binary (preferred) or Imagick coalesceImages() fallback (previously required the Pro add-on)<\/li>\n<li>Theme images now served via passthru\/picture instead of themes .htaccess \u2014 simpler, fewer rewrite rules, works on all server types<\/li>\n<li>Nginx config output now includes theme image location blocks with try_files fallback<\/li>\n<li>Extracted all inline JS to external files (media-actions.js, serving-settings.js, bulk-convert.js) \u2014 ~700 lines of PHP-built JS eliminated<\/li>\n<li>Bulk convert UI consolidated into one parameterized JS component (replaces 4 near-duplicate per-module implementations)<\/li>\n<li>Resolved WordPress.org and PluginCheck review issues (translators comments, option prefix uniqueness, ABSPATH guards, heredoc elimination)<\/li>\n<\/ul>\n\n<h4>1.4.3<\/h4>\n\n<ul>\n<li>cwebp binary support \u2014 Google's command-line WebP encoder is now auto-detected and preferred over Imagick\/GD for artifact-free high-quality output<\/li>\n<li>Fixed WebP block artifacts ('dots', 'crunchy' look) at high quality settings \u2014 Imagick now uses webp:method=6, webp:auto-filter, webp:preprocessing=2 for smooth gradients<\/li>\n<li>Fixed bulk convert pagination hole \u2014 no longer stops when page 1's posts all have WebP files from previous single converts<\/li>\n<li>Fixed silent conversion failure when exec() is disabled \u2014 detect() now checks P9MO_CAN_EXEC before selecting cwebp<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Theme image conversion \u2014 automatically scans and converts images in active theme directories<\/li>\n<li>Improved output buffer handling \u2014 skips AJAX, cron, and XML-RPC requests<\/li>\n<li>Bug fixes and stability improvements<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Initial release of the refactored plugin with pluggable module architecture<\/li>\n<li>Pro add-on support with AVIF, Animated WebP, and Animated AVIF modules<\/li>\n<\/ul>","raw_excerpt":"Convert images to WebP automatically. Serve via .htaccess rewrites, picture tags, or PHP passthru. Lightweight, zero bloat.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/326811","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=326811"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/altunyurt"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=326811"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=326811"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=326811"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=326811"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=326811"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=326811"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}