Skip to content
WP security & maintenance

WordPress Plugin Audit: How to Cut Your Plugin Count by 40% Safely

A WordPress plugin audit framework that cuts plugin count 40% safely: usage logs, alternative-finder, replacement mapping, and a staged removal protocol.

By WitsCode9 min read
WP security & maintenance

The fastest safe way to reduce WordPress plugins is to run a structured audit that sorts every active plugin into one of three buckets, keep, replace, or cut, and then remove the cut and replace candidates one at a time against a staging copy before anything touches the live site. That is the whole method. Most sites that follow it land near a 40 percent reduction, not because half the plugins were broken, but because a typical install accumulates single-purpose plugins that each do a job a few lines of code could do, plus two or three plugins that quietly overlap on the same task.

A WordPress plugin audit is worth doing for a reason that has nothing to do with speed, although speed usually improves. Every plugin you remove is one less thing to update, one less changelog to read, one less codebase that can ship a vulnerability, and one less vendor. Fewer plugins beats faster plugins, because a fast plugin you do not need is still a maintenance liability and still a line on the attack surface. This article is the framework WitsCode runs on client sites, written out in full so you can run it yourself, in the order we apply it.

Why fewer plugins is the real goal

It is tempting to treat plugin count as a vanity number, and it is true that 12 well-built plugins can outperform 6 bloated ones on raw page weight. But page weight is not the only cost a plugin carries. The cost that compounds is maintenance. Each plugin is an independent release cycle that can introduce a breaking change, a conflict with another plugin, or a security advisory that lands on a Friday afternoon. The WordPress vulnerability databases catalogue thousands of plugin disclosures every year, and the plugins involved are rarely the famous ones. They are the small, single-purpose, lightly maintained plugins someone installed years ago to add one feature and then forgot.

So the goal of the audit is not a smaller number for its own sake. The goal is a smaller surface. A site running 14 plugins where every one is actively maintained, actively used, and could not be reasonably replaced is in better shape than a site running 9 plugins where 3 have not seen an update in eighteen months. Count is a useful proxy, and 40 percent is a realistic target on a neglected site, but the thing you are actually shrinking is the set of independent failure points you are responsible for.

Step one, inventory and categorise

The audit starts with a complete inventory, because you cannot make decisions about plugins you have forgotten exist. Open the Plugins screen and write down every active plugin alongside three facts: what job it does in plain language, when it was last updated, and whether you can name a specific page or workflow that depends on it. The plain-language description matters because plugin names lie. A plugin called something like Ultimate Toolkit might be doing one tiny thing, while a plugin with a boring name might be load-bearing across the whole site.

Then sort the inventory into functional categories: security, SEO, performance, forms, content and editing, ecommerce, and a final bucket for utilities that do not fit elsewhere. This grouping is the single most revealing step in the audit, because the moment plugins sit next to their functional neighbours, the overlaps become impossible to miss. You will almost always find a category with three entries where one would do. That category is where the easy wins live.

Step two, find what is actually used

Categorising tells you what each plugin claims to do. The next step tells you whether anyone is using it. The cleanest evidence comes from usage logs. If the site runs an activity or audit-log plugin, or if the host exposes access logs, look for plugins whose admin pages have not been opened in months and whose features leave a trace you can search for. A redirect manager with zero redirects configured, a popup plugin with no active popups, a gallery plugin not referenced by any published page, a maintenance-mode plugin left active long after launch: these show up clearly once you go looking.

For frontend plugins, the browser tells the truth. Open the site in Chrome DevTools, watch the Network tab, and group requests by their folder under wp-content/plugins. A plugin that loads CSS or JavaScript on a page that does not use its feature is both a performance cost and a candidate for the cut list. For plugins that leave no obvious trace, ask the person who installed it, and if nobody remembers, that absence of memory is itself a finding. A plugin nobody can explain is one nobody will notice breaking.

Step three, identify single-purpose plugins

Now the inventory gets interesting. Walk the categorised list and flag every plugin whose entire job is one small thing that the theme could do with a short snippet in functions.php. This category is large on almost every site, and it is the source of much of the 40 percent.

The pattern is consistent. A plugin that adds a favicon. A plugin that inserts a single Google Analytics tag in the header. A plugin that disables comments site-wide. A plugin that removes the WordPress version number from the page source. A plugin that adds a custom logo to the login screen. A plugin that hides the admin bar for non-administrators. A plugin whose only function is to insert a snippet of code, which is itself a snippet of code wrapped in an update cycle. Each of these is genuinely useful behaviour, and each is somewhere between three and ten lines of well-understood PHP that belongs in a child theme. The plugin version of that behaviour adds an entire codebase, an update cadence, and a vendor, all to deliver something a competent developer can read and verify in under a minute.

