DietPress — Full changelog

For each release, see the entries below. The latest version is always at the top.
The current release notes also live in readme.txt under "== Changelog ==".

= 3.5.1 =
* Improved: The Cache tab now says out loud when its cleanup is not running. The next cleanup figure tells a run that is due apart from one that is overdue and marks the overdue one, and a note underneath names the likely cause: WordPress cron switched off with no real cron behind it, a site too quiet for WordPress to fire its scheduled tasks at all, or no cleanup scheduled, which the tab itself can put right. While the schedule is being met it says nothing.
* Fix: Pages whose address is not plain ASCII shared a single cached copy. The request path was cleaned with a function that deletes percent encoded characters, and that is exactly how a browser sends every byte of an accented or non Latin permalink, so /café/ and /cafá/ were stored as the same page, and a site whose slugs are written in Cyrillic, Greek, Arabic or CJK collapsed nearly every address onto one entry, the home page included. Languages WordPress transliterates into ASCII by itself, Spanish and French among them, were only affected where a slug had been edited by hand. The cache is emptied once when this version is installed, because a copy stored under the old rules can hold a different page altogether and there is no way to tell which from the file.
* Fix: A URL exclusion pattern containing an accent or any non Latin character never matched anything, for the same reason: those characters were stripped when the pattern was saved. Both spellings work now and mean the same thing, the one the address bar shows and the one the clipboard usually holds.
* Fix: Renaming or deleting a category or a tag left its old archive cached and still being served. It is the case renaming a post already handled: once the slug has changed, nothing can name the address the old page lived at, and nothing would ever rebuild it either.
* Fix: Editing what a widget says purged nothing, so every page showing it kept the old text until it expired. Only adding, moving or removing a widget purged. Block based widgets are covered too, since they all share one option.
* Fix: The browser caching rules handed HTML pages the lifetime chosen for media. The rule that covers every file type without one of its own covers the page itself too, and there was no rule for HTML. On an anonymous visit the Cache-Control header the plugin sends overrode it, which is why it went unnoticed; on a page viewed while logged in that header is deliberately not sent, and there a page could sit in the browser for a month. HTML now follows the lifetime chosen for it in the Cache tab.
* Fix: The query parameters that may never be ignored treated filter_ as a whole name rather than a prefix, so a WooCommerce layered navigation parameter such as filter_color could be added to the ignore list, and a filtered shop page was then answered with the unfiltered one.
* Fix: The next cleanup figure on the Cache tab could not tell a late cleanup from a coming one. It printed a bare time difference, and the WordPress function behind it carries no direction, so a cleanup that had run two days late and one due in two days both read as 2 days. The one figure that could have revealed a cron nobody was running was the one hiding it.

