Every plugin gets to shout at the top of wp-admin, and they all do: licence reminders, review requests, setup wizards, update nags. The existing answer is to hide them, and that creates a worse problem: a genuinely critical warning disappears along with the sales pitch.
Notice Triage does not hide anything. It ranks. It captures every admin notice, works out which plugin or theme emitted it (by reflecting on the hook callback, not by guessing from the text), sorts it into a severity bucket and shows one summary bar: “6 notices — 2 need action, 3 informational, 1 license”. Critical notices stay inline by default, exactly where they were, unmodified. The log then tells you which plugin has shown you the same nag 400 times. Setup banners and onboarding bars that are not standard notice markup are collapsed as well; scripts and hidden templates pass through untouched. Nothing is deleted, nothing is rewritten; the panel simply moves the noise out of the way and labels each notice with its source.
Severity comes from the notice’s declared type, then its CSS classes, then a list of keywords that can only raise a notice (security, failed, database error…). The keyword and marketing lists are visible and editable in Settings and filterable in code.
Tools Notice Log lists every distinct notice this admin has seen: the plugin behind it, its bucket, when it first and last appeared and how often it has interrupted you (counted at most once every five minutes per notice, so the log costs nothing on busy sites). The same count shows next to each notice in the panel. From there you can mute a notice for everyone, snooze it for 7 or 30 days, or pin it inline or collapsed regardless of its bucket. Each notice in the panel also has a per-user Snooze link (7 days), and administrators get a Mute link right there. Counters and dates are normalised before logging, so “3 items need attention” and “4 items need attention” are one entry.
This plugin intercepts other plugins’ output, so the recovery paths come first:
define( 'NOTICE_TRIAGE_DISABLE', true ); in wp-config.php switches capture off entirely.?notice_triage_off=1 to any admin URL to bypass capture for that one page load — no FTP needed.Captured markup is re-emitted byte-for-byte, including ids, classes, data attributes and inline scripts, so each plugin’s own dismiss buttons and AJAX handlers keep working.
Checked on WordPress 7.1 with each plugin’s current release, on a clean site. “Dismiss” means the plugin’s own dismiss control was clicked inside the collapsed panel and the notice stayed dismissed after a reload.
e-notice__dismiss) works inside the panel and persists.No plugin needed the shipped “always inline” list, which is therefore empty in this release.
A plugin whose JavaScript binds to a position-dependent selector, or binds before the panel exists in the page, may lose its dismiss button when its notice is collapsed. Set that plugin to “Always inline” in Settings Notice Triage Per-plugin rules.
Notice Triage stores the plain-text excerpt, source and counts of each notice in a table on your site. It makes no outbound requests and sends nothing anywhere.