How to Audit an Inherited WordPress Site: Your 2026 Guide
You inherit a WordPress site when something has already gone sideways. The old developer vanished. Nobody knows who owns the domain. Plugins are outdated. Search traffic may be…

You inherit a WordPress site when something has already gone sideways. The old developer vanished. Nobody knows who owns the domain. Plugins are outdated. Search traffic may be soft. And everyone wants answers before lunch.
How to audit an inherited WordPress site starts with control, not code. Secure access, verify backups, and confirm ownership before touching themes or plugins. Then triage for active security and stability issues, build a full asset inventory, inspect code and database behavior, and validate SEO crawlability with real metrics. The last step is turning findings into a remediation plan based on business risk, not developer curiosity.
If you skip that order, you waste time. Worse, you can lock yourself out, break production, or erase evidence you needed to diagnose the actual problem.
The First Step You Can’t Skip: Securing Access and Backups
Most inherited WordPress failures aren’t glamorous. They aren’t exotic malware or some weird edge-case hook deep in a custom plugin. They’re administrative messes. The domain is in a former employee’s account. Hosting bills go to an old card. Premium plugin licenses are tied to an agency email nobody can access.
Recent inherited-site guidance puts this plainly. Failures are often administrative rather than code-related, which is why you verify domain ownership, hosting ownership, and third-party subscriptions before making any changes. A key question is often not what plugins are installed, but who can approve, reset, or transfer each dependency when the original vendor is gone, according to this inherited WordPress audit guidance.
What you need to control first
Get a written inventory of every account tied to the site.
- WordPress admin access. Confirm you have an administrator account that you control, not one shared across staff.
- Hosting access. You need the actual account owner login, not just a support contact.
- Domain registrar access. If you can’t control renewals and DNS, you don’t control the website.
- Email addresses on file. Password resets go somewhere. Make sure they go to the right person.
- Backup location. Confirm where backups live and whether you can restore them.
- Paid dependencies. Themes, plugins, SMTP services, image optimization, security subscriptions, and anything else that can expire.
Backups are your undo button
Before changing a plugin, user role, theme file, or database setting, take a full off-site backup. Not just a database export. Not just media uploads. The whole thing.
Practical rule: If you haven’t tested whether a backup can be restored, treat it as unproven.
A clean backup gives you room to work. It also protects you from the most common rescue-project mistake, which is trying to “fix a few things quickly” on a live site with no rollback path. If you need a practical baseline, start with this guide on how to back up a WordPress site safely.
Review users before you trust the dashboard
Inherited sites often carry stale accounts, old contractors, and mystery admins. Audit every user. Remove accounts that no longer belong. Downgrade privileges where admin access isn’t necessary. Shared admin logins are lazy and dangerous.
Short version. If you don’t control access, ownership, and backups, you are not auditing the site yet. You’re standing in somebody else’s building with a flashlight.
Phase One Triage Immediate Security and Stability Checks
Inherited WordPress failures usually show up in one of two ways. The site is already compromised and nobody noticed, or it is one update away from going down. Phase one is about finding which problem you have before you touch anything that could make it worse.