= 3.5.0 =
* New: Page cache. DietPress can now store a static copy of each page on disk and serve it to anonymous visitors without building the page again, from its own Cache tab in the DietPress settings, next to the diet levels, which also gathers the browser caching rules that used to live under Strict. It is off by default, it installs no drop-in file and it never writes to wp-config.php, so switching it off leaves the site exactly as it was. Logged in visitors, anyone carrying a cart, a password protected post and a comment awaiting moderation always get the live page. Every response carries an X-DietPress-Cache header, and every stored page a footprint comment, so a hit and a miss can be told apart at a glance.
* New: Browser caching is now configurable rather than fixed: how long browsers keep your media, your styles and scripts, your fonts and the HTML itself, each on its own, plus a switch for the ETag header. Browser caching and compression also get a master switch each, so you can run one without the other; a site updating from 3.4.x keeps whatever its single switch said. The Cache-Control headers are built from those same lifetimes instead of a hardcoded year, which is a fix in itself: they used to contradict the Expires rules, and browsers obey Cache-Control when the two disagree. Only styles, scripts and fonts are marked immutable now, because they carry a version in their URL; an image keeps its URL when you replace it. The HTML lifetime is sent as an HTTP header instead of an .htaccess rule, which is a fix too: the old rule only matched files whose name ends in .html, so it never applied to a WordPress permalink at all.
* New: The Cache tab reports what the cache is really doing instead of just offering switches: how many pages and how much disk it holds, when the cleanup last ran and when it runs next, and a Test the cache now button that asks the site for its own home page, as an anonymous visitor would, and says whether it was served from disk, rebuilt, or skipped. The same status block appears on the Scale tab next to the savings, the site analyzer gained a Cache section that covers the engine, the gzip copy and the browser caching rules, and the quick profiles switch the cache on with a lifetime that suits each one, six hours for a store and twelve for the rest. Purging accepts a title as you type and fills in the right URL for you. With WP_DEBUG on, a page that is not being stored names the exact reason in an HTML comment at the end of its source.
* New: Invalidation happens on its own for the things that change a page. Publishing, editing, deleting or renaming a post purges it along with the front page, the blog page, its archives and its author page, and renaming a slug also purges the address it used to live at. Approving, editing or deleting a comment purges its post. Changing the theme, the menus, the widgets, the permalinks or the front page settings, and activating or updating any plugin, empty the cache completely. There is also a purge button, a field to purge one URL, the dietpress_cache_purge_all action and the dietpress_purge_page_cache() function.
* New: The cache refuses to run beside another one instead of fighting it. With W3 Total Cache, WP Super Cache, LiteSpeed Cache, WP Fastest Cache, Cache Enabler, Surge, WP Rocket or any of about thirty similar plugins active, the toggle is disabled and says which one is in the way, and if one of them is activated later DietPress switches its own cache off and tells you. On hosting that already serves a page cache, such as Kinsta, WP Engine, SpinupWP or Cloudways, it explains the risk and asks for an explicit confirmation. On LiteSpeed servers it points at the LiteSpeed Cache plugin, which caches at server level. Multisite is not supported yet and says so rather than misbehaving.
* Fix: Activating a conflicting cache plugin from WP-CLI, or from any code that activates plugins outside the dashboard, did not switch the page cache off. The check only listened while an admin screen was loading, so a host control panel or a staging script could leave two page caches running at once, which is the exact situation the check exists to prevent.
* Fix: An option held back by another one lost its saved value on the next save. The switches that depend on a master switch, the five RSS feed ones and the compression ones among them, were drawn from whether they apply right now rather than from what you had chosen, so while the master was off they rendered as off, and saving wrote that over your real preference. Turning the master back on then restored nothing. A card now always shows what is stored, and the note underneath is what says whether it can do anything yet.

= 3.4.1 =
* Improved: The settings page code is no longer loaded on frontend requests. Around 90 KB of PHP that only the admin ever needs was being read and parsed on every visit to the site.
* Improved: The saved settings are no longer completed with the built-in defaults on every single request. That work, and the database write it could trigger in the middle of an anonymous visit, now happens only after a plugin update, which is the only moment it can change anything.
* Fix: Translations were loaded before the init action, which printed a "Translation loading for the wpo-tweaks domain was triggered too early" notice on sites that have DietPress translated and WP_DEBUG on. Deciding whether an option was locked went through the sentence that explains the lock, so merely reading a setting asked for a translation while the plugin was still loading.
* Fix: The WooCommerce selective loading module left two stylesheets behind on pages with no store content. On WordPress 7.0, wc-blocks-style survived because block styles are now enqueued while the page renders and only afterwards moved up into the head, past the point where the module was looking. And with any block theme, woocommerce-blocktheme was never on the list to begin with, so it loaded everywhere. Every other WooCommerce file was already being removed.

