

The Control Center: your whole library, now showing where each image is actually used - sort by it to surface what nothing points at.
WordPress will not let you change the file behind an existing attachment. You delete, re-upload, then hunt down thirty broken images by hand.
EvoMedia replaces the file in place, keeps the attachment ID, and rewrites every reference to it across your whole database – post content, postmeta, and the serialized structures page builders and custom fields store their data in. Any file, not only images: a PDF price list re-issued every month is swapped in one step, links intact.
That last part is the whole point. An image URL is not only in your post content: it is buried inside Elementor’s JSON, ACF fields and WooCommerce gallery meta, all of it serialized, where a naive search-and-replace corrupts the data and takes the page down with it. The section below explains why.
The same engine then lets it do something no image optimizer does: convert a JPEG to WebP and keep the attachment, renaming photo.jpg to photo.webp and repointing every reference at the new file. Other plugins keep the original and add a parallel file served through an .htaccess rule, a <picture> tag or a CDN. EvoMedia changes the actual file on your disk. There is no rewriting layer at page-render time – nothing to break when you switch hosts, and nothing to un-install later.
And once your library grows, EvoMedia helps you see into it: an index of where every file is actually used – a PDF linked from ten pages included – so you know what is safe to remove, plus reports of the duplicate and orphaned files quietly wasting your disk.
Everything runs on your own server, through Imagick or GD: no account with us, no credits, no monthly quota, no upload limit. The one thing that can ever leave your server is optional and switched on by you – enter your own API key and EvoMedia can ask OpenAI, Google or Anthropic to write the alt text of an image you press the button on. With no key it makes no network requests at all.
Alt text is the one field on an image that is always in use. A theme may never print a caption or a description, but the alt attribute goes out with every image WordPress renders, is what a screen reader announces, and is what a search engine reads the picture through. It is also the field nobody fills, because WordPress offers it one image at a time behind a modal.
EvoMedia puts it under the file name in the Control Center, where you can read it and correct it without leaving the list, and adds a view that shows only the images that have none – with the count beside it, so you know how big the job is before you start.
And if you want help writing them, you can bring an API key from OpenAI, Google or Anthropic and let a model describe the picture. The suggestion lands in the open editor and waits: nothing is stored until you accept it, because a sentence written straight into sixty alt attributes is how a library fills with confident nonsense nobody read. You choose which language the answer comes back in, so a site selling into another country is not stuck with the language it is written in.
There is no service of ours in the middle, no account to create with us, and no markup: the request goes from your server straight to the provider, on your key and your bill. Leave the key empty and nothing about this ever runs.
Try this with any other tool: put an image in an Elementor section, then rename the file. Elementor stores its layout as a serialized PHP array inside postmeta, and every string in it is prefixed with its own byte length. Change photo.jpg to photo.webp with a plain SQL replace and the recorded length no longer matches the string. PHP refuses to unserialize it. The section disappears.
EvoMedia walks the structure, replaces the value, and lets PHP recompute the lengths. This is why it can offer replace, format conversion and (in the Pro add-on) renaming at all – and it is the part that took the longest to get right.
Every upload, WordPress quietly creates a stack of resized copies – thumbnail, medium, large, and hidden HiDPI versions – whether your theme uses them or not. EvoMedia lists every registered size with a live count of how many images in your library have it, lets you turn off the ones you don’t need (only new uploads and regenerations are affected – files already on disk are left alone), and regenerates your whole library to match with a single button and a progress bar. Core sizes are flagged, so you never switch off one the theme relies on by accident.
Every library accumulates images nobody uses, and the reason they are never cleared out is that you cannot tell which ones they are. Deleting the wrong one takes a page down.
EvoMedia scans your posts, pages, custom fields and site settings and records where each image is referenced – including the ones page builders name by ID with no URL to search for, and the ones held in a category image, an author profile or your site logo. Each image then carries a count you can sort by, and opening it lists the exact places, with the size each one uses.
It reports only what it can prove. An image referenced solely from a theme file, a stylesheet or an external service cannot be seen from the database, and every list says so. An image that has not been scanned yet shows “?” and never “0” – because “nobody uses this” and “nobody has looked” are different answers, and confusing them is how cleanup tools delete pictures that were still on a page.
The same honesty applies to sizes. The count tells you an image is in use; it cannot always tell you which sub-size, because page builders store the image and choose the size while the page is being drawn. The Image Sub-sizes panel says so where you would act on it, rather than letting a confident number imply more than it knows.
Media plugins break each other. EvoMedia is written to notice what else is installed:
Everything EvoMedia does runs on your own server, with one exception that you switch on yourself: writing alt text with AI.
If, and only if, you enter an API key in Settings, pressing the AI button on an image sends that image and a short text instruction to the provider you chose, so it can describe the picture; the answer comes back as suggested alt text. Nothing is sent until you press the button, nothing is sent in the background, and no service of ours sits in the middle – the request goes from your site straight to the provider, on your key and your account.
One provider is used at a time, and only the one you switch on is ever contacted:
Leave the key empty, or remove it, and the plugin makes no network requests at all.
PHP 8.1 or later, and either Imagick (recommended) or GD. Which output formats you can use depends on your host’s image driver – WebP and AVIF are common, JPEG XL is rare; the System Info page tells you exactly what your server can do.
Every WordPress library fills with weight nothing uses: the same photo uploaded three times, sub-sizes no theme touches, the full-resolution originals beside every large image. It never gets cleaned out for one reason – you cannot safely tell what is still in use.
The free EvoMedia shows you where that waste is. EvoMedia Pro clears it, and does the one thing other cleanup plugins get dangerously wrong: it never removes anything your site still needs. Before deleting a file it re-checks your live content, not a stale scan.
EvoMedia Pro installs alongside this plugin and needs it to run.
None of that code is in this plugin. This is not a trial and has nothing locked or limited: no licence check, no upsell nag, no counter, no expiry, no cap on how many images you may process. Everything it ships, it does.