{"id":397342,"date":"2026-11-07T10:10:32","date_gmt":"2026-11-07T10:10:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/notice-triage\/"},"modified":"2026-11-07T10:10:16","modified_gmt":"2026-11-07T10:10:16","slug":"notice-triage","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/notice-triage\/","author":18252589,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.1.0","stable_tag":"0.1.0","tested":"7.1.4","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Notice Triage","header_author":"Avo Avetisyan","header_description":"Captures every admin notice, names the plugin behind it, ranks it by severity and shows one collapsed summary instead of a stack of banners. Critical warnings stay inline.","assets_banners_color":"a1a6ae","last_updated":"2026-11-07 10:10:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/profiles.wordpress.org\/loyaltyoverroyalty\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":179,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.1.0":{"tag":"0.1.0","author":"loyaltyoverroyalty","date":"2026-11-07 10:10:16","revision":3789320}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3789319,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3789319,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3789319,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3789319,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3789319,"resolution":"1","location":"assets","locale":"","width":2560,"height":1600},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3789319,"resolution":"2","location":"assets","locale":"","width":2560,"height":1600},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3789319,"resolution":"3","location":"assets","locale":"","width":2560,"height":1600},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3789319,"resolution":"4","location":"assets","locale":"","width":2560,"height":1600}},"screenshots":{"1":"One collapsed panel instead of a stack of banners; the critical notice stays inline above it.","2":"The panel expanded, grouped by bucket, each notice labelled with its source.","3":"Tools \u2192 Notice Log: every distinct notice, its source, bucket and how often it has appeared.","4":"Settings: bucket behaviour, the marketing and keyword lists, per-plugin rules and screen exclusions."}},"plugin_section":[],"plugin_tags":[83,26308,3786,434,4906],"plugin_category":[],"plugin_contributors":[279072],"plugin_business_model":[],"class_list":["post-397342","plugin","type-plugin","status-publish","hentry","plugin_tags-admin","plugin_tags-admin-notices","plugin_tags-cleanup","plugin_tags-dashboard","plugin_tags-notifications","plugin_contributors-loyaltyoverroyalty","plugin_committers-loyaltyoverroyalty"],"banners":{"banner":"https:\/\/ps.w.org\/notice-triage\/assets\/banner-772x250.png?rev=3789319","banner_2x":"https:\/\/ps.w.org\/notice-triage\/assets\/banner-1544x500.png?rev=3789319","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/notice-triage\/assets\/icon-128x128.png?rev=3789319","icon_2x":"https:\/\/ps.w.org\/notice-triage\/assets\/icon-256x256.png?rev=3789319","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/notice-triage\/assets\/screenshot-1.png?rev=3789319","caption":"One collapsed panel instead of a stack of banners; the critical notice stays inline above it."},{"src":"https:\/\/ps.w.org\/notice-triage\/assets\/screenshot-2.png?rev=3789319","caption":"The panel expanded, grouped by bucket, each notice labelled with its source."},{"src":"https:\/\/ps.w.org\/notice-triage\/assets\/screenshot-3.png?rev=3789319","caption":"Tools \u2192 Notice Log: every distinct notice, its source, bucket and how often it has appeared."},{"src":"https:\/\/ps.w.org\/notice-triage\/assets\/screenshot-4.png?rev=3789319","caption":"Settings: bucket behaviour, the marketing and keyword lists, per-plugin rules and screen exclusions."}],"raw_content":"<!--section=description-->\n<p>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.<\/p>\n\n<p>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 \u2014 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.<\/p>\n\n<h4>Buckets<\/h4>\n\n<ul>\n<li><strong>Critical<\/strong> \u2014 error notices. Shown inline, at the top, by default. You can collapse them too: the panel then opens by itself and turns red whenever a critical notice is present.<\/li>\n<li><strong>Needs action<\/strong> \u2014 warnings and update nags.<\/li>\n<li><strong>Informational<\/strong> \u2014 success and info notices.<\/li>\n<li><strong>Marketing &amp; license<\/strong> \u2014 licence prompts, upgrade pitches, review requests, sales. Collapsed by default whatever colour the plugin painted them. A notice the plugin marked as an error is never put here.<\/li>\n<\/ul>\n\n<p>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\u2026). The keyword and marketing lists are visible and editable in Settings and filterable in code.<\/p>\n\n<h4>Notice log<\/h4>\n\n<p>Tools \u2192 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.<\/p>\n\n<h4>Safe by design<\/h4>\n\n<p>This plugin intercepts other plugins' output, so the recovery paths come first:<\/p>\n\n<ul>\n<li><code>define( 'NOTICE_TRIAGE_DISABLE', true );<\/code> in wp-config.php switches capture off entirely.<\/li>\n<li>Append <code>?notice_triage_off=1<\/code> to any admin URL to bypass capture for that one page load \u2014 no FTP needed.<\/li>\n<li>Capture never runs during AJAX, REST, cron, the Customizer, iframes, or on the update and install screens, and never before the admin screen is known.<\/li>\n<li>A per-plugin \"always inline\" rule and a screen exclusion list exempt anything whose own scripts rely on inline notices.<\/li>\n<li>A notice callback that throws is caught and logged instead of taking down wp-admin.<\/li>\n<\/ul>\n\n<p>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.<\/p>\n\n<h4>Compatibility<\/h4>\n\n<p>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.<\/p>\n\n<ul>\n<li><strong>Yoast SEO<\/strong> \u2014 captured, attributed, \"blocking robots\" is Critical (inline), first-run configuration notice is Informational. No dismiss control on its notices.<\/li>\n<li><strong>Rank Math SEO<\/strong> \u2014 captured and attributed; \"only one SEO plugin\" is Critical and stays inline, its own dismiss works.<\/li>\n<li><strong>Elementor<\/strong> \u2014 captured and attributed; promotional notices land in Informational, its own dismiss control (<code>e-notice__dismiss<\/code>) works inside the panel and persists.<\/li>\n<li><strong>WooCommerce<\/strong> \u2014 no admin_notices output on a fresh store (its notes live in the WooCommerce Admin app). The panel renders on WooCommerce screens without conflict.<\/li>\n<li><strong>Jetpack<\/strong> \u2014 its connection banners are injected by JavaScript, not printed as admin notices, so they are neither captured nor affected.<\/li>\n<li><strong>Wordfence<\/strong> \u2014 captured and attributed (\"Needs action\"); its dismiss button works inside the panel and persists. Its onboarding banner is not a notice and passes through untouched.<\/li>\n<li><strong>WPForms<\/strong> \u2014 removes every admin notice on its own screens itself; elsewhere nothing to capture on a fresh install.<\/li>\n<li><strong>Contact Form 7<\/strong> \u2014 emits no notices on a fresh install; no conflict.<\/li>\n<li><strong>UpdraftPlus<\/strong> \u2014 welcome notice captured on its settings screen as Informational.<\/li>\n<\/ul>\n\n<p>No plugin needed the shipped \"always inline\" list, which is therefore empty in this release.<\/p>\n\n<h4>Known limitation<\/h4>\n\n<p>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 \u2192 Notice Triage \u2192 Per-plugin rules.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>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.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>notice-triage<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install it from the Plugins screen.<\/li>\n<li>Activate it.<\/li>\n<li>Open any admin screen: non-critical notices are now in a single collapsed panel. Tools \u2192 Notice Log shows what has been seen; Settings \u2192 Notice Triage holds the rules.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20is%20this%20different%20from%20the%20notice-hiding%20plugins%3F\"><h3>How is this different from the notice-hiding plugins?<\/h3><\/dt>\n<dd><p>Three things. Attribution: every notice is labelled with the plugin or theme whose callback printed it, resolved from the code, so you know who is shouting. Ranking: notices are sorted into Critical, Needs action, Informational and Marketing &amp; license, with a guard rail that never demotes an error notice, so critical warnings cannot vanish into a \"hidden\" pile. The log: each distinct notice is counted, so you can see which plugin has interrupted you hundreds of times and act on that plugin rather than on one banner.<\/p><\/dd>\n<dt id=\"does%20it%20hide%20anything%3F\"><h3>Does it hide anything?<\/h3><\/dt>\n<dd><p>Not on its own. Every notice is either inline or inside the panel. The only way a notice disappears is a mute or snooze you set yourself, and the panel still counts them. If you collapse the Critical bucket, the panel forces itself open whenever a critical notice is present.<\/p><\/dd>\n<dt id=\"a%20plugin%27s%20dismiss%20button%20stopped%20working.\"><h3>A plugin's dismiss button stopped working.<\/h3><\/dt>\n<dd><p>Open Settings \u2192 Notice Triage \u2192 Per-plugin rules and set that plugin to \"Always inline\". Its notices then print exactly where they did before. Please also open a support thread with the plugin's name so it can be added to the shipped defaults.<\/p><\/dd>\n<dt id=\"can%20i%20change%20what%20counts%20as%20marketing%3F\"><h3>Can I change what counts as marketing?<\/h3><\/dt>\n<dd><p>Yes. Settings \u2192 Notice Triage lists every phrase, one per line. Developers can also use the <code>notice_triage_marketing_patterns<\/code> and <code>notice_triage_boost_keywords<\/code> filters, and <code>notice_triage_severity<\/code> to override the final bucket for a notice.<\/p><\/dd>\n<dt id=\"does%20each%20user%20get%20their%20own%20settings%3F\"><h3>Does each user get their own settings?<\/h3><\/dt>\n<dd><p>Bucket behaviour and the admin bar badge can be overridden per user on the profile screen. Snoozes set from the panel are per user; mutes and rules set from the Notice Log apply to everyone.<\/p><\/dd>\n<dt id=\"something%20broke%20and%20i%20cannot%20reach%20wp-admin.\"><h3>Something broke and I cannot reach wp-admin.<\/h3><\/dt>\n<dd><p>Add <code>?notice_triage_off=1<\/code> to the admin URL to bypass the plugin for one page load, then switch capture off in Settings or deactivate it. For a permanent switch add <code>define( 'NOTICE_TRIAGE_DISABLE', true );<\/code> to wp-config.php.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20multisite%3F\"><h3>Does it work on multisite?<\/h3><\/dt>\n<dd><p>Yes. Network admin notices are captured on network screens. The log and settings are per site.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release.<\/li>\n<\/ul>","raw_excerpt":"Ranks admin notices instead of hiding them: critical stays inline, the rest collapse into one counted panel labelled with the plugin that sent it.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/397342","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=397342"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/loyaltyoverroyalty"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=397342"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=397342"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=397342"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=397342"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=397342"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=397342"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}