Installation
Requirements
| WordPress | 6.0 or later (tested to 7.0) |
|---|---|
| PHP | 7.4 or later |
| Loopback requests | Must be permitted - confirm under Tools → Site Health |
| Capability | manage_options to view reports and apply fixes |
Installing from WordPress.org
The plugin is listed in the WordPress.org plugin directory at wordpress.org/plugins/klydexa-website-audit. This is the recommended route - WordPress then handles updates for you.
- In WordPress go to Plugins → Add New.
- Search for Klydexa Website Audit.
- Press Install Now, then Activate.
- Go to Klydexa Website Audit → Audit Report and press Run full audit.
Installing from the ZIP
Use this if you prefer to install manually, or need a specific version.
- Download the ZIP above.
- In WordPress go to Plugins → Add New → Upload Plugin, choose the ZIP and press Install Now. Alternatively, unzip it and upload the
klydexa-website-auditfolder to/wp-content/plugins/over SFTP. - Activate the plugin.
- Go to Klydexa Website Audit → Audit Report and press Run full audit.
- Read Klydexa Website Audit → Documentation for what each check means and which fixes to approach carefully.
The plugin needs to be able to make HTTP requests to its own front end. If loopback requests are blocked, most markup-based checks cannot run. See Troubleshooting.
Getting started
-
Take a backup
The audit itself only reads - it never changes anything. But you will want a restore point before you start applying fixes, so make it now rather than later.
-
Open Audit Report and press “Run full audit”
The categories run one after another, each as its own request, so a slow category cannot time out the whole audit.
-
Wait 20–60 seconds
The plugin fetches your own homepage, a sample post and a deliberately non-existent URL over HTTP, then parses the returned markup. Leave the tab open while the progress bar advances.
-
Work top-down
Findings are sorted by severity within each category. Clear the Critical items first - they are the ones actively costing you traffic, sales or security.
Reading the report
Severity levels
Every category starts at 100 points. Each finding subtracts the number of points shown below, so a lower score means more was found. Nothing ever adds points - a clean category simply keeps its 100.
| Level | Meaning | Points |
|---|---|---|
| Critical | Actively harmful right now - blocked indexing, an unpatched core, a checkout without TLS. Fix today. | −22 |
| Warning | A real problem with a measurable cost, but the site still works. Fix this month. | −9 |
| Notice | An improvement worth making when convenient, or something to be aware of. | −3 |
| Passed | Checked and healthy. Shown so you can see what was tested, not just what failed. | 0 |
Filtering and searching
The severity tiles on the dashboard double as filters - click Critical to show only critical findings. You can also search the whole report by keyword. Each category panel carries its own score and grade, and links to the findings inside it.
Expanding a finding
Every finding opens to show an explanation of what was detected, why it matters, and the recommended remedy. Where a one-click fix exists, it appears at the bottom of the finding with a note stating whether it is a reversible switch or a one-off action.
How scoring works
Each category starts at 100 and loses the points listed above for every finding, and can never fall below 0. The overall score is the plain average of the category scores that ran.
Grades
| Grade | Score |
|---|---|
| A | 90 and above |
| B | 80 – 89 |
| C | 65 – 79 |
| D | 50 – 64 |
| F | Below 50 |
A worked example
A category with one critical and two notice findings scores
100 − 22 − 3 − 3 = 72.
The number is a progress tracker, not a verdict. A site scoring 78 with no critical findings is in better shape than one scoring 85 with an exposed checkout. Read the findings, not just the total.
Using one-click fixes
41There are 28 reversible switches and 13 one-off actions. You can apply them from the finding in the report, or from the One-Click Fixes screen where they are grouped by category.
Reversible switches
These do not edit your theme, your plugins or wp-config.php.
The plugin stores which switches are on and reapplies the behaviour
through WordPress hooks on every request. Turn one off and the behaviour
disappears completely - nothing is left behind. Deactivating the plugin
has the same effect.
One-off actions
These change data or settings directly: deleting revisions, purging
transients, updating a WordPress option, removing
readme.html. Actions labelled “Review before
applying” delete data or alter how the site behaves for
visitors. Read the description, confirm you have a backup, then run it.
Batching
Fixes that delete comments or write alt text work in batches so they cannot exhaust the request on a large site. The result message tells you when more remain - run the fix again to continue.
After applying a fix
Load your homepage, a post and - on a store - a product, the cart and the checkout, in a logged-out browser window. Then re-run the audit; the cached copy of your markup is discarded automatically whenever a fix is applied, so the next run measures the real result.
Scheduling and email
Under Settings you can have the full audit run daily, weekly or monthly, and email a summary each time it finishes. Scheduling is off by default.
Scheduled runs use WP-Cron, which is triggered by site traffic rather
than by a real clock. A site with few visitors may see the audit fire
hours late. If timing matters, disable WP_CRON in
wp-config.php and call wp-cron.php from a
server cron job instead:
/* wp-config.php */
define( 'DISABLE_WP_CRON', true );
# crontab -e - every 15 minutes
*/15 * * * * curl -s https://example.com/wp-cron.php?doing_wp_cron >/dev/null 2>&1
A scheduled audit never applies a fix. Every change to your site is something you press a button for.
Settings reference
| Setting | What it does | Default |
|---|---|---|
| Fetch real-user Core Web Vitals from Google | Enables the PageSpeed Insights lookup, adding real-user LCP, INP, CLS and FCP to the Core Web Vitals category. This is the only feature that contacts a third party. | Off |
| PageSpeed Insights API key | Optional. Raises your rate limit with Google. Sent to Google alongside your homepage URL when the lookup runs. | Empty |
| Schedule | Runs the full audit automatically - daily, weekly or monthly - via WP-Cron. | None |
| Email a summary | Sends a summary of the results each time a scheduled audit finishes. | Off |
| Send to | Recipient for the email summary. Falls back to the site admin address. | Empty |
| Delete all plugin data on uninstall | When ticked, deleting the plugin also removes its options, stored reports and fix history. Otherwise nothing is deleted. | Off |
Privacy and data
No telemetry- The audit runs entirely on your own server. It requests your own URLs and reads your own database.
- The single exception is the PageSpeed Insights lookup, which is off by default. Enabling it sends your homepage URL - and nothing else - to Google.
- No telemetry, no analytics, no phone-home, no account required.
- Reports are stored in the
wp_optionstable as a single non-autoloaded row, so they cost nothing on a normal page load. - Every screen and every AJAX action requires the
manage_optionscapability and a valid nonce.
External service: Google PageSpeed Insights
Used only when you tick “Fetch real-user Core Web Vitals from Google” under Settings. It retrieves Chrome UX Report field data - real-user Largest Contentful Paint, Interaction to Next Paint and Cumulative Layout Shift - for your site's origin.
| What is sent | The public homepage URL of your site, and your PageSpeed Insights API key if you have entered one. No page content, post data, customer data, user data or credentials. |
|---|---|
| When | Only while an audit is running, and only while the option is enabled. Responses are cached for six hours to limit repeat requests. |
| Provider | Google - API documentation |
| Terms | developers.google.com/terms |
| Privacy policy | policies.google.com/privacy |
No other external service is contacted. The plugin makes loopback HTTP requests to your own site's front end in order to read its rendered HTML; those requests never leave your server's network.
For developers
Filters
| Filter | Purpose |
|---|---|
kwaudit_audit_categories |
Add or remove audit categories. Maps a slug to a class extending KWAUDIT_Check. |
kwaudit_required_capability |
Change the capability required to view reports and apply fixes. Defaults to manage_options. |
kwaudit_needs_woocommerce_assets |
Return true to keep WooCommerce assets on a page when the “drop assets” switch is on. |
Adding your own check
add_filter( 'kwaudit_audit_categories', function ( $categories ) {
$categories['my_area'] = 'My_Custom_Check';
return $categories;
} );
class My_Custom_Check extends KWAUDIT_Check {
public function get_id() { return 'my_area'; }
public function get_label() { return 'My Area'; }
public function get_icon() { return 'dashicons-admin-generic'; }
protected function evaluate() {
$this->add(
'my_check',
'Something needs attention',
KWAUDIT_Issue::SEVERITY_WARNING,
array(
'description' => 'What is wrong and why it matters.',
'recommendation' => 'What to do about it.',
)
);
}
}
Inside evaluate(), $this->context is a
KWAUDIT_Site_Context holding the already-fetched markup. Use
$this->context->count( $xpath ),
->first_attr( $xpath, $attribute ) and
->header( $name ) rather than issuing your own HTTP
requests.
Running an audit in code
$runner = new KWAUDIT_Audit_Runner();
$report = $runner->run_all(); // Everything.
$seo = $runner->run_category( 'seo' ); // One category.
$stored = KWAUDIT_Report::get();
$totals = KWAUDIT_Report::totals();
Changing who may run audits
add_filter( 'kwaudit_required_capability', function () {
return 'edit_theme_options';
} );
Keeping WooCommerce assets on a specific page
add_filter( 'kwaudit_needs_woocommerce_assets', function ( $needed ) {
return is_page( 'gift-finder' ) ? true : $needed;
} );
Troubleshooting
“The site could not be crawled”
The plugin could not fetch your own homepage. Check Tools → Site Health for a loopback request failure. Common causes: HTTP basic authentication on a staging site, a firewall blocking the server from calling its own hostname, or a local development domain the server cannot resolve.
The audit stalls partway through
One category exceeded the PHP time limit. Categories run independently, so reload the page - the completed ones are already saved. Security and UX are the slowest because they make extra HTTP requests.
A fix does not seem to take effect
Clear your page cache and CDN, then check in a private window. Caching plugins serve stored HTML that predates the change.
A finding is wrong for my site
Some checks are heuristics and say so in their wording - the responsive-theme check, the contact/about page check and the broken-link sample in particular. Verify before acting, and treat the report as a prompt to look rather than an instruction to change.
I applied a fix but the finding is still listed
The report you are looking at was generated before the fix ran. Re-run the audit and the finding will update. The plugin will prompt you to do this after any one-off action.
How do I undo everything?
Turn every switch off on the One-Click Fixes screen, or simply deactivate the plugin - switches stop applying immediately. One-off actions cannot be undone from here; restore from your backup if you need to reverse one.
Uninstalling
Nothing is deleted unless you opt in. Tick Delete all plugin data on uninstall under Settings before deleting the plugin if you want its options, reports and fix history removed.
- Deactivating stops every reversible switch immediately and clears the scheduled audit. Your data is kept.
- Deleting removes the plugin files. Stored data is removed only if you ticked the uninstall option first.
- One-off actions are not reversed by either. Restore from a backup if you need to undo one.