= 3.4.0 =
* New: Selective loading covers five more plugins that load their assets on every page. Slider Revolution, around 660 KB of JavaScript per page, by turning its own Include libraries globally setting off for each visit and letting Slider Revolution decide, so its shortcodes, its widget and its own page list keep working (DietPress adds the cases its check misses, such as a shortcode inside a widget). TablePress and Smash Balloon, by turning on the conditional loading each one already ships with (nothing is dequeued, and no table or feed can end up unstyled). Formidable Forms, whose stylesheet is removed while its own footer fallback is put back in play. And Everest Forms, including the Dashicons file it forces on every visitor. All five are off by default, the site analyzer suggests each one when its plugin is active, and the Maximum cleanup profile enables them.
* New: Options that cannot do what they promise now say so in their own card, and the ones that would contradict another option or break another plugin cannot be switched on at all. "Disable WordPress XML sitemap" becomes unavailable while a plugin that builds on the native sitemap is active (Visibility, or any plugin that says so through the new dietpress_native_sitemap_in_use filter), so nobody can pull the sitemap from under it by mistake. A stored value is never lost: it stays saved, it simply does not apply while the lock lasts, and the site analyzer stops suggesting anything locked.
* New: The cards for "Disable Posts content type" and "Disable Pages content type" now count what you have and warn before you switch them on, for example that your site has 42 pages that would disappear from the admin, the frontend and your menus. Nothing is ever deleted, and the warning travels with the analyzer recommendations too.
* Improved: Selective loading no longer removes assets on pages it cannot read. A page built with Elementor keeps its content in the database, out of reach of the content scan, and an Elementor Theme Builder template can inject a header, a footer or a popup into any request. Those pages now keep the assets of every detection-based module, which closes the known gap of the Contact Form 7 module with forms placed inside a builder.
* Improved: Every selective loading module that removes handles now exposes the same three filters (dietpress_selective_{module}_has_content, _styles and _scripts), where before only WooCommerce had its handle lists filterable; the modules that flip a native setting expose their own escape filter instead. The filters published in 3.3.0 keep working.
* Improved: The developer filters from the 2.x days (the ayudawp_wpotweaks_* prefix, renamed in 3.0.0) now report their deprecation through the standard WordPress notice, only when a site still has a callback hooked to one of them and only with WP_DEBUG on. They keep working, and are scheduled for removal in 4.0.
* Improved: "Disable native lazy loading" and "Disable fetchpriority attribute" are no longer offered while "Enhance image loading attributes" is on. They only make sense when another plugin manages image loading, and with the DietPress option on they changed nothing, because DietPress sets those attributes itself right after WordPress. Turning off the image enhancements makes both available again, without reloading the page. If you had one of them on together with the image enhancements, the attributes were already being set by DietPress; now WordPress keeps setting its own too, which is the behavior the option descriptions always described.
* Improved: The Scale tab is coherent with all of the above. The savings counter no longer counts an option that cannot apply, the analyzer does not suggest one, and applying a quick profile no longer stores one: it keeps whatever the site had and says which option it left alone and why. The Maximum cleanup profile also stops switching on "Disable native lazy loading" and "Disable fetchpriority attribute", which it combined with the image enhancements it keeps on, so they could never do anything.
* Improved: The options that another option already covers now say so instead of looking active for no reason: the five granular RSS feed toggles while "Disable ALL RSS feeds" is on, the six .htaccess sub-options while the master switch is off, and the Customizer widgets one while the whole Customizer is disabled. They stay usable so a site can be configured in any order.
* Improved: The option cards of every section are now laid out by how much text each one carries, so the two-column grid forms even rows instead of a ragged, masonry-looking wall. The order follows the texts themselves, so it keeps working after an edit or a translation, and the switch that governs a group (the .htaccess master, the nuclear RSS option) still comes first. Card notes sit at the bottom, so the ones sharing a row line up.
* Fix: The site analyzer recommendation to disable the WordPress sitemap checked a constant belonging to no real plugin, so it only ever detected Yoast SEO, Rank Math and All in One SEO. It now also detects SEOPress, The SEO Framework and Slim SEO.
* Fix: Internal cleanup with no change in behavior: an unused rendering method, two deletions of a transient that is never written, and a duplicated cleanup of a 2.x option on activation.

= 3.3.1 =
* Fix: "Disable media library image editor" no longer removes the Imagick and GD image editors site-wide. Doing so also stopped WordPress from creating thumbnails on upload and from regenerating them with WP-CLI or a regeneration plugin. The option now disables only the editor itself: its entry points, its AJAX endpoints and its script.
* Fix: "Enhance image loading attributes" no longer produces an invalid image tag when the original tag is self-closing. The closing slash was left in the middle of the tag, before the attributes added by the plugin.
* Fix: Featured images no longer come out with fetchpriority="high" and loading="lazy" at the same time. They travel through two filters, and the second one no longer treats an image already marked as high priority as a candidate for lazy loading, which worked against the very LCP the option aims to improve.
* Fix: Deferred scripts no longer get a second defer attribute. WordPress 6.3 and later defers some scripts on its own, and adding another one made the tag invalid. WooCommerce was the most visible case.
* Fix: Removed a dead loop in the daily transient cleanup. It looked up three names as transients when they are an object cache key and a prefix, so it never matched anything. The cleanup itself is unchanged.

