{"id":277390,"date":"2026-01-27T16:44:30","date_gmt":"2026-01-27T16:44:30","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sac-database-inspector\/"},"modified":"2026-08-10T13:17:46","modified_gmt":"2026-08-10T13:17:46","slug":"sac-database-inspector","status":"publish","type":"plugin","link":"https:\/\/ca.wordpress.org\/plugins\/sac-database-inspector\/","author":18772735,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"7.0.4","requires":"7.0","requires_php":"7.4","requires_plugins":null,"header_name":"SAC Database Inspector","header_author":"jackofall1232","header_description":"Read-only administrative utility for inspecting database tables and cache usage to help identify potential bloat.","assets_banners_color":"a6b6bd","last_updated":"2026-08-10 13:17:46","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/jackofall1232\/sac-database-inspector","header_author_uri":"https:\/\/wordpress.org","rating":5,"author_block_rating":0,"active_installs":10,"downloads":509,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.3":{"tag":"0.1.3","author":"jackofall1232","date":"2026-01-27 16:44:11"},"0.2.0":{"tag":"0.2.0","author":"jackofall1232","date":"2026-01-27 19:14:29"},"1.0.0":{"tag":"1.0.0","author":"jackofall1232","date":"2026-05-29 12:21:58"},"1.1.0":{"tag":"1.1.0","author":"jackofall1232","date":"2026-08-10 12:51:30"},"1.1.1":{"tag":"1.1.1","author":"jackofall1232","date":"2026-08-10 13:17:46"}},"upgrade_notice":{"1.1.0":"<p>Adds modular diagnostics, ownership-aware footprints, bounded safety snapshots, redacted reports, and optional WordPress AI explanations. No release tag is created by this source change.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3448149,"resolution":"256x256","location":"assets","locale":"","width":500,"height":500}},"assets_banners":{"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3448058,"resolution":"772x250","location":"assets","locale":"","width":1544,"height":500}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.3","0.2.0","1.0.0","1.1.0","1.1.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3448058,"resolution":"1","location":"assets","locale":"","width":2304,"height":1630}},"screenshots":{"1":"Database health overview and bounded maintenance actions","2":"Runtime, storage, and maintenance health categories","3":"Conservative plugin database footprints","4":"Paginated autoload inspector","5":"Read-only ghost data findings","6":"Redacted reports and optional AI interpretation","7":"Safety snapshot history and restoration"}},"plugin_section":[],"plugin_tags":[1328,153,4654,23519,247],"plugin_category":[52,54],"plugin_contributors":[249752],"plugin_business_model":[],"class_list":["post-277390","plugin","type-plugin","status-publish","hentry","plugin_tags-autoload","plugin_tags-database","plugin_tags-database-cleaner","plugin_tags-diagnostics","plugin_tags-performance","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-jackofall1232","plugin_committers-jackofall1232"],"banners":{"banner":"https:\/\/ps.w.org\/sac-database-inspector\/assets\/banner-772x250.jpg?rev=3448058","banner_2x":false,"banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sac-database-inspector\/assets\/icon-256x256.png?rev=3448149","icon_2x":"https:\/\/ps.w.org\/sac-database-inspector\/assets\/icon-256x256.png?rev=3448149","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/sac-database-inspector\/assets\/screenshot-1.png?rev=3448058","caption":"Database health overview and bounded maintenance actions"}],"raw_content":"<!--section=description-->\n<p>SAC Database Inspector helps administrators understand what is using the WordPress database before deciding whether maintenance is appropriate.<\/p>\n\n<p>It is inspection-first: no background cleanup, \u201cclean everything\u201d action, telemetry, paid feature, or automatic external request is included.<\/p>\n\n<h4>Database diagnostics<\/h4>\n\n<ul>\n<li>Runtime, storage, and maintenance health categories<\/li>\n<li>Deterministic and explainable health penalty score<\/li>\n<li>Database and table sizes when the host permits access<\/li>\n<li>Graceful fallback when <code>information_schema<\/code> is restricted<\/li>\n<li>Object-cache status and bounded maintenance counts<\/li>\n<\/ul>\n\n<h4>Ownership and footprints<\/h4>\n\n<ul>\n<li>Conservative plugin option, metadata, transient, and custom-table estimates<\/li>\n<li>Active, inactive, not-installed, WordPress core, theme, and unknown owner states<\/li>\n<li>Explicit ownership confidence and evidence<\/li>\n<li>Inactive installed plugins are never treated as missing<\/li>\n<\/ul>\n\n<h4>Autoload and ghost data<\/h4>\n\n<ul>\n<li>Paginated, searchable, size-sorted autoload inspector<\/li>\n<li>Serialized, protected, owner, status, confidence, and size indicators<\/li>\n<li>Capped option previews with centralized sensitive-name redaction<\/li>\n<li>Orphan metadata, expired transient, missing-plugin option\/table, and stale cron findings<\/li>\n<li>Heuristic findings are read-only and never automatically deleted<\/li>\n<\/ul>\n\n<h4>Controlled maintenance and rollback<\/h4>\n\n<ul>\n<li>Capability, nonce, target, read-only-mode, and explicit-confirmation checks<\/li>\n<li>At most 100 records changed per request<\/li>\n<li>Lightweight local safety snapshots before supported changes<\/li>\n<li>Restoration for options, autoload state, and orphan metadata<\/li>\n<li>Protected WordPress options cannot have autoload changed<\/li>\n<\/ul>\n\n<h4>Reports and optional AI<\/h4>\n\n<ul>\n<li>Redacted JSON, CSV, and HTML exports from one normalized report<\/li>\n<li>Optional WordPress 7.0 AI Client explanations when a text provider is configured<\/li>\n<li>Provider-neutral integration with no SAC API-key settings<\/li>\n<li>AI receives capped metadata, not raw option values or database credentials<\/li>\n<li>AI cannot run SQL, clean data, change options, or restore snapshots<\/li>\n<li>All deterministic features work without AI<\/li>\n<\/ul>\n\n<h3>Privacy and external services<\/h3>\n\n<p>SAC has no telemetry or tracking. Database inspection and exports are local.<\/p>\n\n<p>If an administrator explicitly requests an AI explanation, SAC passes a capped and redacted metadata-only diagnostic context to the provider selected through WordPress Settings \u2192 Connectors. The external service, data handling, and terms depend on the connector\/provider configured by the site owner. SAC does not store provider credentials and does not send raw option values, database credentials, WordPress salts, private keys, or authentication tokens.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install it through the Plugins screen.<\/li>\n<li>Activate SAC Database Inspector.<\/li>\n<li>Open Tools \u2192 DB Inspector.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20change%20data%20automatically%3F\"><h3>Does the plugin change data automatically?<\/h3><\/dt>\n<dd><p>No. Scanning is read-only. Every maintenance action is initiated explicitly by an administrator, handles a bounded batch, and creates a safety snapshot where practical.<\/p><\/dd>\n<dt id=\"is%20plugin%20ownership%20guaranteed%3F\"><h3>Is plugin ownership guaranteed?<\/h3><\/dt>\n<dd><p>No. SAC uses conservative exact-prefix evidence and reports confidence. Unknown data remains unknown, and heuristic ownership never authorizes deletion.<\/p><\/dd>\n<dt id=\"is%20data%20from%20an%20inactive%20plugin%20considered%20orphaned%3F\"><h3>Is data from an inactive plugin considered orphaned?<\/h3><\/dt>\n<dd><p>No. Inactive but installed plugins have a distinct status and are not treated as missing.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20database%20size%20access%20is%20restricted%3F\"><h3>What happens when database size access is restricted?<\/h3><\/dt>\n<dd><p>Table and total-size fields are marked unavailable. Other diagnostics continue to work, and restricted <code>information_schema<\/code> access is not treated as database failure.<\/p><\/dd>\n<dt id=\"how%20are%20snapshots%20stored%3F\"><h3>How are snapshots stored?<\/h3><\/dt>\n<dd><p>Snapshots are stored locally in a non-autoloaded WordPress option, limited to 20 operations and 14 days, and removed when the plugin is uninstalled. Snapshot values are excluded from exports and AI context.<\/p><\/dd>\n<dt id=\"does%20ai%20have%20access%20to%20cleanup%20tools%3F\"><h3>Does AI have access to cleanup tools?<\/h3><\/dt>\n<dd><p>No. AI is an optional explanation layer. It receives a capped, redacted metadata report only after an administrator requests an explanation. No mutation ability or database credential is exposed.<\/p><\/dd>\n<dt id=\"does%20sac%20contact%20an%20ai%20provider%20when%20ai%20is%20unavailable%3F\"><h3>Does SAC contact an AI provider when AI is unavailable?<\/h3><\/dt>\n<dd><p>No. AI UI is enabled only when WordPress reports that configured text generation is supported. All other functionality is independent of AI.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20every%20maintenance%20action%3F\"><h3>Can I disable every maintenance action?<\/h3><\/dt>\n<dd><p>Yes. Add <code>add_filter( 'wpdi_read_only', '__return_true' );<\/code> in site-specific code.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed PHP warnings and deprecations from information_schema table metadata on MySQL 8 hosts.<\/li>\n<li>Fixed AI interpretation failing with a 400 error on providers that reject an explicit temperature.<\/li>\n<li>Fixed CSV export deprecation on PHP 8.4 and made output RFC 4180 compliant.<\/li>\n<li>Collected the diagnostic report once per request instead of re-scanning per section.<\/li>\n<li>Refreshed the admin interface with a cleaner, more professional design.<\/li>\n<li>Excluded development files from the production package.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added modular report, ownership, cleanup, snapshot, export, and AI services.<\/li>\n<li>Added normalized deterministic diagnostic reports and explainable health categories.<\/li>\n<li>Added conservative plugin database footprint estimates and owner status distinctions.<\/li>\n<li>Added read-only ghost data findings with confidence and reasons.<\/li>\n<li>Added paginated\/searchable autoload inspection, protected options, and redacted previews.<\/li>\n<li>Added bounded cleanup, local safety snapshots, and supported restoration.<\/li>\n<li>Added redacted JSON, CSV, and HTML exports.<\/li>\n<li>Added optional provider-neutral WordPress 7.0 AI Client explanations.<\/li>\n<li>Preserved existing cleanup identifiers, hooks, AJAX names, read-only mode, and flat statistics response.<\/li>\n<li>Added PHPUnit, WordPress Coding Standards, PHP compatibility, and production-build configuration.<\/li>\n<li>Removed no functionality and added no telemetry, paid features, provider SDKs, or automatic external calls.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Stable release with the original inspection dashboard and manual cleanup actions.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Added contextual source identification to the autoload table.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Naming and compliance updates.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial database inspection dashboard, manual cleanup, read-only mode, and multisite support.<\/li>\n<\/ul>","raw_excerpt":"Inspect WordPress database health, plugin footprints, autoloaded options, and questionable leftovers with carefully controlled maintenance tools.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/277390","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=277390"}],"author":[{"embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jackofall1232"}],"wp:attachment":[{"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=277390"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=277390"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=277390"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=277390"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=277390"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=277390"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}