{"id":359443,"date":"2026-08-31T01:31:17","date_gmt":"2026-08-31T01:31:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/attic-safe-database-audit\/"},"modified":"2026-08-31T17:26:39","modified_gmt":"2026-08-31T17:26:39","slug":"attic-safe-database-audit","status":"publish","type":"plugin","link":"https:\/\/es.wordpress.org\/plugins\/attic-safe-database-audit\/","author":23097907,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.1","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"Attic \u2014 Safe Database Audit","header_author":"Bishal Shrestha","header_description":"A read-only database audit that quarantines instead of deleting, and searches your code before it calls anything orphaned.","assets_banners_color":"0c1118","last_updated":"2026-08-31 17:26:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/rainynewt\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":42,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"rainynewt","date":"2026-08-31 01:30:44","revision":3673275},"1.0.1":{"tag":"1.0.1","author":"rainynewt","date":"2026-08-31 17:26:39","revision":3674723}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3673275,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3673275,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3673275,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3673275,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[8533,3786,153,187,247],"plugin_category":[52,54,59],"plugin_contributors":[271439],"plugin_business_model":[],"class_list":["post-359443","plugin","type-plugin","status-publish","hentry","plugin_tags-audit","plugin_tags-cleanup","plugin_tags-database","plugin_tags-optimization","plugin_tags-performance","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_category-utilities-and-tools","plugin_contributors-rainynewt","plugin_committers-rainynewt"],"banners":{"banner":"https:\/\/ps.w.org\/attic-safe-database-audit\/assets\/banner-772x250.png?rev=3673275","banner_2x":"https:\/\/ps.w.org\/attic-safe-database-audit\/assets\/banner-1544x500.png?rev=3673275","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/attic-safe-database-audit\/assets\/icon-128x128.png?rev=3673275","icon_2x":"https:\/\/ps.w.org\/attic-safe-database-audit\/assets\/icon-256x256.png?rev=3673275","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Uninstalled and misbehaving plugins leave behind lingering database bloat \u2014 autoloaded options, ghost cron events, stranded transients, orphaned tables. Traditional cleanup tools reach for aggressive drop\/delete queries that risk breaking your site.<\/p>\n\n<p>Attic audits your WordPress database for bloat, without any of that:<\/p>\n\n<ul>\n<li><strong>Autoloaded option bloat<\/strong> \u2014 oversized options that load on every page request, ranked by size against Site Health's 800 KB line.<\/li>\n<li><strong>Ghost cron events<\/strong> \u2014 scheduled hooks with no registered callback, firing forever and doing nothing.<\/li>\n<li><strong>Orphaned tables<\/strong> \u2014 tables no installed plugin claims, with reclaimable megabytes up front.<\/li>\n<li><strong>Stranded transients<\/strong> \u2014 expired timeout pairs and orphaned rows.<\/li>\n<li><strong>Leftovers from deleted plugins<\/strong> \u2014 data whose owning plugin is absent from disk entirely.<\/li>\n<\/ul>\n\n<p>Two rules outrank every feature:<\/p>\n\n<ol>\n<li><strong>Quarantine, never delete.<\/strong> Options are stored before removal. Tables are renamed (<code>wp_attic_quarantined_*<\/code>), never dropped until a purge window passes.<\/li>\n<li><strong>Nothing is called orphaned until your code has been searched for it.<\/strong> Attic streams <code>wp-content<\/code> \u2014 plugins, mu-plugins, themes, <code>wp-config.php<\/code> \u2014 looking for every candidate name before promoting anything to high confidence.<\/li>\n<\/ol>\n\n<p>Every finding shows its full evidence inline: which rule fired, what it attributed to and whether that plugin exists on disk, how many code references were found, and the size. A finding you cannot audit is a finding you should not act on.<\/p>\n\n<h3>Filters<\/h3>\n\n<ul>\n<li><code>attic_protected_options<\/code> \u2014 additional never-flag option names<\/li>\n<li><code>attic_protected_cron_hooks<\/code> \/ <code>attic_protected_tables<\/code> \u2014 same, for cron and tables<\/li>\n<li><code>attic_finding_confidence<\/code> \u2014 last word on any single finding's confidence<\/li>\n<li><code>attic_reference_scan_roots<\/code> \u2014 unusual layouts, custom content dirs<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>attic<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress.<\/li>\n<li>Navigate to <strong>Tools \u2192 Attic<\/strong> to run your first audit.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20this%20safe%3F\"><h3>Is this safe?<\/h3><\/dt>\n<dd><p>The scan is read-only. Nothing changes until you take an explicit, confirmed action. Core options like <code>siteurl<\/code>, <code>active_plugins<\/code> and <code>cron<\/code> can never be flagged, and neither can anything on your own protected list or the <code>attic_protected_options<\/code> filter.<\/p><\/dd>\n<dt id=\"how%20do%20i%20undo%20something%3F\"><h3>How do I undo something?<\/h3><\/dt>\n<dd><p>Tools \u2192 Attic \u2192 Quarantine. Every action creates a batch; restore a whole batch in one click. Batches auto-purge after 30 days (configurable).<\/p><\/dd>\n<dt id=\"why%20does%20my%20finding%20say%20%22review%22%20instead%20of%20%22high%22%3F\"><h3>Why does my finding say \"review\" instead of \"high\"?<\/h3><\/dt>\n<dd><p>High confidence requires: the owning plugin absent from disk (or size-flagged <em>and<\/em> unread), AND zero literal AND zero prefix references in your code. Dynamic option names never literal-match, so weak signals still demote findings. If your filesystem could not be read, everything is marked unverified rather than guessed at.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20external%20object%20caches%3F\"><h3>Does it work with external object caches?<\/h3><\/dt>\n<dd><p>Yes \u2014 when Redis\/Memcached is active, transients never touch the options table, and Attic says so instead of showing a meaningless clean bill of health.<\/p><\/dd>\n<dt id=\"multisite%3F\"><h3>Multisite?<\/h3><\/dt>\n<dd><p>Single-site and subdirectory multisite installs work. Network-wide fleet scanning is planned.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: Quarantine action now correctly updates finding state (broken by SQL syntax error).<\/li>\n<li>Fix: Orphan tables rule no longer flags Attic's own tables on sites with nested table prefixes (e.g. wp_pc_attic_*).<\/li>\n<li>Add: Stop scan button to abort long-running scans mid-flight.<\/li>\n<li>Fix: Findings page defaults to latest completed scan instead of showing duplicates across all scans.<\/li>\n<li>Fix: Scan complete state now hides progress bar and stop button cleanly.<\/li>\n<li>Fix: Empty quarantine batches are cleaned up automatically.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial plugin release: read-only database audit with quarantine-based undo, five detection rules, budgeted scan engine, reference scanning, quarantine with batch restore, and attribution map.<\/li>\n<\/ul>","raw_excerpt":"A read-only database audit that quarantines instead of deleting, and searches your code before it calls anything orphaned.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/359443","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=359443"}],"author":[{"embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/rainynewt"}],"wp:attachment":[{"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=359443"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=359443"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=359443"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=359443"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=359443"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=359443"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}