= 3.3.0 =
* New: Google Fonts local hosting. DietPress can now download the Google Fonts your theme enqueues and serve them from your own server: no more visitor connections to Google (faster font delivery and GDPR-friendly), with a silent fallback to the Google CDN if any download fails, and automatic cleanup on theme switch or when turned off. Off by default; find it in Light > Performance next to the display=swap option, which keeps working as fallback.
* New: Selective third-party loading, a new section in the Strict tab with three opt-in modules that stop loading assets where they are not used: WooCommerce styles and scripts outside the store (the cart fragments script is kept when a mini-cart widget is detected), Contact Form 7 assets on pages without a form, and the block library stylesheets on pages whose content uses no blocks (skipped on block themes, and Global Styles are never touched). Each module only acts when its target plugin is present, the site analyzer suggests them when they apply, the Maximum cleanup profile enables them, and escape filters cover custom setups.

= 3.2.1 =
* Improved: hardened path handling in the automatic image dimensions feature so file lookups stay within the WordPress and uploads directories, consistent with the SVG dimension reader.
* Improved: the resource hints `dns-prefetch` list no longer duplicates the domains already covered by `preconnect` (Google Fonts and Google Analytics), which already complete the full connection setup for those origins.
* Improved: the resource hints `dns-prefetch` list no longer includes `gravatar.com` and the numbered `0/1/2.gravatar.com` subdomains; WordPress core's `get_avatar_url()` only generates `secure.gravatar.com` today, so those entries prefetched DNS for hosts no avatar ever loads from.
* Fix: prevent a fatal error (ArgumentCountError on PHP 8+) when a theme or page builder fires the `wp_get_attachment_image_attributes` filter with fewer arguments than WordPress core passes (seen with the Hub/LiquidThemes builder while saving posts). The image loading optimization now treats the attachment and size parameters as optional.

= 3.2.0 =
* New: New "Emails" tab to control the automatic emails WordPress sends on its own: update results (core, plugins, themes), comment moderation and author notices, and new user, password and email-change notices. Every option is off by default, with a risk note where it matters.
* Improved: The "admin email verification prompt" and "post by email" options moved from the Light tab to the new Emails tab; their saved settings carry over unchanged.

= 3.1.0 =
* Improved: Performance – JavaScript defer now skips a built-in list of third-party scripts that must run on load (reCAPTCHA, Typekit, HubSpot forms, payment SDKs and more), matched by URL, and extendable with the new `dietpress_skip_defer_script_patterns` filter.
* Improved: Performance – image optimization now leaves images already handled by another lazy-load solution untouched, honoring the `skip-lazy`/`data-skip-lazy` markers and the markup of common sliders (LayerSlider, Soliloquy), the Contact Form 7 captcha and the WooCommerce placeholder.
* Improved: Performance – image optimization is skipped inside page builder editors and previews (Beaver Builder, Divi, Oxygen and WordPress previews) so layouts are not altered while editing.
* Improved: Performance – site logo detection for image priority is now filterable via the new `dietpress_logo_class_patterns` filter.
* Improved: Performance – missing dimensions are now added to SVG images too (read from their width/height or viewBox), reducing layout shift.
* Improved: Performance – the Scale tab savings counter now also accounts for the performance optimizations (defer, critical CSS, image loading, resource hints, feeds, transient and query optimization, and .htaccess rules).
* Improved: Performance – the .htaccess rules now declare the AVIF MIME type so AVIF images are served correctly on older Apache servers, and set the document charset from your site settings.
* Improved: Security – the .htaccess performance rules no longer keep a copy of your site .htaccess inside the plugin folder. They are written non-destructively (only their own marked block is added or removed), so that copy was never used to restore anything; any backup left by earlier versions is removed automatically on update.
* Fix: the per-tab "Restore defaults" button now also resets the performance options shown on that tab, which it previously skipped.
* Fix: settings export files now use the "dietpress" identifier; imports still accept files exported by earlier versions.

