WordPress Plumbing 101

On the noble art of unclogging digital sewage

I want to talk to you about plumbers. Real plumbers. The ones with the trucks and the wrenches and the crack of their ass showing when they bend over to look at your toilet. I want to talk about these people because I have come to believe, after fifteen years in this industry, that they are better than us. Not just better at their jobs, which they obviously are, but better as human beings, better as contributors to civilization, better in the eyes of whatever god you believe in, if you believe in one, which after working on enough WordPress sites you probably don't anymore.

A plumber provides an actual service. When a plumber fixes your pipes, you can flush your toilet again. You can take a shower. You can wash your dishes without sewage backing up into your sink and making your kitchen smell like the inside of a whale that died eating nothing but gas station sushi. This is a tangible improvement to human life. This is civilization. The Romans built aqueducts, and plumbers are the inheritors of that legacy, the keepers of the flame, the guardians of the pipes that keep us from dying of cholera like medieval peasants.

And what do I do? I make websites appear slightly higher in Google search results. I move numbers on a spreadsheet. I write reports that say things like "organic traffic increased 23% quarter over quarter" and pretend this matters, pretend this is a contribution to society, pretend that when I die Saint Peter will look at my life's work and say "ah yes, this one helped a SaaS company rank for 'best project management software' - truly a life well lived, come on in."

A significant portion of my job - maybe forty percent, maybe more - is functionally identical to plumbing. Except instead of actual pipes full of actual sewage, I'm dealing with WordPress installations full of digital sewage, which is somehow worse because you can't even smell it coming. It just sits there in the database rotting, and nobody knows it's rotting until one day Google stops sending traffic and the client calls you in a panic and you have to put on your waders and descend into the pipes.

The Call Comes In

The call always comes in the same way. The client is panicked. The client is confused. The client does not understand why their website, which was working fine, which was ranking fine, which was doing everything it was supposed to do, has suddenly stopped working fine. They speak to you like you are a doctor and their child is sick, except the child is a WordPress installation that they have been feeding nothing but garbage for six years, and now they're surprised it has gout.

"Our traffic dropped," they say. "We don't know what happened. We didn't change anything."

This is a lie. They always changed something. They just don't remember changing it, or they don't think the thing they changed counts as a change, or the person who changed it left the company and didn't tell anyone, or they hired a "developer" from Fiverr who "optimized" the site by installing seventeen plugins that conflict with each other in ways that would make a Byzantine theologian weep.

"We didn't change anything," they insist. "We just installed a new caching plugin. And a new security plugin. And we switched themes because the old theme wasn't mobile-friendly. And we added a popup for email collection. And we integrated with our new CRM. And we installed a plugin that was supposed to make images load faster but now images don't load at all. But other than that, nothing."

This is like calling a plumber and saying "We don't know why the toilet is clogged, we didn't flush anything unusual, just some paper towels and a ham sandwich and a small decorative gourd that fell in by accident and a washcloth that we were going to fish out but then we forgot and also my kid has been flushing Lego minifigures for the past three months but that can't be related."

The plumber sighs. I sigh. We both sigh, across the vast divide of our professions, united in our exhaustion.

The Descent Into the Pipes

And so you log into the WordPress admin. You enter the backend. You descend into the pipes. And what you find there - what you always find there - is a archaeological dig site of human failure, layer upon layer of decisions made by people who are no longer employed, implemented by developers who have moved on to other projects, using plugins that haven't been updated since the Obama administration.

The plugins. Oh god, the plugins. Let me tell you about the plugins.

A healthy WordPress installation should have maybe ten plugins, maybe fifteen if you're doing something complicated, maybe twenty if you really need specific functionality that doesn't exist in the core. This is reasonable. This is manageable. This is a plumbing system with the standard number of pipes and fixtures and you can understand how it all connects.

But that's not what you find. That's never what you find. What you find is forty-seven plugins. Sixty-three plugins. I once found a WordPress installation with ninety-four plugins. Ninety-four. That's not a website, that's a superfund site. That's not a content management system, that's a content mismanagement system. That's a monument to the human capacity for self-destruction through accumulation.

Field Guide to WordPress Enemies

Know your adversaries. They lurk in every install.

Goomba Goombas The 94 plugins. Small, dumb, deadly in numbers.
Piranha Plant Piranha Plants Contact Form 7. Lurking in pipes, biting unexpectedly.
Thwomp Thwomps Bloated themes. Crushing page speed flat.
Chain Chomp Chain Chomps Database bloat. Chained to wp_options, devouring RAM.
Boo Boos Hidden malware. Only visible when you check the code.
Bullet Bill Bullet Bills Security vulnerabilities. Fired at you from nowhere.
Bowser
Bowser

