A rescue job on a self-hosted lifestyle and craft blog, and a good illustration of what years of accumulated plugins do to a WordPress site.
What I walked into: three page builders running at once, 31 active plugins, no child theme (so every update wiped her customizations — which is why the site kept breaking), a blank site title that made every page and social share render as a stray hyphen, and every post filed under a category literally misspelled Uncatorgized. Two competing mail plugins were producing 72 failed emails a month, and open registration had been farmed into ~530 spam accounts alongside ~3,100 blocked login attempts.
The constraint that shaped everything: WordPress admin access only — no SSH, no SFTP, no control panel, so none of the usual tooling was available. Everything had to be deliverable through the admin screen.
So I built a proper child theme (~3,700 lines of PHP, CSS, and JS) deployed as a ZIP, drove all the bulk content work through the WordPress REST API, and wrote a 909-line idempotent migration for the ~19 database changes the API can't reach — resolving categories by slug and pages by path so IDs from my local mirror could never leak into production. Safe to re-run.
Then the actual diagnosis: her complaint was “my posts don't show up in their category,” and the cause wasn't a broken link — 18 hand-built Pages were standing in for category archives that never listed anything. I replaced them with real archives and a proper 30-category hierarchy, refiled 29 posts, and rewired 30 nav items to taxonomy objects so the menu survives a domain change.
Every change was proven on a full local mirror of the live site before it went anywhere near production. The goal was never just a redesign — it was handing the site back in a state she can edit herself, so she never has to hire this out again.