= 3.0.1 =
* Fix: removed the "REST API access" control from the Strict tab. Restricting the REST API is a security feature, not a performance one, and it overlapped with dedicated security plugins, with which it could also clash on the same `rest_authentication_errors` filter. REST API access now follows default WordPress behavior; manage it from your security plugin instead, such as our free Vigilant. If you had set it to "Require authentication" or "Disable", that restriction no longer applies after updating, and DietPress shows a one-time notice pointing you to Vigilant.

= 3.0.0 =
* New: the plugin is now DietPress (formerly "Zero Config Performance Optimization"), fully configurable from a new top-level "DietPress" admin menu with its own settings page.
* New: a complete, risk-based set of options to put WordPress on a diet (Light, Moderate, Strict and Widgets), covering emojis, RSD/WLW, shortlinks, self-pingbacks, oEmbed, jQuery Migrate, Dashicons, REST API control, granular RSS feeds, comments, Heartbeat, revisions, autosave, content types, and dashboard/sidebar/block/Customizer widgets. Security-related toggles (XML-RPC, pingbacks, login errors, Application Passwords, version hiding) are intentionally not included: they belong in a security plugin, like our free Vigilant, and DietPress tells you once if you had any of them enabled.
* New: Scale tab with a savings indicator, quick profiles (Personal Blog, WooCommerce, Landing Page, Maximum Cleanup) and a site analyzer with recommendations.
* New: import and export your configuration as a JSON file.
* Improved: every performance optimization from the previous "Zero Config" version is now an individual setting you can fine-tune (JavaScript defer, Critical CSS, image loading attributes, image dimensions, resource hints, asset and logo preloading, RSS feed optimization, .htaccess browser caching/GZIP/Brotli/headers, transient cleanup and query optimizations). They all stay ON by default, so updating sites keep their current behavior.
* Improved: the Critical CSS deferral of non-critical stylesheets (the part that can cause a flash of unstyled content) is now a separate, opt-in "experimental" toggle, while the safe inline critical CSS stays on by default.
* Improved: the .htaccess server rules are now applied when you save settings, with a master switch plus per-feature toggles (browser caching, GZIP, Brotli, cache headers, CORS for fonts, keep-alive), and are removed cleanly on deactivation. The block is now labeled "# BEGIN DietPress"; the old "Zero Config Performance" block is replaced automatically.
* Improved: developer filters renamed to the `dietpress_` prefix (`dietpress_critical_css`, `dietpress_critical_css_handles`, `dietpress_skip_defer_script_handles`, `dietpress_skip_defer_style_handles`, `dietpress_preconnect_hints`, `dietpress_dns_prefetch_domains`, `dietpress_critical_fonts`). The former `ayudawp_wpotweaks_*` filters keep working through a compatibility bridge, but are deprecated: please update your snippets to the new names.
* Fix: the retired standalone DietPress ("core-diet") plugin is detected and deactivated automatically, preventing fatal conflicts while both are installed; its settings carry over.

= 2.3.2 =
* **IMPROVED: new `ayudawp_wpotweaks_skip_defer_script_handles` filter** so plugins can opt their own JavaScript out of the defer pass when their scripts must run before DOMContentLoaded
* **IMPROVED: new `ayudawp_wpotweaks_skip_defer_style_handles` filter** so plugins can opt their own stylesheets out of the `rel="preload"` defer when their UI would render visually broken until the deferred CSS finishes loading
* **FIX: plugin asset cache-busting was being neutralized** — the previous combination of stripping `?ver=` from every URL plus the `Cache-Control: immutable, max-age=31536000` header in `.htaccess` froze plugin assets in browser caches for a year. Any plugin update silently failed to reach existing visitors. URLs under `/wp-content/plugins/` now keep their `?ver=` query string so the cache-busting works as intended; WordPress core, `wp-includes/` and theme assets still get stripped. Filterable with `ayudawp_wpotweaks_preserve_plugin_version`

