Fixed: Plugin Check findings — replaced direct unlink() calls with wp_delete_file() in the Maintenance ZIP download and cleanup routines
Fixed: added justified phpcs:ignore annotations for the unavoidable direct is_writable()/readfile() filesystem calls used to manage .htaccess and stream the temporary backup ZIP (no WP_Filesystem equivalent exists for these specific operations)
Fixed: added justified phpcs:ignore annotations for $_POST[‘offset’]/$_POST[‘token’] reads in Maintenance AJAX handlers, where the nonce is already verified via check_ajax_referer() inside check_permissions() earlier in the same method
Fixed: removed the remote Google Fonts @import in the admin stylesheet (present since the first approved version) — admin UI now uses a local system-font stack, with no third-party assets loaded
Fixed: missing i18n wrapper on the “No Imagick/GD detected” troubleshooting copy in the Diagnostics page
Fixed: hardcoded Spanish strings in the Media Library inline JS (single-image optimize button) now routed through PHP __() and passed to the script as a translatable object
Changed: README.md rewritten to match the current version and defer to readme.txt as the single source of truth for the changelog, instead of duplicating (and drifting out of sync with) it
1.5.0
Added: optional setting “Servir WebP automáticamente” — inserts/removes a .htaccess block (via WordPress’ insert_with_markers()/extract_from_markers()) that serves the .webp version under the same original URL when the browser supports it, with no redirects and no URL changes
Added: status indicators for mod_rewrite availability, .htaccess writability and whether the rule block is actually installed
Added: the .htaccess block is automatically removed on plugin deactivation and uninstall, leaving no leftover server rules
1.4.0
Added: optional “Keep thumbnail backups” setting (off by default) — when disabled, only the full-size original gets a .niquelao-bak copy instead of every generated thumbnail size, saving disk space and inodes
Added: new Maintenance screen to scan, download (as ZIP) and bulk-purge accumulated .niquelao-bak files, processed in batches via AJAX to support shared hosting with execution time/inode limits
Added: uninstall routine now also removes the temporary ZIP folder and the new backup-thumbs option
1.3.5
Fixed: settings page hook suffixes were calculated manually and didn’t match the real hook suffixes generated by WordPress (which derive from the top-level menu_title, not the menu slug), causing CSS/JS to fail to load on Bulk Optimization, Statistics and Diagnostics pages
Fixed: admin styles/scripts now use the real hook_suffix returned by add_menu_page()/add_submenu_page() instead of a hardcoded guess
Fixed: media library “Optimize” button (upload.php/post.php) registered its own style/script handle instead of relying on a handle that wasn’t enqueued on those screens
Fixed: synced plugin version number across the main file header, the NIQUELAO_VERSION constant and readme.txt Stable tag
Fixed: missing i18n wrapper on one bulk-optimization status string
1.3.2
Unified license to GPL-2.0-or-later across all files
Added full internationalization (i18n) via () and esc_html() functions
Updated Text Domain header to match plugin slug (niquelao-image-optimizer)
Removed deprecated load_plugin_textdomain() call (auto-loaded since WP 4.6)
Created uninstall.php to clean up table, options and postmeta on uninstall
Fixed require_once order: all includes at the top of the main file
languages/ folder ready for translations
1.3.1
Updated Plugin URI to kokeperez.es
1.3.0
Added automatic resizing with configurable maximum width and height
EXIF Copyright/Artist metadata now preserved after stripping (Imagick and GD)