The honest caveat is that a snippet is only safer if it lives in a child theme and is written by someone who can maintain it. Moving ten single-purpose plugins into one unreadable, undocumented block of code is not an improvement. The win comes from snippets that are short, commented, and grouped sensibly, so the next person can understand the whole thing faster than they could audit ten separate plugins.

Step four, find the overlap

The second large source of reduction is overlap, and the categorised inventory from step one is what surfaces it. The classic example is the SEO-adjacent cluster. A site ends up with a dedicated SEO plugin, plus a separate schema or structured-data plugin, plus a separate XML sitemap plugin, plus maybe a separate redirect manager and a separate breadcrumb plugin. Every modern SEO plugin already includes schema output, sitemap generation, redirect management, and breadcrumbs. Three or four plugins are doing work that one plugin does as a built-in feature, and worse, they sometimes fight, each emitting its own sitemap or its own competing schema block.

The same pattern repeats across categories. Two caching plugins layered on top of each other. A security plugin alongside a separate login-limiter and a separate two-factor plugin where the security plugin already does all three. An image optimisation plugin alongside a separate lazy-load plugin. In each case the audit move is the same: identify the most capable plugin in the category, confirm it covers the features the others provide, and mark the others for removal once their settings have been migrated.

Step five, the keep, replace, cut decision

Every plugin now gets a verdict. Keep means the plugin does a real job, is actively maintained, and has no reasonable replacement. A well-maintained SEO plugin, a backup solution, a forms plugin powering live forms, a payment gateway: these stay. Replace means the plugin's job should be done a different way, either folded into a more capable plugin you already run, moved into a child-theme snippet, or handled by the host or CDN instead. Cut means the feature is not used by anyone, the plugin is abandoned, or the feature was needed once and is not needed now.

The decision logic has a few firm rules. Anything not updated in over a year and not actively used goes to cut. Anything whose only function is a snippet goes to replace. Anything overlapping a more capable plugin goes to replace. Anything load-bearing and maintained stays as keep regardless of its page weight, because removing something the business depends on to save 20 kilobytes is a bad trade. When a plugin is genuinely ambiguous, default to keep and revisit next audit. The framework is meant to reduce risk, not to chase a number off a cliff.

Step six, the staging, test, remove protocol

This is the step that makes the audit safe, and skipping it is how plugin cleanups break sites. Nothing on the cut or replace list is touched on the live site. Every change is made on a staging copy first.

The protocol runs one plugin at a time. Spin up a current staging clone of the production site and take the first plugin on the list. If it is a cut, deactivate it, then click through the pages and workflows in its functional category, looking for anything that broke, specifically the frontend pages where its assets used to load. If it is a replace, first migrate the settings or rebuild the behaviour, the redirects moved into the SEO plugin, the snippet added to the child theme, then deactivate the old plugin and run the same checks. Confirm the staging site is clean. Only then delete the plugin rather than leaving it deactivated, because a deactivated plugin still sits in the filesystem and can still be exploited through a direct request. Then move to the next plugin and repeat.

Doing this one plugin at a time is slower than a mass deactivation, and that is the point. If something breaks, you know exactly which plugin caused it, because it is the only thing that changed. Once the full list is worked through and the staging site is verified, push the same changes to production in the same order, during a low-traffic window, with a fresh backup taken immediately before. Then watch the live site for a few days. A plugin's absence sometimes shows up in a place the staging clicks did not cover, and a recent backup makes that an inconvenience rather than an emergency.

What you are left with

A site that has been through this audit usually carries between a third and a half fewer plugins, and every remaining plugin can be explained: what it does, who uses it, why it cannot be replaced. The update list is shorter, the changelog reading is shorter, and the next security advisory is statistically less likely to name anything you run. The site is also typically faster, because the single-purpose and overlapping plugins removed were the ones loading frontend assets nobody needed, but speed is the side effect. The real result is a smaller surface that one person can hold in their head.

The framework above is the complete method, and it is free to run. What a paid engagement adds is judgement under uncertainty: knowing which abandoned plugin is quietly load-bearing, which two plugins conflict in a way that only appears under load, and which snippet is genuinely safer as code rather than as a maintained plugin. If you would rather hand the inventory, the staging runs, and the verified removal to the team that does this regularly, the WitsCode WordPress plugin audit ships as a fixed-scope engagement with a categorised inventory, a keep, replace, and cut list with reasoning, the staged removal work, and a verification pass on the live site. The framework is yours to use. The pattern recognition that tells us which plugin to leave alone is what the engagement is for.

Get weekly field notes.

Practical writing on shipping products, straight to your inbox. No spam.

Need help with this?

WordPress Development

We design and build web apps, MVPs, and SaaS products. Talk to us about what you are working on.

Talk to us

Want to discuss wp security & maintenance for your business?

Start a project and we'll talk through where you are, what's working, and the highest-leverage moves for the next 90 days.