Skip the cosmetic work. Ignore the minor SEO nags. Do not start with plugin cleanup because the plugin count looks ugly. A rescue audit starts with business risk. Can an attacker still get in? Can the site be restored if something breaks? Is there any sign the server, codebase, or admin layer has already been tampered with?
The first five checks I run
- Core file integrity. Compare WordPress core files against known-good versions and look for modified files in places they should never change.
- Unexpected admin users. Check for accounts with admin privileges, generic usernames, stale vendor logins, and users tied to email addresses nobody owns anymore.
- Exposed outdated code. Review active themes and plugins for old versions, abandoned code, and components with a history of public security issues.
- Logging and alerting. Confirm whether anyone would know if login attempts spike, files change, or the site starts throwing fatal errors.
- Restore risk. Verify that the latest backup can be restored and that the recovery path is clear if triage turns into incident response.
These checks sound basic because they are basic. They also catch a surprising share of real problems. On inherited sites, I find hidden admin accounts, altered files, expired security controls, and old plugins with known holes far more often than dramatic zero-day scenarios.
What good triage looks like
Good triage answers three questions fast. Is there evidence of compromise? Is there a single point of failure that can take the business offline? Can you investigate without making the situation worse?
That changes how you work. Update decisions become risk decisions, not housekeeping. If the site runs a fragile checkout, membership flow, or lead pipeline, a rushed bulk update can do more damage than the original problem. I would rather isolate a risk, document it, and schedule controlled remediation than break revenue because the dashboard wanted everything current by lunch.
Do not trust a healthy-looking admin area. A WordPress site can serve pages while cron is failing, backups are corrupt, logs are missing, and a malicious account still has access.
Triage is for reducing immediate risk, not proving the site is well maintained.
For a solid baseline, keep these WordPress security best practices next to your audit notes. For broader context on common web risks outside the WordPress bubble, Monro Cloud’s piece on mastering website security for 2025 is worth a read.
Building a Full Inventory of Every Site Asset
Inherited WordPress sites rarely fail because of one obvious thing in the dashboard. They fail because nobody has a reliable list of what is running, who depends on it, and what breaks if you touch it.
Inventory work is not glamorous. It is one of the highest-value parts of the audit because it turns guesswork into a plan. If triage answers, “Can this site survive the week?”, inventory answers, “What are we really responsible for?”
What belongs in the inventory
Start with WordPress itself, then expand outward into the parts that carry business logic, revenue, and operational risk.
| Asset | What to record | Why it matters |
|---|---|---|
| WordPress core | Installed version and update status | Old core widens compatibility problems and increases maintenance risk |
| Plugins | Active, inactive, must-use, and license status | Inactive plugins still leave code on disk, and expired licenses often block security patches |
| Themes | Active theme, parent theme, unused themes | Customizations often end up in the wrong layer and make future changes harder |
| Custom code | functions.php, must-use plugins, custom plugin folders, code snippets | Hidden business logic often lives in these files |
| Database | Large tables, options usage, transient buildup, odd custom tables | Slow queries, broken jobs, and data bloat often start here |
| Integrations | Forms, payments, CRM, email, search, caching, CDN, analytics | If one integration fails, the business usually feels it before the developer does |
The point is not to produce a neat spreadsheet for its own sake. The point is to identify which parts of the stack are safe to change, which parts are undocumented, and which parts are carrying more responsibility than they should.
Drift is normal on inherited sites
Older sites collect drift. Core changes. Plugin authors change direction. Themes get patched around instead of rebuilt. A previous developer drops business rules into a template file because it was faster that day, and now a checkout flow depends on code nobody remembers.
That drift creates real trade-offs. An old plugin may still run fine, but it can pin PHP, block other updates, and turn a simple maintenance job into a regression project. A custom theme may contain valuable layout logic, but if it also handles form processing, redirects, or API calls, every redesign becomes a risk exercise.
I also record ownership while I inventory. Who pays for the premium plugins? Who controls the DNS, CDN, transactional email service, and payment gateway? Technical sprawl is manageable. Unknown ownership is what stalls rescue work.
Inventory the code paths, not just the dashboard
A lot of important functionality never appears cleanly in wp-admin. You have to inspect the file system, the database, and the request paths the site uses.
Look for:
- Must-use plugins that load automatically and bypass the normal plugin screen
- Custom AJAX handlers in themes or plugins that process privileged actions
- Hard-coded third-party scripts dropped into templates, widgets, or header files
- License-bound features that stop receiving updates when the previous owner’s subscription lapses
- Staging leftovers and migration tables that make the database look more complicated than production really is
- Server-level behavior such as redirects, caching rules, cron jobs, and memory limits that affect WordPress but live outside it
Performance clues belong in the inventory too, even if you save the code analysis for later. A site with oversized assets, duplicate tracking scripts, and five layers of caching hacks is telling you how it got into trouble. Four Eyes has a practical breakdown of common WordPress page speed issues that often show up during this pass.
If the stack includes custom workers, background imports, or long-running jobs, check the host-level footprint as well. Some inherited sites are “slow” because a process is chewing through memory in the background. In those cases, it helps to know how to find memory leaks with OS tools before blaming WordPress for everything.
The dashboard shows what WordPress recognizes. The file system and database show what the site actually depends on.
A good inventory usually exposes the shape of the mess fast. Redundant plugins doing the same job. Business rules buried in theme files. Old tables from three migrations ago. Features nobody owns but everyone is afraid to remove. Once you can name those assets clearly, the rest of the audit stops being abstract.
A Deep Dive on Code, Performance, and Database Health
This is where a senior audit earns its keep. Automated scans help, but inherited WordPress problems often hide inside custom code that “sort of works” until traffic rises, data changes, or an attacker gets curious.