The client's "web guy from 2014" who built this nightmare.

And the plugins! What are these plugins? Let's take a look:

There are three different SEO plugins, all active, all fighting with each other, each one adding its own meta tags, its own canonical URLs, its own schema markup, so that Google looks at the site and sees triple of everything, like a drunk trying to read a menu.

There are four security plugins, which is ironic because having four security plugins is itself a security vulnerability, each one scanning the other three as threats, each one logging the other three's activity as suspicious, an immune system so overactive it's attacking itself like an autoimmune disease made of PHP.

There is a plugin called "WP Speed Optimizer Pro" that was last updated in 2019 and, according to my analysis, makes the site approximately 40% slower by adding JavaScript that "optimizes" the loading of other JavaScript by loading more JavaScript to manage the loading of the JavaScript.

There is a plugin that adds a snow effect to the website during December. It is May. The plugin is still active. The snow is still falling. It has been snowing on this website for seventeen months. Somewhere in the codebase, winter never ends.

There is a plugin called "Contact Form 7" and also a plugin called "WPForms" and also a plugin called "Gravity Forms" and also a plugin called "Ninja Forms." Four form plugins. The site has two forms. Nobody knows why there are four form plugins. Nobody remembers installing the other three. They are just there, like sedimentary layers, like geological strata, like the rings of a tree that has lived through many hard winters.

There is a plugin that adds a cookie consent banner. There is another plugin that also adds a cookie consent banner. The site currently displays two cookie consent banners, stacked on top of each other, asking the user twice if they consent to cookies, as if one consent wasn't enough, as if the site needs to be really, really sure.

There is a plugin that claims to "clean up" the WordPress database by deleting old revisions and transients and orphaned metadata. This plugin has never been run. The button that says "Clean Now" has never been clicked. The database contains 340,000 post revisions for a blog with 47 posts. This is a database with more history than content, more memory than meaning, like a person who can't throw anything away and now lives in a house made entirely of old newspapers.

Plumbing 101: The Database Bloat Check

Your database is probably 10x larger than it needs to be. Here's how to check and fix it.

  • Check database size. phpMyAdmin or your host's control panel will show you. A simple blog should be under 100MB. If you're at 500MB+ for a small site, you have bloat.
  • The wp_options table is usually the culprit. Run this query: SELECT SUM(LENGTH(option_value)) FROM wp_options WHERE autoload='yes'; Over 1MB autoloaded? Something is wrong.
  • Limit post revisions. Add to wp-config.php: define('WP_POST_REVISIONS', 5); This caps revisions at 5 per post. Do this before cleaning or they'll just grow back.
  • Delete old revisions. WP-Optimize plugin, or direct SQL: DELETE FROM wp_posts WHERE post_type = 'revision'; Backup first. Obviously.
  • Transients accumulate forever. Expired transients should auto-delete but often don't. DELETE FROM wp_options WHERE option_name LIKE '%_transient_%'; clears them. Safe to run.

There is a plugin for a social sharing feature that integrates with Google+. Google+ has been dead for five years. The plugin persists, like a ghost haunting the database, waiting for a social network that will never return.

And these are just the active plugins. The inactive plugins - the ones that are installed but not activated, the ones that sit in the plugins folder taking up space and posing security risks - these number in the dozens. They are the dead, the deactivated, the plugins that someone installed, tried once, didn't like, and then forgot about. They accumulate like corpses on a battlefield that no one has bothered to bury.

Plumbing 101: The Plugin Audit

Go to Plugins, then Installed Plugins. Now actually look at what's there.

  • Check "Last Updated" dates. Anything over 2 years is a liability. The developer has moved on. The plugin is now a security hole waiting to happen.
  • Count your SEO plugins. You need one. Yoast AND RankMath AND All-in-One SEO means they're fighting each other. Pick one, delete the rest.
  • Count your security plugins. Same deal. Wordfence OR Sucuri OR iThemes. Not all three. They conflict. They log each other as threats.
  • Deactivated plugins are not "saved for later." They're attack surface. Deactivated and untouched for six months? Delete it.
  • The nuclear diagnostic: Deactivate all plugins. Re-enable one at a time. Check site speed after each. You'll find the culprit.

The Themes

The WordPress theme system was designed to let non-technical people change the appearance of their website without touching code. A noble intention. An intention that launched approximately forty thousand theme developers of varying quality, and by "varying quality" I mean a spectrum that ranges from "competent professional" to "my nephew learned HTML last week."

