>
diff --git a/assets/src/js/admin/SettingsNav.test.jsx b/assets/src/js/admin/SettingsNav.test.jsx
index 25eb877..29444cd 100644
--- a/assets/src/js/admin/SettingsNav.test.jsx
+++ b/assets/src/js/admin/SettingsNav.test.jsx
@@ -1,11 +1,11 @@
/* eslint-env jest */
import '@testing-library/jest-dom';
-import { act, fireEvent, render, screen, waitFor } from '@testing-library/react';
+import { act, fireEvent, render, screen } from '@testing-library/react';
import SettingsNav from './SettingsNav';
describe( 'SettingsNav', () => {
- it( 'groups advanced diagnostics behind one primary tab and supports arrow-key navigation', async () => {
+ it( 'groups advanced diagnostics behind one primary tab and a report selector', async () => {
render(
{
await act( async () => {
fireEvent.click( screen.getByRole( 'tab', { name: 'Diagnostics' } ) );
} );
- const inventoryTab = screen.getByRole( 'tab', { name: 'Site Inventory' } );
- expect( inventoryTab ).toHaveAttribute( 'aria-selected', 'true' );
+ const reportSelector = screen.getByRole( 'combobox', { name: 'Diagnostic report' } );
+ expect( reportSelector ).toHaveValue( 'inventory' );
+ expect( screen.getByText( 'Private, local reports for this WordPress site' ) ).toBeInTheDocument();
+ expect( screen.queryByRole( 'tablist', { name: 'Diagnostic tools' } ) ).not.toBeInTheDocument();
- inventoryTab.focus();
await act( async () => {
- fireEvent.keyDown( inventoryTab, { key: 'ArrowRight' } );
- } );
- await waitFor( () => {
- expect( screen.getByRole( 'tab', { name: 'Database' } ) ).toHaveAttribute( 'aria-selected', 'true' );
+ fireEvent.change( reportSelector, { target: { value: 'database' } } );
} );
+ expect( reportSelector ).toHaveValue( 'database' );
} );
} );
diff --git a/tests/e2e/perform-smoke.spec.js b/tests/e2e/perform-smoke.spec.js
index 937fd09..383574a 100644
--- a/tests/e2e/perform-smoke.spec.js
+++ b/tests/e2e/perform-smoke.spec.js
@@ -120,7 +120,7 @@ test( 'Site Inventory refresh is private, bounded, and responsive', async ( { pa
await login( page );
await openAdminPage( page, '/wp-admin/options-general.php?page=perform_settings&tab=inventory' );
- await expect( page.getByRole( 'tab', { name: 'Site Inventory' } ) ).toHaveAttribute( 'aria-selected', 'true' );
+ await expect( page.getByLabel( 'Diagnostic report' ) ).toHaveValue( 'inventory' );
await expect( page.getByText( 'Private and local' ) ).toBeVisible();
await expect( page.getByText( /no post content, option values, private URLs/i ) ).toBeVisible();
await expect( page.getByRole( 'heading', { name: 'System health' } ) ).toBeVisible();
@@ -153,7 +153,7 @@ test( 'Scheduled-task pressure is bounded, private, resettable, and responsive',
await login( page );
await openAdminPage( page, '/wp-admin/options-general.php?page=perform_settings&tab=scheduled-tasks' );
- await expect( page.getByRole( 'tab', { name: 'Scheduled Tasks' } ) ).toHaveAttribute( 'aria-selected', 'true' );
+ await expect( page.getByLabel( 'Diagnostic report' ) ).toHaveValue( 'scheduled-tasks' );
await expect( page.getByText( 'Read-only and bounded' ) ).toBeVisible();
await expect( page.getByText( /excludes hook arguments, payloads, URLs, and user data/ ) ).toBeVisible();
await page.getByRole( 'button', { name: /Run check|Refresh check/ } ).click();
@@ -181,7 +181,7 @@ test( 'Action Scheduler diagnostic handles an absent queue without mutation', as
await login( page );
await openAdminPage( page, '/wp-admin/options-general.php?page=perform_settings&tab=action-scheduler' );
- await expect( page.getByRole( 'tab', { name: 'Action Scheduler' } ) ).toHaveAttribute( 'aria-selected', 'true' );
+ await expect( page.getByLabel( 'Diagnostic report' ) ).toHaveValue( 'action-scheduler' );
await expect( page.getByText( 'Read-only and private' ) ).toBeVisible();
await expect( page.getByText( /never runs, cancels, or deletes queued work/ ) ).toBeVisible();
await page.getByRole( 'button', { name: /Run check|Refresh check/ } ).click();
@@ -216,7 +216,7 @@ test( 'Admin Performance Monitor is opt-in, bounded, private, clearable, and res
await page.goto( '/wp-admin/edit.php' );
await openAdminPage( page, '/wp-admin/options-general.php?page=perform_settings&tab=admin-monitor' );
- await expect( page.getByRole( 'tab', { name: 'Admin Monitor' } ) ).toHaveAttribute( 'aria-selected', 'true' );
+ await expect( page.getByLabel( 'Diagnostic report' ) ).toHaveValue( 'admin-monitor' );
await expect( page.getByText( 'Aggregate-only and per site' ) ).toBeVisible();
await expect( page.getByText( /does not store full URLs, query arguments, request payloads/ ) ).toBeVisible();
await expect( page.getByText( 'edit-post' ) ).toBeVisible();
@@ -339,18 +339,18 @@ test( 'Classic menu cache stays functional across unrelated query variables', as
expect( await page.locator( '#perform-test-navigation' ).innerHTML() ).toBe( firstMarkup );
} );
-test( 'Cache Stats tab preserves legacy routing, actions, and keyboard access', async ( { page } ) => {
+test( 'Cache Stats report preserves legacy routing, actions, and keyboard access', async ( { page } ) => {
await login( page );
await openAdminPage( page, '/wp-admin/options-general.php?page=perform_settings' );
await page.getByRole( 'tab', { name: 'Diagnostics' } ).click();
- const cacheStatsTab = page.getByRole( 'tab', { name: 'Cache Stats' } );
- await cacheStatsTab.focus();
- await expect( cacheStatsTab ).toBeFocused();
- await expect( cacheStatsTab ).toHaveCSS( 'outline-style', 'solid' );
- await page.keyboard.press( 'Enter' );
+ const reportSelector = page.getByLabel( 'Diagnostic report' );
+ await reportSelector.focus();
+ await expect( reportSelector ).toBeFocused();
+ await expect( reportSelector ).toHaveCSS( 'outline-style', 'solid' );
+ await reportSelector.selectOption( 'cache-stats' );
- await expect( cacheStatsTab ).toHaveAttribute( 'aria-selected', 'true' );
+ await expect( reportSelector ).toHaveValue( 'cache-stats' );
await expect( page ).toHaveURL( /[?&]tab=cache-stats(?:&|$)/ );
await expect( page.getByRole( 'heading', { name: 'Perform Cache Observability' } ) ).toBeVisible();
await expect( page.getByRole( 'button', { name: 'Purge Site Page Cache' } ) ).toBeVisible();
@@ -427,7 +427,7 @@ test( 'lower-privilege users cannot access the legacy or canonical Cache Stats r
expect( canonicalResponse.status() ).not.toBe( 302 );
await expect( page ).toHaveURL( /page=perform_settings&tab=cache-stats$/ );
await expect( page.getByText( 'Sorry, you are not allowed to access this page.' ) ).toBeVisible();
- await expect( page.getByRole( 'tab', { name: 'Cache Stats' } ) ).toHaveCount( 0 );
+ await expect( page.getByLabel( 'Diagnostic report' ) ).toHaveCount( 0 );
const protectedActions = [
[ 'perform_purge_page_cache', 'You are not allowed to purge the page cache.' ],
From 261429e98afba95e1a9e6784cb6de0b40b381144 Mon Sep 17 00:00:00 2001
From: Mehul Gohil
Date: Tue, 11 Aug 2026 19:52:37 +0530
Subject: [PATCH 5/9] Update diagnostic smoke coverage
---
tests/e2e/perform-smoke.spec.js | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/tests/e2e/perform-smoke.spec.js b/tests/e2e/perform-smoke.spec.js
index 383574a..b15c79a 100644
--- a/tests/e2e/perform-smoke.spec.js
+++ b/tests/e2e/perform-smoke.spec.js
@@ -249,16 +249,16 @@ test( 'Admin asset audit is opt-in, bounded, private, clearable, and responsive'
const auditToggle = page.getByRole( 'checkbox', { name: 'Admin Asset Audit' } );
if ( ! ( await auditToggle.isChecked() ) ) {
await auditToggle.check();
+ await page.getByRole( 'button', { name: 'Save Settings' } ).click();
+ await expect( page.getByText( /Settings saved/ ) ).toBeVisible();
}
- await page.getByRole( 'button', { name: 'Save Settings' } ).click();
- await expect( page.getByText( /Settings saved/ ) ).toBeVisible();
await page.goto( '/wp-admin/index.php' );
await page.goto( '/wp-admin/edit.php' );
await page.goto( '/wp-admin/plugins.php' );
await openAdminPage( page, '/wp-admin/options-general.php?page=perform_settings&tab=admin-assets' );
- await expect( page.getByRole( 'tab', { name: 'Admin Assets' } ) ).toHaveAttribute( 'aria-selected', 'true' );
+ await expect( page.getByLabel( 'Diagnostic report' ) ).toHaveValue( 'admin-assets' );
await expect( page.getByText( 'Inventory only — nothing is disabled' ) ).toBeVisible();
await expect( page.getByText( /URLs, query strings, nonces, and user data are not stored/ ) ).toBeVisible();
await expect( page.getByText( 'Repeated across admin screens' ) ).toBeVisible();
@@ -291,13 +291,13 @@ test( 'Plugin impact report separates measured local evidence from unavailable a
const auditToggle = page.getByRole( 'checkbox', { name: 'Admin Asset Audit' } );
if ( ! ( await auditToggle.isChecked() ) ) {
await auditToggle.check();
+ await page.getByRole( 'button', { name: 'Save Settings' } ).click();
+ await expect( page.getByText( /Settings saved/ ) ).toBeVisible();
}
- await page.getByRole( 'button', { name: 'Save Settings' } ).click();
- await expect( page.getByText( /Settings saved/ ) ).toBeVisible();
await openAdminPage( page, '/wp-admin/options-general.php?page=perform_settings&tab=general' );
await openAdminPage( page, '/wp-admin/options-general.php?page=perform_settings&tab=plugin-impact' );
- await expect( page.getByRole( 'tab', { name: 'Plugin Impact' } ) ).toHaveAttribute( 'aria-selected', 'true' );
+ await expect( page.getByLabel( 'Diagnostic report' ) ).toHaveValue( 'plugin-impact' );
await expect( page.getByText( 'Evidence, not a plugin ranking' ) ).toBeVisible();
await expect( page.getByText( /does not attribute query, callback, or memory cost/ ) ).toBeVisible();
await expect( page.getByText( /Zero means not observed in this sample/ ) ).toBeVisible();
From f3cd20dbd3acd146911737c510442db577df4b9a Mon Sep 17 00:00:00 2001
From: Mehul Gohil
Date: Sat, 29 Aug 2026 15:43:10 +0530
Subject: [PATCH 6/9] docs: confirm WordPress 7.1 compatibility
---
readme.txt | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/readme.txt b/readme.txt
index bddc4c3..5a9bbcd 100644
--- a/readme.txt
+++ b/readme.txt
@@ -3,7 +3,7 @@ Contributors: performwp, mehul0810, ankur0812
Tags: performance, caching, cdn, assets, optimize
Donate link: https://www.buymeacoffee.com/mehulgohil
Requires at least: 4.8
-Tested up to: 7.0
+Tested up to: 7.1
Requires PHP: 7.4
Stable tag: 1.7.0
License: GPLv3
@@ -67,6 +67,9 @@ Contributions and bug reports welcome on GitHub: https://github.com/performwp/pe
== Changelog ==
+= 1.8.0 =
+- Confirmed compatibility with WordPress 7.1.
+
= 1.7.0 - 2026-07-26 =
- Added a dashboard overview for faster at-a-glance site status.
- Added a dashboard-only runtime diagnostics panel for environment and plugin inspection.
From 494d3f309d51847377b2444a8138903fc474f1ca Mon Sep 17 00:00:00 2001
From: Mehul Gohil
Date: Sun, 20 Sep 2026 13:45:54 +0530
Subject: [PATCH 7/9] Prepare Perform 1.8.0 candidate metadata
---
config/constants.php | 2 +-
package-lock.json | 4 ++--
package.json | 2 +-
perform.php | 2 +-
phpstan-bootstrap.php | 2 +-
readme.txt | 18 ++++++++++++------
tests/unit-tests/tests-dashboard-payload.php | 2 +-
7 files changed, 19 insertions(+), 13 deletions(-)
diff --git a/config/constants.php b/config/constants.php
index 7f6cca2..1159cd7 100644
--- a/config/constants.php
+++ b/config/constants.php
@@ -6,7 +6,7 @@
// Define plugin version in SemVer format.
if ( ! defined( 'PERFORM_VERSION' ) ) {
- define( 'PERFORM_VERSION', '1.7.0' );
+ define( 'PERFORM_VERSION', '1.8.0' );
}
// Define plugin root File.
diff --git a/package-lock.json b/package-lock.json
index 62a4cef..8365ffa 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,12 +1,12 @@
{
"name": "perform",
- "version": "1.7.0",
+ "version": "1.8.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "perform",
- "version": "1.7.0",
+ "version": "1.8.0",
"license": "GPL-3.0-or-later",
"devDependencies": {
"@heroicons/react": "^2.2.0",
diff --git a/package.json b/package.json
index 032e8e9..d672fa6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "perform",
- "version": "1.7.0",
+ "version": "1.8.0",
"description": "Web Performance Optimization Plugin for WordPress",
"homepage": "https://github.com/performwp/perform#readme",
"license": "GPL-3.0-or-later",
diff --git a/perform.php b/perform.php
index 1a84e32..1094c45 100644
--- a/perform.php
+++ b/perform.php
@@ -17,7 +17,7 @@
* Plugin Name: Perform - Optimize Performance
* Plugin URI: https://performwp.com/
* Description: This plugin adds toolset for performance and speed improvements to your WordPress sites.
- * Version: 1.7.0
+ * Version: 1.8.0
* Author: Mehul Gohil
* Author URI: https://mehulgohil.com/
* License: GPLv3 or later
diff --git a/phpstan-bootstrap.php b/phpstan-bootstrap.php
index 4414c61..3bca6b3 100644
--- a/phpstan-bootstrap.php
+++ b/phpstan-bootstrap.php
@@ -17,7 +17,7 @@
}
if ( ! defined( 'PERFORM_VERSION' ) ) {
- define( 'PERFORM_VERSION', '1.7.0' );
+ define( 'PERFORM_VERSION', '1.8.0' );
}
if ( ! defined( 'PERFORM_PLUGIN_FILE' ) ) {
diff --git a/readme.txt b/readme.txt
index 5a9bbcd..11ccd28 100644
--- a/readme.txt
+++ b/readme.txt
@@ -5,7 +5,7 @@ Donate link: https://www.buymeacoffee.com/mehulgohil
Requires at least: 4.8
Tested up to: 7.1
Requires PHP: 7.4
-Stable tag: 1.7.0
+Stable tag: 1.8.0
License: GPLv3
License URI: http://www.gnu.org/licenses/gpl-3.0.html
@@ -15,7 +15,7 @@ Optimize WordPress performance with asset controls, page caching, CDN rewriting,
Perform helps site owners reduce unnecessary frontend work in WordPress. It combines asset controls, cache features, CDN rewriting, and small cleanup modules in one settings area.
-Version 1.7.0 focuses on safer, easier-to-understand controls for real sites: a dashboard overview, dashboard-only runtime diagnostics, page cache exclusion and lifecycle controls, an Assets Manager reset action, consistent settings layouts, and Cache Stats integrated into the main settings tabs.
+Version 1.8.0 adds privacy-conscious diagnostics for overloaded WordPress admin environments, clearer performance guidance, and a calmer settings navigation hierarchy.
Key capabilities:
@@ -56,8 +56,8 @@ Menu Cache is designed for classic themes that render menus through `wp_nav_menu
= Does Assets Manager scan the whole site? =
Assets Manager scans the current frontend page while you are logged in as an administrator. Use it page by page for safer asset decisions, then test important templates before applying broad changes.
-= Are settings preserved when updating to 1.7.0? =
-Yes. Perform 1.7.0 preserves existing public option keys and migrates legacy settings into the current settings shape where needed.
+= Are settings preserved when updating to 1.8.0? =
+Yes. Perform 1.8.0 preserves existing public option keys and migrates legacy settings into the current settings shape where needed.
== Support ==
@@ -68,6 +68,12 @@ Contributions and bug reports welcome on GitHub: https://github.com/performwp/pe
== Changelog ==
= 1.8.0 =
+- Added privacy-conscious site inventory and system-health guidance for performance troubleshooting.
+- Added bounded diagnostics for autoloaded options, object cache status, slow admin screens, scheduled tasks, admin assets, plugin impact, and Action Scheduler queues.
+- Added a performance health dashboard that reports observed evidence without claiming unmeasured savings.
+- Reduced classic Menu Cache key cardinality and hardened purge tracking.
+- Simplified settings navigation by grouping advanced reports under Diagnostics while preserving existing report URLs.
+- Refined dashboard hierarchy, status visuals, responsive layouts, and keyboard navigation.
- Confirmed compatibility with WordPress 7.1.
= 1.7.0 - 2026-07-26 =
@@ -129,8 +135,8 @@ Contributions and bug reports welcome on GitHub: https://github.com/performwp/pe
== Upgrade Notice ==
-= 1.7.0 =
-Review Assets Manager, cache exclusions, Cache Stats, and runtime diagnostics after updating. Cache Stats now appears under Settings > Perform, and its export and clear actions report progress and results.
+= 1.8.0 =
+Review the new diagnostics and dashboard guidance after updating. Perform 1.8.0 keeps existing settings and report URLs while adding read-only evidence for troubleshooting overloaded WordPress admin environments.
== Screenshots ==
diff --git a/tests/unit-tests/tests-dashboard-payload.php b/tests/unit-tests/tests-dashboard-payload.php
index b242f74..43842fb 100644
--- a/tests/unit-tests/tests-dashboard-payload.php
+++ b/tests/unit-tests/tests-dashboard-payload.php
@@ -87,7 +87,7 @@ public function test_assets_manager_summary_counts_rule_coverage_not_bytes_saved
public function test_empty_dashboard_payload_has_safe_defaults() {
$payload = DashboardPayload::get_data();
- $this->assertSame( '1.7.0', $payload['version'] );
+ $this->assertSame( '1.8.0', $payload['version'] );
$this->assertFalse( $payload['cache']['hasStats'] );
$this->assertSame( 0.0, $payload['cache']['hitRatio'] );
$this->assertSame( 0, $payload['assetsManager']['disabledJsHandles'] );
From 29c5f404a981590c3d1c094af31303c9060003a5 Mon Sep 17 00:00:00 2001
From: Mehul Gohil
Date: Sun, 20 Sep 2026 13:54:47 +0530
Subject: [PATCH 8/9] Fix diagnostics accessibility and localization
---
assets/src/css/admin/settings.css | 2 +-
assets/src/js/admin/SettingsNav.jsx | 17 +++++++++++------
assets/src/js/admin/SettingsNav.test.jsx | 2 +-
3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/assets/src/css/admin/settings.css b/assets/src/css/admin/settings.css
index 01b0756..fb42d91 100644
--- a/assets/src/css/admin/settings.css
+++ b/assets/src/css/admin/settings.css
@@ -669,7 +669,7 @@
}
.perform-health-card[data-status='ready'] {
- --perform-health-status: var(--perform-color-success);
+ --perform-health-status: #006b1b;
--perform-health-status-bg: #edf8ef;
}
diff --git a/assets/src/js/admin/SettingsNav.jsx b/assets/src/js/admin/SettingsNav.jsx
index a42bf99..c9a0624 100644
--- a/assets/src/js/admin/SettingsNav.jsx
+++ b/assets/src/js/admin/SettingsNav.jsx
@@ -1,6 +1,7 @@
import { TabPanel } from '@wordpress/components';
import { WrenchScrewdriverIcon } from '@heroicons/react/24/outline';
import { useEffect, useMemo, useRef, useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
import CacheStatsPanel from './CacheStatsPanel';
import AdminPerformanceMonitorPanel from './AdminPerformanceMonitorPanel';
import DashboardPanel from './DashboardPanel';
@@ -84,7 +85,7 @@ const SettingsNav = ( {
if ( 'dashboard' === slug ) {
title = 'Dashboard';
} else if ( 'diagnostics' === slug ) {
- title = 'Diagnostics';
+ title = __( 'Diagnostics', 'perform' );
}
return { name: slug, title };
} ),
@@ -187,24 +188,28 @@ const SettingsNav = ( {
return (
<>
{ diagnosticTabKeys.includes( selectedTabName ) && (
-
+
- Diagnostics workspace
- Private, local reports for this WordPress site
+ { __( 'Diagnostics workspace', 'perform' ) }
+
+ { __( 'Private, local reports for this WordPress site', 'perform' ) }
+