= 2.3.1 =
* **FIX: JavaScript defer breaking scripts with inline "after" code** - Fixed "wp is not defined" errors on scripts using `wp_add_inline_script()` with 'after' position (wp-i18n) and scripts registered with `wp_set_script_translations()` (Contact Form 7 translations, etc.). The defer filter now skips scripts with attached inline code to prevent execution order issues
* **IMPROVED: Changelog history moved to separate file** - Full changelog history now lives in [changelog.txt](https://plugins.svn.wordpress.org/wpo-tweaks/trunk/changelog.txt) following WordPress.org best practices. The readme.txt now only contains the latest versions for lighter maintenance and cleaner translations

= 2.3.0 =
* **MAJOR: Image module refactored to complement WordPress core** - Rebuilt to work as a safety net instead of duplicating core. WordPress 5.5+/6.1+/6.3+ handles lazy loading, decoding, and fetchpriority for images in its standard pipeline, but images injected by themes, page builders, widgets or custom code may bypass it. The module now checks if each attribute is already present before adding it, so it only fills the gaps core didn't reach
* **NEW: fetchpriority="low" for non-critical images** - Deprioritizes below-the-fold images so the browser allocates bandwidth to critical resources first. WordPress core does NOT do this
* **FIX: Gravatar avatars broken by query string removal** - Previous version stripped all query parameters from Gravatar URLs, including functional ones (size, default image, rating). Function removed entirely since Gravatar params are not cache-busting
* **FIX: Critical CSS broken by esc_html()** - CSS selectors using `>` (child combinator) and other special characters were escaped to HTML entities, breaking the CSS. Now uses wp_strip_all_tags() only
* **FIX: Deprecated JSON/REST API filters removed** - `json_enabled` and `json_jsonp_enabled` were legacy filters from the old WP-API plugin (pre WP 4.7) that could interfere with Gutenberg, WooCommerce and other plugins depending on the REST API
* **FIX: CusRev and review plugins compatibility** - Comments query optimization now only applies to standard comments, not custom comment types used by review plugins (CusRev, WooCommerce Reviews, etc.)
* **FIX: Ghost plugin entries cleanup** - Automatically removes orphaned entries in active_plugins from renamed or incorrectly registered plugin paths on activation
* IMPROVED: Removed dns-prefetch hint for s.w.org (only used by emoji scripts already disabled by the plugin)
* IMPROVED: Reduced code footprint in image optimization module, cleaner logic with no duplication
* Tested up to WordPress 7.0

= 2.2.1 =
* **FIX: Critical wp-config.php compatibility issue** - Plugin no longer modifies wp-config.php, fixing 500 errors on activation caused by conflicts with existing configurations
* **NEW: Safe trash cleanup via cron** - Trash retention (7 days) now handled via scheduled task instead of modifying wp-config.php
* **NEW: Legacy wp-config.php cleanup** - Automatically removes modifications added by previous versions on upgrade
* IMPROVED: Safer activation process with no risk of breaking site configuration
* REMOVED: wp-config.php backup/restore system (no longer needed)

= 2.2.0 =
* **REBRANDING: Plugin renamed to Zero Config Performance Optimization**
* **NEW: Brotli compression support** - Modern compression for servers that support it
* **NEW: Keep-Alive connections** - Enables connection reuse for faster requests
* **NEW: Vary Accept-Encoding header** - Better CDN and proxy caching
* **NEW: Cache-Control immutable flag** - Prevents unnecessary revalidation
* **NEW: CORS headers for fonts** - Full CDN compatibility
* **NEW: Extended MIME types** - Video, audio, manifest files properly cached
* **NEW: Automatic logo preload** - Site logo preloaded with high priority for LCP
* **NEW: fetchpriority attribute** - First image gets `fetchpriority="high"` for faster LCP
* **FIX: Clean .htaccess removal** - Plugin markers now fully removed on deactivation
* **FIX: Legacy marker cleanup** - Old "WPO Tweaks" markers automatically cleaned
* IMPROVED: Better first image detection for LCP optimization
* IMPROVED: More comprehensive browser caching rules
* IMPROVED: Updated admin notice with new branding
* REMOVED: Security tweaks module (use dedicated security plugins instead)

= 2.1.3 =
* **FIX: Divi 5 Visual Builder compatibility**
* JavaScript defer is now disabled when Divi Visual Builder is active
* Fixes issue where Divi 5 builder would get stuck loading infinitely
* Frontend performance remains optimized (defer only disabled during editing)

= 2.1.2 =
* Tested up to WordPress 6.9

= 2.1.1 =
* **CRITICAL FIX: Admin bar display for Editor and Author roles**
* Fixed bug where users with Editor and Author roles couldn't see the admin bar correctly
* Dashicons now only removed for non-logged users (ALL logged-in users, regardless of role, can see admin bar)
* Improved logic in Script Optimization module
* Improved logic in Critical CSS module
* Better compatibility with all WordPress user roles
* Fixed: Admin notice footer text now fully translatable

= 2.1.0 =
* **NEW MAJOR REFACTORING: Modular architecture for better maintainability**
* NEW: **Missing Image Dimensions** - Automatically adds width/height attributes to img and picture elements for better Cumulative Layout Shift (CLS) scores
* NEW: **Picture Element Support** - First plugin to automatically add dimensions to picture elements (more comprehensive than most optimization plugins)
* NEW: **Enhanced File Management System** - Automatic backup and restoration of wp-config.php and .htaccess files
* NEW: **Direct wp-config.php Management** - Guaranteed trash retention settings by modifying wp-config.php directly
* NEW: **Admin Activation Notice** - Informative welcome message showing all applied optimizations
* IMPROVED: Code completely refactored into modular architecture with separated components
* IMPROVED: Better performance with optimized module loading system
* IMPROVED: Enhanced debugging capabilities with isolated modules
* IMPROVED: Conflict resolution system for existing configurations
* IMPROVED: Complete cleanup system on plugin deactivation
* IMPROVED: Enhanced Gravatar lazy loading support
* IMPROVED: All filter names updated to `ayudawp_wpotweaks_*` for better specificity
* IMPROVED: Each optimization now has its own dedicated module for easier maintenance

= 2.0.3 =
* Removed: Admin Footer Credits (absolutely not necessary)
* Removed: Deactivation of WordPress file editor (better handle with a security plugin)
* Fixed: Better selection of dashboard widgets to remove (maintaining security related)

= 2.0.2 =
* Fixed: Pagination issues with Twenty Twenty and other themes
* Improved: Query optimization logic to preserve pagination functionality
* Enhanced: Better compatibility with various theme pagination systems
* Added: Better error handling for transient cleanup
* Improved: Memory usage optimization

= 2.0.1 =
* Fixed bug with WooCommerce not showing products in taxonomy and archive pages

= 2.0.0 =
* **NEW MAJOR VERSION with advanced optimizations**
* NEW: **Automatic Critical CSS**: Above-the-fold critical CSS generation and injection
* NEW: **Deferred CSS Loading**: Non-critical CSS loads asynchronously with noscript fallback
* NEW: **Automatic Preconnect**: Automatic hints for Google Fonts, Analytics and other critical resources
* NEW: **Smart DNS Prefetch**: DNS preloading for common external resources
* NEW: **Native Lazy Loading**: Automatic lazy loading for all images with decoding=async
* NEW: **Database Optimizations**: Automatic cleanup of expired transients and query optimization
* NEW: **Resource Preloading**: Automatic preload for theme CSS and critical fonts
* NEW: **Smart jQuery Migrate Removal**: Only removes when not needed
* NEW: **Dashboard Cleanup**: Removes unnecessary widgets from administration area
* NEW: **Revisions Management**: Limits automatic revisions to 3 and reduces trash retention to 7 days
* NEW: **Google Fonts Optimization**: Automatically adds display=swap
* IMPROVED: **Multiple Developer Filters**: Allows advanced customization via hooks
* IMPROVED: **Smart Cache**: Enhanced cache system for critical CSS and other resources
* IMPROVED: **Scheduled Tasks**: Automatic daily cleanup of expired transients
* IMPROVED: **Improved Architecture**: Code restructured following WordPress best practices
* IMPROVED: **Enhanced Security**: All functions carry ayudawp_ prefix following standards
* IMPROVED: **Translation Ready**: Updated text domain and strings prepared for i18n
* IMPROVED: **Better Performance**: Significant optimizations in loading time and server resources
* IMPROVED: **Better Metrics**: Specific optimizations for Core Web Vitals and measurement tools

= 1.0.7 =
* Tested up to WordPress 6.7.1

= 1.0.6 =
* Tested up to WordPress 6.6.1

= 1.0.5 =
* Tested up to WordPress 6.5.2
* Added support for PHP 8.2 (props @dbase66)

= 1.0.4 =
* Tested up to WordPress 6.4

= 1.0.3 =
* Tested up to WordPress 6.2

= 1.0.2 =
* Tested up to WordPress 6.1
* Updated requirements for WP and PHP

= 1.0.1 =
* Tested up to WordPress 6.0.2

= 1.0 =
* Tested up to WordPress 6.0
* Yes! It was time to change to version 1.x

= 0.9.31 =
* Change PageSpeed URL

= 0.9.30 =
* Tested up to WordPress 5.9

= 0.9.29 =
* Tested up to WordPress 5.8

= 0.9.28 =
* Tested up to WordPress 5.6

= 0.9.26 =
* Removed jQuery Migrate option because it's not needed since WordPress 5.5

= 0.9.25 =
* Tested up to WordPress 5.5

= 0.9.24 =
* Regression to previous method for defer parsing of JavaScript due to support issues with Divi theme

= 0.9.23 =
* Tested up to WordPress 5.4.1

= 0.9.22 =
* New method for defer parsing of JavaScript. Especially useful with YouTube iframes and other external video sources

= 0.9.21 =
* Tested up to WordPress 5.3.2

= 0.9.20 =
* Changes in jQuery Migrate code to resolve support of latest Elementor version

= 0.9.19 =
* Tested up to WordPress 5.3

= 0.9.18 =
* Tested up to WordPress 5.2.2

= 0.9.17 =
* Tested up to WordPress 5.2

= 0.9.16 =
* Tested up to WordPress 5.1

= 0.9.15 =
* Added conditionals to deflate lines in .htaccess file to prevent 500 error on some hostings (Props to frayca)

= 0.9.14 =
* Added tested up to WordPress 5.0 tag

= 0.9.13 =
* Tested up to WordPress 4.9.8

= 0.9.12 =
* Added functions to disable internal self pingbacks

= 0.9.11 =
* Added line to check if "expires" module is active to prevent 500 error on some servers where module is not active

= 0.9.10 =
* Tested up to WordPress 4.9.6

= 0.9.9 =
* Added browser cache expiration rules to main WordPress .htaccess file
* Added GZIP compression rules to main WordPress .htaccess file
* This is the first version with version tags
* Props to @carloslongarela for .htaccess improvements

= 0.9.8 =
* Tested up to WordPress 4.9.5

= 0.9.7 =
* Added exception in Dashicons removal to show them in Customizer

= 0.9.6 =
* Changed method for Heartbeat API - now controls interval to 60 seconds instead of default 15 seconds
* Added credits to admin footer
* Plugin tested up to WordPress 4.9 RC

= 0.9.5 =
* Added link to WebPageTest in readme.txt to measure results
* Changed to `script_loader_tag` filter method for Defer Parsing of JavaScript

= 0.9.4 =
* Changed method for Defer Parsing of JavaScript to resolve AMP issues with Google CDN
* Changed donation URL

= 0.9.3 =
* Changed minimum WP version from 4.0 to 4.1
* Added filter to remove capital_p_dangit filter
* Added functions to disable PDF thumbnails previews
* Added multiple actions to clean header (props @carloslongarela)
* Better code standards and functions ordering
* Changes in readme.txt

= 0.9.2 =
* Added multiple actions to clean WordPress header
* Added function to remove jquery_migrate

= 0.9.1 =
* Fixed Text Domain to be ready for translation

= 0.9 =
* Initial version