The site you are auditing has installed seventeen themes. Only one theme can be active at a time in WordPress. Seventeen themes are installed. Sixteen of them are sitting there, doing nothing, taking up space, presenting security vulnerabilities, because theme developers have an inconsistent relationship with the concept of "security updates."

The active theme is called something generic and meaningless, purchased from ThemeForest for $59 in 2017, built by a developer in Eastern Europe who has since pivoted to cryptocurrency, last updated eighteen months ago, and containing approximately 47,000 lines of code to accomplish what could be done in 2,000.

The theme has a "theme options" panel with 340 settings. Three hundred and forty ways to customize the theme. You can change the header style. You can change the footer style. You can change the sidebar style. You can enable a "sticky header" that follows you down the page like a haunting. You can add a "preloader" animation that shows a spinning logo while the site loads, which is ironic because the preloader itself adds 200 kilobytes to the page weight and makes the site load slower, so the preloader is essentially a loading screen for itself, an ouroboros of poor performance.

The theme includes bundled plugins. Bundled plugins are plugins that come packaged with the theme, installed automatically, maintained by no one. The theme includes a bundled version of "Revolution Slider" from 2019. Revolution Slider has had fourteen security vulnerabilities since 2019. The theme still includes the 2019 version. The client does not know this. The client will not know this until their site gets hacked and starts redirecting visitors to a pharmacy in Moldova.

The theme generates HTML that looks like it was written by a committee of people who had never met each other and communicated only through a game of telephone. There are divs nested inside divs nested inside divs, seventeen layers deep, a matryoshka doll of meaningless containers, each one adding nothing but complexity. The CSS has 23,000 lines. Twenty-three thousand lines of CSS. For context, the entire Bootstrap framework - one of the most comprehensive CSS frameworks ever created - is about 10,000 lines. This theme has more than twice that, and it doesn't do half as much.

And this is the foundation. This is what everything else is built on. This is the pipe system that the plugins are connected to, the sewer main that everything else flows into. And it is, to use a technical term, completely fucked.

Plumbing 101: The Theme Audit

Appearance, then Themes. Delete everything except your active theme and one default theme (Twenty Twenty-Four) as a fallback.

  • View Source on any page. Count the nested divs. If you hit double digits before reaching actual content, the theme is bloat.
  • Check your CSS file size. Open DevTools, Network tab, filter by CSS. Over 500KB total? Theme problem. Over 1MB? Burn it down.
  • Look for bundled plugins. Appearance, then Install Plugins. If your theme wants to install Slider Revolution, Visual Composer, or anything with "Pro" in the name, these will never be updated. They're landmines.
  • Count the theme options. More than 50 settings? The theme is trying to be everything to everyone. It will be slow at all of it.
  • Run GTmetrix or PageSpeed Insights. If "Reduce unused CSS" is a top recommendation, your theme ships 20,000 lines of CSS to show 200.

Mario Super Mario and the Eternal Descent

Super Mario is the patron saint of this profession. He does not know it. I have not consulted him.

Super Mario is a plumber. This is established canon. He is a plumber from Brooklyn who, through a series of events that have never been adequately explained, found himself in the Mushroom Kingdom, tasked with rescuing a princess from a turtle dragon. He has been rescuing this princess for forty years. He has never once complained. He has never once asked why the princess keeps getting kidnapped, why the Mushroom Kingdom has not invested in better security, why the same turtle dragon is allowed to continue his reign of princess-kidnapping despite being defeated dozens of times. He just puts on his overalls, grabs his wrench, and goes down the pipe.

When you log into a WordPress installation and find ninety-four plugins and seventeen themes and a database with 340,000 post revisions, you must channel Mario. You must not ask why. You must not wonder how. You must simply accept that this is the Mushroom Kingdom you have been given, that the princess is kidnapped again, that the same problems recur because the same mistakes are made, that Bowser will never stop being Bowser, and that your job is to go down the pipe anyway.

Mario goes down green pipes. We go down the wp-admin login. Mario stomps on Goombas. We deactivate plugins. Mario collects coins. We collect screenshots for the audit report. Mario defeats Bowser. We restore the site from backup after the client "tried something" and broke everything.

Mario is not a hero in the traditional sense. Mario is a maintenance worker. He's not slaying dragons for glory or treasure. He's fixing a problem that keeps recurring because the underlying system is broken. The Mushroom Kingdom has a structural problem - it keeps producing turtle dragons and losing princesses - and Mario's job is not to fix the structural problem but to mitigate its symptoms, over and over, world after world, castle after castle, until the end of time.