The five deep checks that surface real problems
When I’m handed a codebase, I start with five areas because they expose both fragility and risk fast.
- Autoloaded options size. If
autoload = 'yes'inwp_optionsis bloated, every page load pays for it. - Unsanitized request inputs. Raw
$_POST,$_GET, or$_REQUESTusage without native sanitization and escaping is a red flag. - Missing nonces and capability checks. AJAX endpoints that modify data without nonce and permission checks are trouble.
- Query efficiency. Nested loops,
query_posts(), and heavymeta_querystring matching can grind a site down. - Plugin bloat and stale dependencies. Redundant or abandoned plugins make the stack harder to secure and maintain.
A small code shortcut can become a big breach
One inherited custom plugin I audited used a frontend sort value directly inside an SQL ORDER BY clause. That’s the kind of thing a rushed developer writes when the feature “just needs to ship.”
The problem is that dynamic query parts like column names don’t become safe just because prepared statements exist. If you pass raw input into the wrong part of a SQL query, an attacker can abuse it. The right fix isn’t wishful sanitization. It’s a strict allowlist of approved values, plus proper nonce and capability checks around the endpoint.
That’s the trade-off a lot of teams miss. Convenience in custom code often creates exposure in places generic scanners don’t fully understand.
Use automation where it helps, not where it lies
I like fast static review with coding standards enforcement because it catches unescaped output, deprecated functions, and low-grade sloppiness across a lot of files quickly. I also pull environment and database information from the command line because it avoids trusting the admin dashboard as the only source of truth.
For performance diagnosis, don’t stop at page caching. Caching can mask a broken query but it doesn’t cure it. If the server is straining under load, system-level clues matter too. This guide on find memory leaks with OS tools is useful background when you’re separating application bloat from lower-level resource issues.
Performance needs numbers, not vibes
A page that “feels okay” can still fail users and search visibility. If you’re troubleshooting bottlenecks, pair code review with a real WordPress page speed audit process, then confirm whether the slowdown comes from payload, rendering, database work, or third-party scripts.
Fixing symptoms is cheap. Fixing causes is what makes the next release safer.
Auditing for SEO Health and Content Viability
The handoff looked fine. The site loaded, the forms worked, and the client wanted to talk about copy tweaks. Then Search Console showed the pages that make money were excluded, canonicalized to the wrong URLs, or never discovered in the first place.
That is how inherited WordPress SEO problems usually show up. The site feels alive to the owner and invisible to search engines.
Start with crawl access and index status. Check whether important URLs can be crawled, whether they are indexed, and whether the indexed version is the one you intended to rank. On inherited sites, the biggest failures are rarely advanced strategy problems. They are leftovers from redesigns, migrations, staging launches, and plugin changes that altered robots directives, canonicals, sitemap output, or internal links. This WordPress audit guide calls out the basics correctly, including URL inspection and the WordPress visibility setting, but the actual job is to verify business-critical pages one by one.
Do not audit every URL with equal weight. Triage the pages tied to revenue first. Service pages, location pages, lead forms, high-intent blog posts, and any page with backlinks or historical traffic go to the top of the list. If those are blocked, redirected badly, buried in pagination, or replaced by thin duplicates, rankings slip for reasons that have nothing to do with content quality.
Performance still matters here, but only in the ways that affect discoverability and usability. I care less about a pretty score and more about whether a page renders key content promptly, shifts during load, or relies on scripts that hide copy and links until after execution. A site can pass a visual sniff test and still make crawlers work too hard.
Content viability is a structural check before it becomes an editorial project. Review whether the site has pages that deserve to rank, whether those pages match actual services or offers, and whether the template helps or hurts them. I look for four common inherited-site problems:
- key pages set to noindex by mistake
- canonicals pointing to old, parameterized, or duplicate URLs
- thin pages created from custom post types, tag archives, or location template sprawl
- internal links that favor blog clutter while starving money pages
This is also where I check whether the site architecture still reflects the business. If the company dropped services, changed regions, merged brands, or rebuilt navigation, old content often lingers and competes with current pages. That creates keyword cannibalization, weakens internal linking, and sends mixed signals about which URL matters.
If you want a machine-assisted second pass, tools offering automated SEO analysis can help surface crawl and structure issues. Then compare that output against a manual process like this guide on how to conduct an SEO audit.
The goal is not a giant SEO wish list. The goal is to find what is suppressing visibility now, separate technical blockers from content debt, and avoid wasting time rewriting pages that search engines cannot properly reach or trust.
Building Your Remediation Plan and When to Call for Help
An audit report without prioritization is just an organized form of panic.
The cleanest way to handle an inherited WordPress site is to sort findings by business impact and implementation difficulty, then move the work through stages. Audit guidance that separates performance, security, SEO, and UX into distinct phases gets this right because it turns cleanup into a repeatable process instead of a one-off reaction, as described in this site audit workflow reference.

