Description
Converts images to WebP and compresses each one toward a 100KB target:
- Media Library optimizer – scans existing attachments (JPG/PNG/GIF,
plus optional WebP/SVG/RAW support) and converts them to WebP in
small batches, avoiding PHP timeouts. - Manage WebP images – review any WebP image in your library, compress
individual ones further, and choose exactly which original files to
permanently delete once you’re happy with the result.
Compression modes
Choose one mode; it applies wherever conversion happens:
- Less Compress (quality mode): starts at WebP quality 90, only steps
down to a floor of quality 70, and never resizes the image. If a
detailed image can’t get under 100KB without going below that quality
floor, it is left larger rather than degraded further. - High Compress (aggressive mode): starts at quality 78, steps down to
a floor of quality 20, and if still too big, shrinks dimensions by
20% at a time down to a 120px floor – forcing the result under 100KB
“at any price.”
Requirements
- Imagick PHP extension with WebP support (preferred), or
- GD PHP extension with WebP support (imagewebp())
Security notes
- All admin actions require the
manage_optionscapability and a
verified nonce. - Every file this plugin processes is validated as a real image via
getimagesize() + fileinfo mime detection (or, for SVG, a dedicated
content-safety scan), not by trusting its extension. - Filenames are sanitized and destination paths are checked to stay
inside wp-content/uploads before any file is written. - All AJAX output is via wp_send_json_success/error; all admin UI output
is escaped (esc_html/esc_attr/esc_url).
The Media Library optimizer keeps your original files on disk; it only
repoints the attachment’s registered file to the new .webp version, so
you can restore from the original if needed – until you use the new
“Delete original files” tool below (see 1.2.0).
For Developers
Extension points other plugins can hook into – none of these change
default behavior on their own, they’re no-ops until something uses them:
pixelcinch_after_convert(action) – fires after an attachment is
converted, with the attachment ID and a result summary array.pixelcinch_after_delete_original(action) – fires after an original
(pre-WebP) file is actually deleted from disk.pixelcinch_compression_profile(filter) – the quality/resize tuning
values used for a given compression mode.pixelcinch_scannable_mime_types(filter) – the list of MIME types
offered as scan/convert source formats.pixelcinch_default_settings(filter) – the default settings array.pixelcinch_sanitize_settings(filter) – the sanitized settings array
right before it’s stored; add your own keys here alongside your own
entries inpixelcinch_default_settings.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“Pixelcinch Image Optimizer” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “Pixelcinch Image Optimizer” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
2.6.2
- Compliance: removed the custom AJAX output-buffering mechanism entirely.
It previously opened an output buffer in one method and closed it from
a separate ‘shutdown’-hooked method, which left buffer ownership
dependent on hook execution order rather than a single function scope.
The plugin no longer performs any output buffering.
2.6.1
- Compliance: the AJAX output buffer opened to strip stray PHP
warnings/notices from JSON responses is now explicitly closed via
ob_get_clean() on ‘shutdown’, rather than left open for PHP’s implicit
end-of-request flush.
2.6.0
- Renamed to “Pixelcinch Image Optimizer” (slug: pixelcinch-image-optimizer).
Display name, text domain, admin page slugs, and internal references
updated throughout. No functional changes.
2.5.1
- Ran the plugin through PHP_CodeSniffer with the WordPress Coding
Standards ruleset and cleaned up everything it flagged: statement
alignment, increment style, an array-formatting spot, an unused
filter-callback parameter, and a reserved-keyword parameter name.
No behavior changes.
2.5.0
- Added six action/filter hooks (see “For Developers” above) so other
code can extend conversion, deletion, compression tuning, supported
formats, and settings without modifying this plugin’s files. Purely
additive – no existing behavior changes.
2.4.3
- Compliance: replaced an
ini_set( 'display_errors', ... )call used to
keep stray PHP notices out of our AJAX JSON responses with output
buffering instead, since plugins altering that php.ini directive at
runtime is flagged by Plugin Check. No behavior changes.
2.4.2
- Compliance: bumped “Tested up to” to 7.1.
- Compliance: prefixed the two variables in uninstall.php that Plugin
Check flagged as unprefixed globals. No behavior changes.
2.4.1
- Renamed the plugin to “Pixelcinch Image Optimizer” (previously “WebP
Image Fetcher & Compressor”), per WordPress.org naming guidelines –
descriptive of what the plugin actually does (compress images) with a
distinct identifier at the front instead of leading with “WebP”. - Compliance: the dashboard widget’s inline
<style>block is now
enqueued properly via wp_enqueue_style() instead. - Compliance: every function/class/constant/option/hook prefix changed
fromiwc/IWCto a prefix derived from the new name, to go with the
rename above. No behavior changes.
2.4.0
- Removed: the “Fetch images from a URL” tool, which scanned a given
page for image sources and downloaded them. The WordPress.org Plugin
Directory review team classified this as scraping functionality,
which isn’t permitted regardless of the safeguards that were in place
(SSRF protections, same-image validation, an explicit on-screen notice
to only use it on sites you own/have permission for, etc.) — the
capability itself is what’s restricted, not the intent behind it. This
plugin now only ever processes images already in your own Media
Library, or new uploads made through WordPress’s normal upload flow. - The “Manage WebP images” step is renumbered to step 2 accordingly.
No other functionality changed.
2.3.0
- New: additional source formats for conversion, each opt-in via checkbox
on the Tools page or Settings:- WebP: recompresses an already-WebP image in place using the full
quality/resize search (not just the single-shot “compress further”
slider), useful for a one-time pass over WebP files that arrived
from somewhere other than this plugin. - SVG: rasterized to WebP via ImageMagick, only when the server’s
ImageMagick build actually has SVG support (most shared hosting
does not — the checkbox is disabled with a clear note when
unavailable). Every SVG is scanned before processing and rejected
if it contains scripts, event handler attributes, XML external
entity declarations, or references to external URLs — the class of
content that makes ImageMagick+SVG a known security risk
(“ImageTragick”). Rendering also runs under tight ImageMagick
resource limits (memory/width/height/time) so a pathological file
fails safely instead of exhausting server resources. - RAW camera files (CR2, CRW, NEF, NRW, ARW, RAF, ORF, RW2, PEF, SRW,
DNG): converted via ImageMagick, only when the server’s build
supports that specific format. Automatically picks the
highest-resolution embedded frame (RAW files often bundle a
thumbnail and preview alongside the full frame).
- WebP: recompresses an already-WebP image in place using the full
- New: optional “Allow SVG/RAW uploads” setting (off by default) so
these file types can actually be uploaded through the Media Library
at all — WordPress blocks them otherwise. The same SVG safety scan
runs at upload time, before a file is ever written to disk, not just
when converting it later. - Fix: the image-conversion loop is now wrapped in try/catch for every
source type (previously only some paths were) — an unexpected
mid-conversion failure always returns a clean error now instead of
risking an uncaught exception. - The “unsupported format” case (e.g. an SVG/RAW file on a server
without the right ImageMagick support) is tracked distinctly so the
scanner doesn’t keep retrying it, and is reflected in the Tools page
library overview.
2.2.2
- Compliance: resolved 6 remaining Plugin Check warnings in
class-pixelcinch-local.php (WordPress.Security.ValidatedSanitizedInput.InputNotSanitized).
A recognized sanitizer (absint()/sanitize_text_field()) is now applied
directly at every $_POST read, rather than only inside this plugin’s
own whitelist helper methods a few lines later – the previous version
was already safe (the helpers do whitelist/absint everything), but
static analysis couldn’t see past the function call boundary. No
behavior changes.
2.2.1
- Compliance: addressed every item from a WordPress.org Plugin Check
scan – added the required License/License URI header and a LICENSE.txt
file, updated readme.txt’s “Tested up to” and added the missing Short
Description, replaced a raw is_writable() call with WordPress’s
wp_is_writable() wrapper in uninstall.php, added a missing translators
comment for a string with a placeholder, and annotated every direct
database call and nonce-verified-via-shared-helper AJAX input with the
specific reasoning (no WP_Query equivalent exists, cache is invalidated
immediately after, or the nonce check already happened one line above
via PIXELCINCH_Security::assert_request() – which static analysis can’t trace
into on its own). No behavior changes.
2.2.0
- Change: “Manage WebP images” (step 3) now detects every WebP image in
your library over 100KB – not just ones this plugin converted. Images
uploaded as WebP directly, or produced by something else (a
hosting-level optimizer, another plugin), now show up too and can be
compressed further the same way. Untracked images that are already
under 100KB are simply left alone, same as before. - Deleting an original only applies to images this plugin converted
(there’s a file to delete); for untracked WebP images there’s nothing
to delete since the WebP file is the only copy – the row clearly notes
this and you can still compress it further.
2.1.0
- Change: split the single admin page into three – Tools (day-to-day
scan/convert/manage actions), Features (integrations like automatic
WebP serving and Media Library detection), and Settings (persisted
defaults) – with tabs to move between them. - New: “Your Media Library right now” overview on the Tools page, showing
real counts of images pending conversion, already converted by this
plugin, and already WebP but not tracked by this plugin (e.g. uploaded
as WebP directly, or optimized automatically by some hosts). Clears up
the confusing case where “Scan & Convert” reports nothing to do while
the manage list also shows nothing – usually it just means there’s
nothing outside what’s already covered. - Fix: the “Install to uploads/.htaccess” button was refusing to run on
any server that didn’t literally identify itself as “Apache” – which
wrongly blocked LiteSpeed (used by many shared hosts, including
Hostinger), even though LiteSpeed reads .htaccess the same way Apache
does. It now only blocks on Nginx, which is the one case where
.htaccess genuinely has no effect.
2.0.0
- New: Settings page (right on the main screen) to set your defaults —
default compression mode, default scan filters, auto-convert-on-upload,
background conversion, and auto-purge — so you don’t have to reconfigure
every run. - New: convert new uploads automatically as soon as they’re added to the
Media Library (optional, off by default), respecting your saved
file-type/size filters and any excluded images. - New: “Convert to WebP” / “Exclude from WebP conversion” row actions and
bulk actions right in the normal Media Library screen (Media > Library),
so you don’t have to leave that screen. - New: exclude specific images permanently from every scan, auto-convert,
and the background job, from the Media Library row action. - New: automatic WebP-serving rules for images this plugin didn’t convert
directly (theme assets, hardcoded template images) — an Apache
installer that only ever writes to wp-content/uploads/.htaccess (never
your site’s main .htaccess), plus a copyable Nginx snippet. - New: detects common offload/CDN plugins (WP Offload Media, WP-Stateless,
etc.) and warns that local file operations may not match what’s
actually served, since this plugin only reads/writes local disk. - New: optional auto-purge — automatically delete original files N days
after conversion, instead of relying on remembering to clean up
manually. Off by default. - New: optional background conversion via WP-Cron — processes a small
batch of pending images every 5 minutes so a large library finishes
converting without needing the browser tab open. Off by default. - New: dashboard widget showing images converted, space saved, images
still over 100KB, and originals still awaiting review. - Security: centralized error logging. Real error detail (which can
include server file paths, e.g. from Imagick exceptions) now only ever
goes to the server’s own debug log when WP_DEBUG_LOG is enabled – AJAX
responses only ever contain short, generic messages. Also suppresses
PHP error/warning display specifically during this plugin’s AJAX
requests as defense in depth, and wraps every risky operation
(compression, batch conversion, deletion) in try/catch so an unexpected
failure can’t leak internals to the browser.
1.4.0
- New: scan filters on the Media Library optimizer. Choose which file
types to include (JPG/PNG/GIF, individually), and optionally set a
minimum file size so only images at or above that size are scanned –
e.g. “only images over 100KB” – leaving smaller, already-lean images
untouched. Unchecking the size filter scans images of every size, and
checking every file type scans everything, so both “scan all” and
narrower runs use the same controls.
1.3.0
- New: converting an image now automatically rewrites any existing pages
or posts that link to the old file, pointing them at the new WebP file
instead. This is a direct content rewrite – no redirects are created.
It covers the full-size image and every registered thumbnail size, and
runs again as a safety check right before an original file is deleted
(useful for images converted by an older version of the plugin). - New: “Manage converted images” replaces the old all-or-nothing delete
tool. It lists your converted images (by default only the ones still
over 100KB), and lets you tick just the ones you want and delete only
their originals – not the whole library at once. - New: per-image “Compress further” control. Pick a quality level with
the slider and re-encode that single image on demand, without waiting
for a full library re-scan. Uses the original file as the source when
it’s still available for a cleaner result, and keeps the image at its
current dimensions so it doesn’t jump back up to full resolution.
1.2.0
- Fix: the settings page is now registered as its own top-level “WebP
Fetcher” menu item, so it’s easy to find in wp-admin instead of only
appearing as a submenu under Media. - Fix: the admin page now always appears, even on servers missing
Imagick/GD WebP support. Previously the whole menu item silently
disappeared in that case; now the page loads and clearly explains
the missing requirement, with the tools disabled until it’s resolved. - New: “Delete original files” tool. After converting your Media
Library to WebP, once you’ve reviewed the results and are sure, you
can permanently delete the leftover original JPG/PNG/GIF files to
reclaim disk space. This requires ticking a confirmation checkbox
plus a browser confirmation dialog, and only ever deletes files this
plugin itself converted and recorded – never anything else.