We are not heroes. We are maintenance workers for a broken system. WordPress keeps producing bloated sites and losing rankings, and our job is not to fix WordPress - we cannot fix WordPress, WordPress is what it is - but to mitigate its symptoms, site after site, audit after audit, until the heat death of the universe or the day Google decides to stop indexing websites entirely, whichever comes first.

The Conversation

And then comes the conversation. The conversation is the worst part. The conversation is worse than the plugins, worse than the themes, worse than the database bloat, worse than the seventeen security vulnerabilities and the outdated PHP version and the shared hosting that goes down every time someone looks at it funny.

The conversation goes like this:

"So," the client says, "what did you find?"

And you have to explain to them. You have to explain that their website, their precious website, the website they paid $15,000 for in 2018, the website they believed was an "investment in their digital presence," is a disaster. You have to explain that the developer who built it did not know what they were doing. You have to explain that the plugins they installed based on recommendations from a Facebook group are actively harming their site. You have to explain that the theme they chose because it had a nice demo is a bloated nightmare that adds three seconds to every page load.

You have to explain this without making them feel stupid, because they are paying you, and people do not like to pay people who make them feel stupid. But you also have to explain it honestly, because if you don't, they won't understand why your recommendations matter, and they won't implement them, and in six months they'll call you again with the same problems, and you'll have the same conversation, and this cycle will continue until one of you dies or retires or the sun explodes.

"Your site has some technical issues," you say, diplomatically. "Some opportunities for improvement."

"Opportunities for improvement" is consultant-speak for "this is bad." Clients have learned this. They know what "opportunities for improvement" means. They brace themselves.

"What kind of opportunities?"

"Well," you say, "the theme you're using is adding about 2.5 seconds to your page load time. The plugins are conflicting with each other and generating duplicate content. The database hasn't been optimized in six years and it's about four gigabytes larger than it needs to be. There are some security vulnerabilities that should be addressed. And the hosting you're on is shared hosting, which means you're sharing server resources with about three hundred other websites, some of which appear to be spam blogs in Romanian."

The client processes this. You can see it happening - the stages of grief, compressed into about fifteen seconds. Denial ("That can't be right, we paid a lot for this site"), anger ("Why didn't anyone tell us this before?"), bargaining ("Can we just fix the most important things?"), depression ("We're never going to rank, are we?"), and finally, acceptance ("What do you recommend?").

"I recommend," you say, and then you give them a list. The list is long. The list is expensive. The list involves things like "migrate to better hosting" and "replace the theme" and "audit all plugins and remove the unnecessary ones" and "optimize the database" and "implement a proper caching strategy" and "set up a staging environment so changes can be tested before going live."

The client looks at the list. The client looks at the price. The client says:

"Can we just install a caching plugin?"

And here is where we return to the plumber analogy, because this is the equivalent of a plumber saying "Your pipes are corroded, your main line is collapsing, and there's a blockage the size of a watermelon somewhere in your sewer system," and the homeowner responding "Can we just pour some Drano down the drain?"

Yes, technically, you can pour Drano down the drain. The Drano might even help, briefly, in the same way that a caching plugin might help, briefly. But the Drano is not going to fix the corroded pipes. The Drano is not going to stop the main line from collapsing. The Drano is not going to dissolve the watermelon-sized blockage that has been accumulating in your sewer system for the past decade because you kept flushing things you shouldn't flush.

The caching plugin is Drano. It's a band-aid on a bullet wound. It's a fresh coat of paint on a house with a crumbling foundation. It's treating the symptom while ignoring the disease. And yet it's what clients always want, because it's cheap, because it's easy, because it doesn't require them to confront the fundamental truth that their website was built poorly and maintained worse and the only real solution is to tear it down to the studs and start over.

"Yes," you say, because what else can you say, "we can install a caching plugin."

And you install the caching plugin. And it helps, a little, for a while. And then six months later they call you again because the site is slow again and something is broken and could you take a look, and you log in, and you find that they've installed eight new plugins since you last spoke, and the cycle continues, and the cycle will always continue, and somewhere out there Super Mario is going down another pipe to rescue the same princess from the same castle and he's not complaining so neither should you.

