{"id":342692,"date":"2026-08-17T18:51:17","date_gmt":"2026-08-17T18:51:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/mvp-most-valuable-pugin\/"},"modified":"2026-08-17T18:57:20","modified_gmt":"2026-08-17T18:57:20","slug":"error-sniffing-pug","status":"publish","type":"plugin","link":"https:\/\/ne.wordpress.org\/plugins\/error-sniffing-pug\/","author":15682717,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.4","stable_tag":"0.4.4","tested":"7.0.4","requires":"5.2","requires_php":"7.0","requires_plugins":null,"header_name":"Error Sniffing Pug","header_author":"Pug","header_description":"Diagnoses WordPress fatal errors in plain language, identifies the culprit plugin, emails the reason, and generates a privacy-safe bug report for the plugin's author.","assets_banners_color":"","last_updated":"2026-08-17 18:57:20","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.service2client.com\/dynamic-post-donation","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":32,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.4.3":{"tag":"0.4.3","author":"service2client","date":"2026-08-17 18:51:03"},"0.4.4":{"tag":"0.4.4","author":"service2client","date":"2026-08-17 18:57:20"}},"upgrade_notice":{"0.4.2":"<ul>\n<li>Removed the &quot;Hosting provider list&quot; (managed messages)<\/li>\n<\/ul>","0.4.1":"<p>The custom crash screen has been removed; you&#039;ll now hear about captured fatals through the notification email and a new admin notice. No action needed.<\/p>","0.3.0":"<p>Adds an optional custom crash screen and shows plugin display names. Re-save the crash-screen settings after updating so the screen file refreshes.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.4.3","0.4.4"],"block_files":[],"assets_screenshots":{"screenshot-1.PNG":{"filename":"screenshot-1.PNG","revision":3651577,"resolution":"1","location":"assets","locale":"","width":1395,"height":593},"screenshot-2.PNG":{"filename":"screenshot-2.PNG","revision":3651577,"resolution":"2","location":"assets","locale":"","width":925,"height":589},"screenshot-3.PNG":{"filename":"screenshot-3.PNG","revision":3651577,"resolution":"3","location":"assets","locale":"","width":1397,"height":793}},"screenshots":{"1":"Scan for conflicts before they crash, allows the admin to submit reports to the plugin builder.","2":"Customize error messages to be user friendly, and per plugin instructions of what to do.","3":"Connects the Admin to the plugin authors Github page."}},"plugin_section":[],"plugin_tags":[5790,2679,222216,22682,8541],"plugin_category":[59],"plugin_contributors":[261600],"plugin_business_model":[],"class_list":["post-342692","plugin","type-plugin","status-publish","hentry","plugin_tags-crash","plugin_tags-debugging","plugin_tags-error-handler","plugin_tags-fatal-error","plugin_tags-troubleshooting","plugin_category-utilities-and-tools","plugin_contributors-service2client","plugin_committers-service2client"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/error-sniffing-pug.svg","icon_2x":false,"generated":true},"screenshots":[{"src":"https:\/\/ps.w.org\/error-sniffing-pug\/assets\/screenshot-1.PNG?rev=3651577","caption":"Scan for conflicts before they crash, allows the admin to submit reports to the plugin builder."},{"src":"https:\/\/ps.w.org\/error-sniffing-pug\/assets\/screenshot-2.PNG?rev=3651577","caption":"Customize error messages to be user friendly, and per plugin instructions of what to do."},{"src":"https:\/\/ps.w.org\/error-sniffing-pug\/assets\/screenshot-3.PNG?rev=3651577","caption":"Connects the Admin to the plugin authors Github page."}],"raw_content":"<!--section=description-->\n<p>When WordPress hits a fatal error, the usual result is a blank \"There has been a critical error on this website\" page and a cryptic line buried in a log file you have to go find. Pug catches that moment and turns it into something you can act on.<\/p>\n\n<p><strong>What you get<\/strong><\/p>\n\n<ul>\n<li><strong>A plain-language diagnosis.<\/strong> Pug recognizes common fatal patterns \u2014 an undefined function or method, calling a method on null, a class that can't be found, \"cannot redeclare\", out of memory, max execution time, parse errors, a missing file, a type error, and more \u2014 and explains in one sentence what actually went wrong. When it doesn't recognize the pattern, it says so honestly rather than guessing.<\/li>\n<li><strong>The culprit, named.<\/strong> Pug maps the crash back to the specific plugin, must-use plugin, or theme whose code was running, so you're not guessing which of thirty plugins to suspect.<\/li>\n<li><strong>A crash-notification email.<\/strong> Point Pug at an address and it emails you when a new fatal is captured \u2014 the plugin involved, the plain-language reason, and where it happened \u2014 so you learn about problems without watching a dashboard. Email is sent shortly after the crash from a safe context, never during the crash itself.<\/li>\n<li><strong>A privacy-safe bug report.<\/strong> For any crash, Pug produces a copy-ready report for the responsible plugin's support forum, with absolute paths, your home directory, and your site's address stripped out. Pug never transmits it \u2014 you copy and paste it yourself.<\/li>\n<li><strong>An after-crash admin notice.<\/strong> The next time you open wp-admin after a fatal is captured, Pug shows a dismissible notice linking straight to the report \u2014 so you find out even if you aren't watching a dashboard, and even if email isn't configured.<\/li>\n<li><strong>A conflict scanner.<\/strong> On demand, Pug scans your active plugins for functions or classes declared by more than one of them \u2014 the \"cannot redeclare\" landmine \u2014 and names both sides before it bites you.<\/li>\n<\/ul>\n\n<p><strong>How Pug captures fatals<\/strong><\/p>\n\n<p>Pug uses WordPress' own drop-in mechanism. On activation it installs <code>wp-content\/fatal-error-handler.php<\/code>, which core loads earlier than any plugin \u2014 that is what lets Pug see a fatal that happens before normal plugins have even loaded. It subclasses core's handler and then hands control straight back to WordPress, so Recovery Mode and the recovery email keep working exactly as they do without Pug. Deactivating the plugin removes the drop-in and stops capture; deleting the plugin removes everything.<\/p>\n\n<p><strong>What Pug does not do<\/strong><\/p>\n\n<ul>\n<li>It does not send your crash details to us or to any third party. Diagnosis happens on your own server, and the bug report is copy-and-paste, not an automatic upload.<\/li>\n<li>It does not modify or delete your posts, pages, or any content. It reads nothing from your database except its own settings.<\/li>\n<li>It does not run its analysis during a crash beyond recording the incident \u2014 no network calls, no heavy work on the error path.<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to one external service, described below. No crash contents are ever sent anywhere.<\/p>\n\n<p><strong>WordPress.org plugin API (api.wordpress.org)<\/strong><\/p>\n\n<p>When a crash is attributed to a plugin, Pug asks the WordPress.org plugin API whether that plugin is listed there, so it can offer a link to the plugin's page and support forum. The only data sent is the plugin's slug (folder name). This happens on demand while you view a crash report, is cached, and never runs during a crash. WordPress.org is operated by the WordPress Foundation; see https:\/\/wordpress.org\/about\/privacy\/.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>error-sniffing-pug<\/code> folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP through Plugins \u2192 Add New \u2192 Upload.<\/li>\n<li>Activate the plugin. On activation Pug installs its capture drop-in at <code>wp-content\/fatal-error-handler.php<\/code>.<\/li>\n<li>Visit <strong>Tools \u2192 Pug Crash Reports<\/strong> to see captured fatals, and <strong>Tools \u2192 Pug Settings<\/strong> to set a notification email, write custom messages, or run the conflict scanner.<\/li>\n<\/ol>\n\n<p>Pug needs <code>wp-content<\/code> to be writable so it can install its drop-in. If it can't, it will tell you in the admin and fall back to WordPress' default behavior.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20slow%20down%20my%20site%3F\"><h3>Will this slow down my site?<\/h3><\/dt>\n<dd><p>No. Pug does its work on the admin side and on the error path only. On a normal page load it does almost nothing; the diagnosis, help links, and reports are all generated when you open a crash report, not on every request.<\/p><\/dd>\n<dt id=\"what%20are%20the%20extra%20files%20in%20wp-content%3F\"><h3>What are the extra files in wp-content?<\/h3><\/dt>\n<dd><p>fatal-error-handler.php is Pug's capture drop-in, installed on activation. It is a standard WordPress drop-in location \u2014 the only path from which core will load a custom fatal handler. Pug installs, updates, and removes it for you, and will never overwrite one that belongs to another plugin.<\/p><\/dd>\n<dt id=\"what%20if%20another%20plugin%20already%20uses%20the%20fatal-error-handler%20drop-in%3F\"><h3>What if another plugin already uses the fatal-error-handler drop-in?<\/h3><\/dt>\n<dd><p>Only one <code>fatal-error-handler.php<\/code> can exist. If another plugin got there first, Pug will not overwrite it, and Pug's capture will not run. Pug tells you this in the admin so you can decide which one to keep.<\/p><\/dd>\n<dt id=\"does%20it%20work%20on%20older%20php%3F\"><h3>Does it work on older PHP?<\/h3><\/dt>\n<dd><p>Pug supports PHP 7.0 and newer. On PHP older than 7.0 it deactivates its own code quietly rather than causing errors.<\/p><\/dd>\n<dt id=\"is%20my%20crash%20data%20sent%20anywhere%20automatically%3F\"><h3>Is my crash data sent anywhere automatically?<\/h3><\/dt>\n<dd><p>No. Diagnosis is done locally. The bug report for a plugin author is copy-and-paste \u2014 you send it, Pug doesn't. The notification email goes only to the address you configure, through your own site's mail.<\/p><\/dd>\n<dt id=\"how%20do%20i%20find%20out%20when%20a%20crash%20happens%3F\"><h3>How do I find out when a crash happens?<\/h3><\/dt>\n<dd><p>Two ways, both private to you: point Pug at a notification email and it writes to you shortly after a fatal is captured, and the next time you open wp-admin Pug shows a dismissible notice linking to the report. Nothing is ever shown to your visitors.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>Removed the \"Hosting provider list\" (managed messages) feature and the external call it made to the vendor API. Per-plugin crash notes are managed through the built-in Custom Messages, which already export and import as JSON.<\/li>\n<li>Fixed the Custom Messages export action, which pointed at an outdated hook name.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Removed the optional custom crash screen (and its <code>php-error.php<\/code> drop-in). You now learn about a captured fatal through the crash-notification email and a new dismissible admin notice that links to the report.<\/li>\n<li>Incident data is stored under <code>wp_upload_dir()<\/code> (protected from direct access) instead of a folder in <code>wp-content<\/code>.<\/li>\n<li>All internal names use the <code>esniff<\/code> prefix; the admin script is enqueued through the standard API; local file reads go through <code>WP_Filesystem<\/code>; theme paths resolve via <code>get_theme_root()<\/code>.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Custom public crash screen with an admin-authored message, the plugin(s) involved (by display name), and your per-plugin note. Installed as a <code>php-error.php<\/code> drop-in only while enabled.<\/li>\n<li>Optional <code>{plugins}<\/code> token to weave plugin names into your message inline.<\/li>\n<li>Plain-language diagnosis engine and privacy-safe author bug report.<\/li>\n<li>Crash-notification email with the diagnosis and location.<\/li>\n<li>Function\/class conflict scanner.<\/li>\n<li>Proper plugin lifecycle: drop-in installed on activation, removed on deactivation, full cleanup on uninstall, and daily incident retention.<\/li>\n<\/ul>","raw_excerpt":"Turns a WordPress fatal error into a plain-language diagnosis, names the plugin at fault, emails you the reason, and prepares a privacy-safe bug repor &hellip;","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/342692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=342692"}],"author":[{"embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/service2client"}],"wp:attachment":[{"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=342692"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=342692"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=342692"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=342692"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=342692"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ne.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=342692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}