{"id":269675,"date":"2026-06-10T21:29:17","date_gmt":"2026-06-10T21:29:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/odr-image-optimizer\/"},"modified":"2026-06-10T23:49:40","modified_gmt":"2026-06-10T23:49:40","slug":"odr-image-optimizer","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/odr-image-optimizer\/","author":23425958,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.12","stable_tag":"1.0.12","tested":"7.0","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"ODR Image Optimizer","header_author":"Danh Le","header_description":"Professional high-performance image suite. Features SOLID-compliant WebP conversion, intelligent LCP preloading, and automated critical path cleanup for a 100\/100 Lighthouse score.","assets_banners_color":"005783","last_updated":"2026-06-10 23:49:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/odanree\/odr-image-optimizer","header_author_uri":"https:\/\/danhle.net","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.10":{"tag":"1.0.10","author":"odanree","date":"2026-06-10 22:18:21"},"1.0.12":{"tag":"1.0.12","author":"odanree","date":"2026-06-10 23:49:40"},"1.0.8":{"tag":"1.0.8","author":"odanree","date":"2026-06-10 21:28:52"},"1.0.9":{"tag":"1.0.9","author":"odanree","date":"2026-06-10 21:49:14"}},"upgrade_notice":{"1.0.12":"<p>Adds directory listing assets (icon, banner, screenshots). No plugin code changes.<\/p>","1.0.11":"<p>Documentation-only release. No plugin code changes.<\/p>","1.0.10":"<p>Documentation-only release. The listing copy on WordPress.org now matches the actual settings UI; no plugin code changes.<\/p>","1.0.8":"<p>Image backups have moved out of the plugin folder. Existing backups continue to work; new optimizations write to wp-content\/uploads\/odr-image-optimizer\/backups\/ for WordPress.org guideline compliance.<\/p>","1.0.0":"<p>Initial release. No upgrades needed.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3568175,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3568175,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3568175,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3568175,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.10","1.0.12","1.0.8","1.0.9"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3568175,"resolution":"1","location":"assets","locale":"","width":1528,"height":1038}},"screenshots":{"1":"Lighthouse audit on the reference test site, desktop: 100 Performance \/ 97 Accessibility \/ 96 Best Practices \/ 100 SEO."}},"plugin_section":[],"plugin_tags":[163,3869,247,794,15376],"plugin_category":[50,52,54],"plugin_contributors":[266575],"plugin_business_model":[],"class_list":["post-269675","plugin","type-plugin","status-publish","hentry","plugin_tags-images","plugin_tags-optimizer","plugin_tags-performance","plugin_tags-speed","plugin_tags-webp","plugin_category-media","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-odanree","plugin_committers-odanree"],"banners":{"banner":"https:\/\/ps.w.org\/odr-image-optimizer\/assets\/banner-772x250.png?rev=3568175","banner_2x":"https:\/\/ps.w.org\/odr-image-optimizer\/assets\/banner-1544x500.png?rev=3568175","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/odr-image-optimizer\/assets\/icon-128x128.png?rev=3568175","icon_2x":"https:\/\/ps.w.org\/odr-image-optimizer\/assets\/icon-256x256.png?rev=3568175","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/odr-image-optimizer\/assets\/screenshot-1.png?rev=3568175","caption":"Lighthouse audit on the reference test site, desktop: 100 Performance \/ 97 Accessibility \/ 96 Best Practices \/ 100 SEO."}],"raw_content":"<!--section=description-->\n<p>ODR Image Optimizer is a professional-grade performance suite built on SOLID principles. Unlike monolithic optimization plugins, ODR focuses on the critical rendering path to eliminate resource discovery delays.<\/p>\n\n<p>Designed to hit a 100\/100 Lighthouse score on mobile under standard configurations. By decoupling image processing from delivery policy, the plugin reduces Largest Contentful Paint (LCP) by optimizing how the browser prioritizes assets.<\/p>\n\n<p><strong>Performance Results (reference test site, mobile Lighthouse):<\/strong>\n- Largest Contentful Paint (LCP): 1.4s (\u2193 1.0s improvement)\n- First Contentful Paint (FCP): 1.0s\n- Total Blocking Time (TBT): 0ms\n- Cumulative Layout Shift (CLS): 0<\/p>\n\n<p>Real-world numbers will vary based on theme, hosting, and content.<\/p>\n\n<h3>Features<\/h3>\n\n<ul>\n<li><strong>Priority Service:<\/strong> Injects <code>fetchpriority=\"high\"<\/code> and <code>&lt;link rel=\"preload\"&gt;<\/code> tags to bypass LCP discovery delay.<\/li>\n<li><strong>WebP Conversion:<\/strong> Automatically converts and serves images in next-gen formats.<\/li>\n<li><strong>Kill Bloat:<\/strong> Toggle to remove heavy WordPress core scripts like the Interactivity API and Emojis.<\/li>\n<li><strong>SOLID Architecture:<\/strong> Developer-friendly, strictly typed, and built for speed.<\/li>\n<li><strong>Unified Dashboard:<\/strong> Manage all performance settings from a single, secure interface.<\/li>\n<li><strong>Zero Configuration:<\/strong> Works out-of-the-box with sensible defaults optimized for Lighthouse 100\/100.<\/li>\n<\/ul>\n\n<h3>Support<\/h3>\n\n<p>For issues, feature requests, or documentation:\n- GitHub: https:\/\/github.com\/odanree\/odr-image-optimizer\n- Support Forum: https:\/\/wordpress.org\/support\/plugin\/odr-image-optimizer\/\n- Documentation: https:\/\/github.com\/odanree\/odr-image-optimizer\/tree\/main\/docs<\/p>\n\n<h3>Credits<\/h3>\n\n<p><strong>Author:<\/strong> Danh Le\n<strong>Website:<\/strong> https:\/\/danhle.net<\/p>\n\n<p>Built with SOLID principles and modern PHP practices. Inspired by the methodologies of enterprise performance optimization.<\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is licensed under the GPLv2 or later. See LICENSE file for details.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>odr-image-optimizer<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Open the new <strong>ODR Image Optimizer<\/strong> entry in the WordPress admin sidebar and configure your toggles under the <strong>Settings<\/strong> submenu.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>No. ODR Image Optimizer adds minimal overhead (~2KB to the page) and removes competing resources. The net result is faster perceived performance and better Lighthouse scores.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20specific%20optimizations%3F\"><h3>Can I disable specific optimizations?<\/h3><\/dt>\n<dd><p>Yes. Open <strong>ODR Image Optimizer \u2192 Settings<\/strong> in the WordPress admin sidebar. From there you can:\n- Pick a compression level (low \/ medium \/ high)\n- Enable or disable WebP conversion\n- Choose a lazy-load strategy (native \/ hybrid \/ off)\n- Toggle auto-optimize on upload\n- Toggle \"Preload Theme Fonts\"\n- Toggle \"Kill Bloat\" (removes the Interactivity API and Emoji scripts)\n- Toggle \"Inline Critical CSS\"<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20other%20image%20plugins%3F\"><h3>Is this compatible with other image plugins?<\/h3><\/dt>\n<dd><p>ODR works best as the only image optimization plugin. Having multiple optimization plugins can cause conflicts. Disable any other image optimization plugins before activating ODR.<\/p><\/dd>\n<dt id=\"what%20wordpress%20versions%20are%20supported%3F\"><h3>What WordPress versions are supported?<\/h3><\/dt>\n<dd><p>WordPress 6.0+. Requires PHP 8.1+.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20re-optimize%20existing%20images%3F\"><h3>Do I need to re-optimize existing images?<\/h3><\/dt>\n<dd><p>No. ODR works on all images, new and existing. Simply activate and the plugin handles optimization automatically.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>Docs: Added directory listing assets \u2014 icon, banner (772x250 + 1544x500 retina), and a desktop Lighthouse audit screenshot.<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li>Docs: Renamed \"Cleanup Service\" to \"Kill Bloat\" in the Features list to match the actual toggle name in the settings UI.<\/li>\n<li>Docs: Softened the \"100\/100 Lighthouse\" claim in the Description so it reads as a design goal rather than a per-install guarantee.<\/li>\n<\/ul>\n\n<h4>1.0.10<\/h4>\n\n<ul>\n<li>Docs: Listing copy accuracy pass \u2014 admin menu location, FAQ toggle list, missing 1.0.1 entry, 1.0.8 upgrade notice, hedged performance numbers.<\/li>\n<li>CI: Deploy workflow resolves the SVN tag from <code>Stable tag:<\/code> in <code>readme.txt<\/code> instead of inferring from the branch ref.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Fix: Move image backups out of the plugin folder. Backups now live under <code>wp-content\/uploads\/odr-image-optimizer\/backups\/&lt;relative path&gt;\/<\/code> instead of a <code>.backups<\/code> directory next to each media file, per WordPress.org plugin guidelines. Reverts of images optimized on older versions still read from the legacy location as a one-time fallback.<\/li>\n<li>Chore: Remove non-permitted distribution files (development sed script, build-artifact zips) from the plugin root.<\/li>\n<li>Chore: Add <code>uninstall.php<\/code> to remove the plugin's options and backup folder on uninstall.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Fix: Move phpcs:ignore for InterpolatedNotPrepared to the SQL string lines; use phpcs:disable\/enable blocks for multi-line queries (class-database, WebpDelivery, DatabaseRepository)<\/li>\n<li>Fix: Remove inline comment text before phpcs:ignore on NonPrefixedConstantFound (odr-image-optimizer.php line 36)<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fix: Add phpcs:ignore for confirmed false positives (ExceptionNotEscaped, NonPrefixedConstant\/HookName, DirectDatabaseQuery, InterpolatedNotPrepared, is_writable\/chmod in background processing context)<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Fix: Add ABSPATH direct-access guard to all index.php stub files<\/li>\n<li>Fix: Replace unlink() with wp_delete_file() (WebpConverter, class-optimizer)<\/li>\n<li>Fix: Replace date() with gmdate() (class-database, DatabaseRepository)<\/li>\n<li>Fix: Gate error_log() calls behind WP_DEBUG check<\/li>\n<li>Fix: Sanitize $_SERVER['HTTP_ACCEPT'] via wp_unslash\/sanitize_text_field<\/li>\n<li>Fix: Reduce readme.txt tags to 5; add required short description<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fix: Align sanitize_settings() whitelist with registered fields (add remove_emoji, font_swap; remove stale remove_bloat key)<\/li>\n<li>Fix: Escape WebP URL with esc_url() in the_content filter callback to prevent potential XSS<\/li>\n<li>Fix: Move Performance Toggles admin page under plugin nav menu instead of wp-admin Settings<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix: Accept array $size in add_webp_picture_element() and render_picture_element() to match WordPress core behavior and prevent TypeError on WooCommerce order emails<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fix: Achieve Lighthouse 100\/100 with complete WordPress.org compliance<\/li>\n<li>Fix: Navigation script deferral now works on-demand (click\/touch interaction)<\/li>\n<li>Fix: Settings toggle now fully controls all feature behaviors<\/li>\n<li>Refactor: Moved navigation deferral from mu-plugin to main plugin service<\/li>\n<li>Refactor: Complete SOLID principles implementation with DI Container<\/li>\n<li>Refactor: All WordPress hooks prefixed with <code>odr_<\/code> for global namespace safety<\/li>\n<li>Docs: Enhanced documentation for WordPress.org submission<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Polish: Enhanced plugin header metadata for WordPress.org consistency (description, PHP requirement aligned to 8.1, refreshed tags, Plugin URI now points to GitHub).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Added Priority Service for LCP optimization.<\/li>\n<li>Added Cleanup Service for bandwidth reclamation.<\/li>\n<li>Consolidated settings into a unified dashboard.<\/li>\n<li>Implemented SOLID architecture for maintainability.<\/li>\n<li>Added comprehensive case study documentation.<\/li>\n<li>Full internationalization support (i18n ready).<\/li>\n<li>Security audit complete: nonce verification, capability checks, late escaping.<\/li>\n<li>PHPStan Level Max compliance (strict types throughout).<\/li>\n<li>PSR-12 formatting enforced via CI\/CD.<\/li>\n<\/ul>","raw_excerpt":"Professional image optimizer: WebP conversion, LCP preloading, and critical-path cleanup for a 100\/100 Lighthouse score.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/269675","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=269675"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/odanree"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=269675"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=269675"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=269675"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=269675"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=269675"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=269675"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}