Plumbing 101: What Caching Actually Does (And Doesn't)

Caching saves a static copy of your pages so WordPress doesn't rebuild them from scratch every time. It's useful. It's not magic.

  • Caching hides slow code, it doesn't fix it. If your uncached page takes 8 seconds to generate, you still have an 8-second problem. The first visitor, logged-in users, and cache misses all hit that 8 seconds.
  • Test if caching is working. Open DevTools, Network tab, reload the page. Look for x-cache: HIT in response headers. No HIT? Caching isn't working.
  • Caching plugins conflict with everything. WooCommerce carts, membership sites, personalized content, AJAX forms - all break caching or get broken by it. This is why "just install a caching plugin" fails.
  • The real fix for speed: Better hosting, fewer plugins, lighter theme. Caching is the last step, not the first. You're polishing a car that doesn't run.
  • If you must cache: WP Super Cache for simple sites. WP Rocket if you have budget. LiteSpeed Cache if your host supports it. One plugin. Not three.

The Nobility of Filth

There is something noble in this work. Something holy about the filth.

The plumber who unclogs your toilet does not receive praise. Nobody throws the plumber a parade. Nobody writes articles about how the plumber is "disrupting the sanitation industry" or "revolutionizing the way we think about waste management." The plumber shows up, does the work, gets paid, and leaves. The plumber's contribution to civilization is invisible and taken for granted and absolutely essential.

Without plumbers, cities would drown in their own sewage. This is not a metaphor. This is literally what would happen. The Black Death killed a third of Europe, and a significant reason it was able to do so was poor sanitation. Plumbers - real plumbers, the ones with the trucks and the wrenches - are the thin line between civilization and cholera. They are more important than doctors, in a sense, because they prevent the diseases that doctors have to treat. They are the invisible infrastructure of human survival.

And what am I? What are we, the WordPress plumbers, the SEO sanitation workers, the digital dung beetles?

We are... less important. Obviously. If every SEO practitioner disappeared tomorrow, the world would continue. Google would continue. Websites would continue to exist, would continue to rank, would continue to be found. The absence of SEO would not cause a plague. The absence of SEO would not collapse civilization. The absence of SEO would barely be noticed by anyone except the SEO practitioners themselves, who would have to find new jobs, probably in plumbing, which would be an improvement for society overall.

This is the truth. This is the reality that we must confront, late at night, when we're staring at a WordPress installation with ninety-four plugins and wondering where our lives went wrong. We are not essential. We are not saving lives. We are helping websites appear slightly higher in search results for people who are searching for "best pizza near me" or "how to remove a stripped screw" or "is my cat plotting to kill me."

The work matters, in its small way. The small business owner who can be found on Google - that matters to them. The restaurant that shows up when someone searches for "Italian food downtown" - that matters to the restaurant, and to the person who was hungry and found good food. The plumber who ranks for "emergency plumber near me" - and here we come full circle - that plumber can help someone whose pipes just burst at 2 AM, and that matters, that genuinely matters.

We are the plumbers of the plumbers. We help the plumbers be found. We help the restaurants be found. We help the small businesses survive in a world dominated by corporations with infinite marketing budgets. We do this by going into the pipes, by cleaning up the WordPress messes, by fixing the technical debt accumulated by a thousand bad decisions, by explaining - patiently, repeatedly, endlessly - that no, you should not install another plugin, no, you should not switch themes again, no, you should not hire your nephew to "update" the site.

It is not noble work. But it is honest work. And there is a difference.

The Shower

After a WordPress audit, I take a shower. A long shower. The kind of shower that uses all the hot water and makes your skin turn red and your fingers turn pruney and your roommates bang on the door asking if you're okay.

I am not okay. I am never okay after a WordPress audit. I have seen things. I have seen plugin configurations that defy comprehension. I have seen database tables with twelve million rows for a blog that has fifty posts. I have seen security vulnerabilities stacked on top of security vulnerabilities like a Jenga tower of potential hacks. I have seen it all, and it does not wash off easily.

The plumber showers after work too. The plumber has been in actual sewage, actual human waste, the physical manifestation of everything that society prefers not to think about. The plumber's shower is more justified than mine. The plumber has earned that shower in a way I have not.

But I take the shower anyway. I stand under the water and I let it run over me and I try to forget about the ninety-four plugins and the seventeen themes and the database bloat and the caching plugin that the client insisted on installing even though I told them it wouldn't help. I try to forget about the next audit, and the one after that, and the one after that, the endless parade of broken WordPress sites that stretches out before me like a highway through hell.

I think about Super Mario. I think about how Mario never showers, as far as we know. Mario just goes from pipe to pipe, castle to castle, world to world, never stopping, never complaining, never asking why the princess keeps getting kidnapped or why Bowser keeps coming back or why the Mushroom Kingdom doesn't just build a wall or something. Mario just does the work. Mario is the ideal we should all aspire to.

But I am not Mario. I am just a person who looks at WordPress sites for a living. And so I take my shower, and I dry off, and I sit down at my computer, and I open the next ticket, and there's another WordPress site waiting for me, another descent into the pipes, another conversation about caching plugins, another day in the trenches of digital sanitation.

It's a living. It's not plumbing. But it's a living.