Use a three-tier plan
I report inherited-site findings in three buckets because clients need decisions, not a dump of defects.
| Priority | What belongs here | Typical response |
|---|---|---|
| Critical | Active security exposure, data leak vectors, crash risks, lost admin control | Fix immediately, usually before feature work |
| Warning | Outdated dependencies, major performance bottlenecks, architectural debt slowing change | Schedule this month and test in staging |
| Optimization | Code cleanup, small UX polish, preventive refactoring, future compatibility work | Put on the roadmap |
What can stay in-house and what should escalate
Keep routine work in-house if the team has full access, a tested backup, staging, and confidence in the stack.
Escalate when you hit problems like these:
- Confirmed compromise. You need containment, cleanup, and verification.
- Custom code nobody understands. Especially when it runs critical business logic.
- Performance issues with no obvious front-end cause. That’s usually deeper than image compression.
- Account ownership disputes. Technical fixes won’t solve administrative lockouts.
- A redesign request before the audit is complete. That’s how bad assumptions get poured into a new build.
If the site was abandoned by a previous vendor, this guide on what to do when a WordPress site was abandoned by a previous developer is a practical next read. And if you need outside review, Four Eyes offers a second-opinion audit that reviews an existing site, documents what is worth keeping, and identifies what should be fixed first.
Test in staging or don’t pretend you’re being careful
Inherited sites break in weird ways. Update a plugin and a payment form dies. Replace a theme function and an internal search template disappears. Every meaningful fix should be tested in staging before launch, then monitored after release.
Good remediation plans don’t just list fixes. They reduce the odds of creating a second rescue project.
Common Mistakes in Inherited WordPress Audits
Most bad audits don’t fail because the auditor missed one obscure hook. They fail because the entire approach is backwards.
Treating it like a technical-only problem
This is the classic mistake. Teams open the dashboard, start reviewing plugins, and only later discover they don’t control the domain, hosting account, or license owner.
That failure is expensive because it blocks everything downstream. You can’t migrate cleanly, restore confidently, or transfer services if the owner of the stack is still a ghost in the machine.
Trusting plugin popularity instead of maintenance reality
A plugin can be widely used and still be the wrong fit for an inherited stack. What matters is whether it’s maintained, necessary, compatible with the current environment, and replacing something the site needs.
Popularity doesn’t tell you whether it duplicates another plugin, slows the site, or locks you into stale code.
Masking root causes with surface fixes
A caching layer can hide a bad query for a while. It does not fix the query. A security plugin can add friction around a vulnerable custom endpoint. It does not repair the code. An SEO plugin can generate a sitemap. It does not solve blocked indexing or broken internal linking.
If a fix only changes the symptom, expect the problem to come back under a different name.
Starting the redesign before the audit is done
This one burns budgets. People get frustrated with an inherited site and decide the answer is a new theme or a full rebuild. Sometimes it is. But if you redesign before you understand access, data flows, search constraints, and custom business logic, you risk carrying the same failures into prettier code.
Auditing production like it’s a sandbox
Inherited sites deserve caution. Blind updates, direct database edits, and rushed permission changes on production are how “small fixes” become outages. If your process has no rollback, no staging, and no ownership trail, that’s not an audit. That’s improvisation.
If you’re stuck with an inherited WordPress site and need a calm read on what’s broken, what’s salvageable, and what should be fixed first, Four Eyes is a practical place to start.
