{"id":316962,"date":"2026-06-05T10:39:20","date_gmt":"2026-06-05T10:39:20","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/graceful-error-pages\/"},"modified":"2026-06-05T10:38:43","modified_gmt":"2026-06-05T10:38:43","slug":"graceful-error-pages","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/graceful-error-pages\/","author":23491437,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.7","stable_tag":"1.0.7","tested":"7.0","requires":"6.4","requires_php":"8.0","requires_plugins":null,"header_name":"Graceful Error Pages","header_author":"Bojan Josifoski","header_description":"Replace WordPress's ugly error screens with branded, professional pages \u2014 in one click.","assets_banners_color":"737d8c","last_updated":"2026-06-05 10:38:43","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/codeverbojan\/graceful-error-pages","header_author_uri":"https:\/\/bojanjosifoski.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":35,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.7":{"tag":"1.0.7","author":"josifoskibojan","date":"2026-06-05 10:38:43"}},"upgrade_notice":{"1.0.7":"<p>Replace inline onclick handlers with wp_print_inline_script_tag<\/p>","1.0.6":"<p>Increase PHPStan memory limit to 1G for CI<\/p>","1.0.5":"<p>Remove dead sanitizer wrappers, add request method check<\/p>","1.0.4":"<p>Wp.org compliance \u2014 use wp_enqueue_style for all CSS output<\/p>","1.0.3":"<p>Fix author metadata and plugin URI<\/p>","1.0.2":"<p>Add FSE\/block theme brand color detection, fix PCP warnings<\/p>","1.0.1":"<p>Add @wordpress\/scripts build process, rename prefix to gcep, upgrade PHPStan 2<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3562236,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3562236,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3562236,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3562236,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3562236,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3562237,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/wp-admin\\\/options-general.php?page=gcep-settings\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"phpExtensionBundles\":[\"kitchen-sink\"],\"login\":true,\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"graceful-error-pages\"},\"options\":{\"activate\":true}}]}"}},"all_blocks":[],"tagged_versions":["1.0.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3562236,"resolution":"1","location":"assets","locale":"","width":1440,"height":900},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3562236,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3562236,"resolution":"3","location":"assets","locale":"","width":1440,"height":900},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3562236,"resolution":"4","location":"assets","locale":"","width":1440,"height":900},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3562236,"resolution":"5","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"The default Minimal template replacing the WordPress error screen.","2":"The settings page \u2014 Design tab with template picker.","3":"The settings page \u2014 Content tab with messaging options.","4":"The Corporate template with site logo.","5":"The Dark template with dark mode styling."}},"plugin_section":[],"plugin_tags":[2604,265968,29197,970,265967],"plugin_category":[],"plugin_contributors":[263641],"plugin_business_model":[],"class_list":["post-316962","plugin","type-plugin","status-publish","hentry","plugin_tags-branding","plugin_tags-custom-error","plugin_tags-error-handling","plugin_tags-error-page","plugin_tags-wp-die","plugin_contributors-josifoskibojan","plugin_committers-josifoskibojan"],"banners":{"banner":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/banner-772x250.png?rev=3562236","banner_2x":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/banner-1544x500.png?rev=3562236","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/icon.svg?rev=3562236","icon":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/icon.svg?rev=3562236","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/screenshot-1.png?rev=3562236","caption":"The default Minimal template replacing the WordPress error screen."},{"src":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/screenshot-2.png?rev=3562236","caption":"The settings page \u2014 Design tab with template picker."},{"src":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/screenshot-3.png?rev=3562236","caption":"The settings page \u2014 Content tab with messaging options."},{"src":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/screenshot-4.png?rev=3562236","caption":"The Corporate template with site logo."},{"src":"https:\/\/ps.w.org\/graceful-error-pages\/assets\/screenshot-5.png?rev=3562236","caption":"The Dark template with dark mode styling."}],"raw_content":"<!--section=description-->\n<p>Every WordPress site shows the same plain white error screen when something goes wrong.\nIt looks broken. It destroys trust. Graceful Error Pages replaces it with a page that\nmatches your brand \u2014 automatically, the moment you activate it.<\/p>\n\n<p><strong>What it replaces:<\/strong><\/p>\n\n<ul>\n<li>The <code>wp_die()<\/code> error screen (permission errors, expired links, security blocks)<\/li>\n<li>PHP fatal error screens (white screen of death)<\/li>\n<\/ul>\n\n<p><strong>Features:<\/strong><\/p>\n\n<ul>\n<li><strong>Zero-config activation<\/strong> \u2014 works immediately with auto-detected site name, logo, and colors<\/li>\n<li><strong>Five built-in templates<\/strong> \u2014 Minimal, Corporate, Friendly, Dark, and Starter<\/li>\n<li><strong>Brand customization<\/strong> \u2014 logo, colors, heading, message, and redirect URL<\/li>\n<li><strong>Merge tags<\/strong> \u2014 dynamic content like {site_name} and {year}<\/li>\n<li><strong>Self-contained styling<\/strong> \u2014 no theme or CDN dependencies (works even during fatal errors)<\/li>\n<li><strong>API safe<\/strong> \u2014 only overrides HTML output; REST API, AJAX, and JSON responses are untouched<\/li>\n<li><strong>WP-CLI safe<\/strong> \u2014 automatically skips CLI contexts<\/li>\n<li><strong>Lightweight<\/strong> \u2014 zero overhead on normal page loads; only runs when an error occurs<\/li>\n<li><strong>Fully translatable<\/strong> \u2014 all strings use WordPress i18n functions<\/li>\n<\/ul>\n\n<p><strong>How it works:<\/strong><\/p>\n\n<ol>\n<li>Activate the plugin<\/li>\n<li>Your site's error pages are instantly branded with auto-detected settings<\/li>\n<li>Optionally customize via Settings &gt; Error Pages<\/li>\n<\/ol>\n\n<p><strong>Source Code<\/strong><\/p>\n\n<p>The full source code, including unminified JavaScript and build tools, is available at:\n<a href=\"https:\/\/github.com\/codeverbojan\/graceful-error-pages\">github.com\/codeverbojan\/graceful-error-pages<\/a><\/p>\n\n<p>To build from source:<\/p>\n\n<ol>\n<li>Clone the repository<\/li>\n<li>Run <code>composer install<\/code><\/li>\n<li>Run <code>npm install<\/code><\/li>\n<li>Run <code>npm run build<\/code><\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>graceful-error-pages<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress<\/li>\n<li>That's it \u2014 error pages are now branded automatically<\/li>\n<li>Optionally go to <strong>Settings &gt; Error Pages<\/strong> to customize the template, colors, and messaging<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20out%20of%20the%20box%3F\"><h3>Does this work out of the box?<\/h3><\/dt>\n<dd><p>Yes. On activation the plugin auto-detects your site name, logo, and brand color from your\nWordPress settings. Works with both classic and block (FSE) themes. No configuration is required.<\/p><\/dd>\n<dt id=\"which%20error%20screens%20does%20this%20replace%3F\"><h3>Which error screens does this replace?<\/h3><\/dt>\n<dd><p>Two types: (1) the <code>wp_die()<\/code> screen shown for permission errors, expired nonces, and\nsimilar issues, and (2) the PHP fatal error screen (white screen of death).<\/p><\/dd>\n<dt id=\"will%20this%20break%20my%20rest%20api%20or%20ajax%3F\"><h3>Will this break my REST API or AJAX?<\/h3><\/dt>\n<dd><p>No. The plugin only overrides the HTML die handler. REST API, AJAX, JSON, and JSONP\nhandlers are left completely untouched.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20wp-cli%3F\"><h3>Does this work with WP-CLI?<\/h3><\/dt>\n<dd><p>Yes. The plugin detects CLI contexts and skips the custom handler entirely.<\/p><\/dd>\n<dt id=\"does%20this%20affect%20wp-admin%3F\"><h3>Does this affect wp-admin?<\/h3><\/dt>\n<dd><p>Not by default. The handler only fires on the front end unless you explicitly enable\nadmin override in the settings.<\/p><\/dd>\n<dt id=\"can%20i%20create%20my%20own%20template%3F\"><h3>Can I create my own template?<\/h3><\/dt>\n<dd><p>The five built-in templates cover most use cases. Custom template support is planned\nfor a future release.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20woocommerce%3F\"><h3>Does this work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. The plugin works with any WordPress site, including WooCommerce stores. Error pages\nare styled independently of your theme or any other plugin.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20load%20anything%20on%20every%20page%3F\"><h3>Does the plugin load anything on every page?<\/h3><\/dt>\n<dd><p>No. The plugin registers its handler on init but only renders output when <code>wp_die()<\/code> is\nactually called or a fatal error occurs. There is zero performance impact on normal pages.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Fix: Replace inline onclick handlers with wp_print_inline_script_tag<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fix: Increase PHPStan memory limit to 1G for CI<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Fix: Remove dead sanitizer wrappers, add request method check<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fix: Wp.org compliance \u2014 use wp_enqueue_style for all CSS output<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fix author metadata and plugin URI across all files<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Add FSE\/block theme brand color detection, fix PCP warnings<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Add @wordpress\/scripts build process, rename prefix to gcep, upgrade PHPStan 2<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Custom wp_die() handler with branded error pages<\/li>\n<li>PHP fatal error shutdown handler with self-contained styling<\/li>\n<li>Five built-in templates: Minimal, Corporate, Friendly, Dark, Starter<\/li>\n<li>Admin settings page under Settings &gt; Error Pages<\/li>\n<li>Auto-detection of site name, logo, and brand color on activation<\/li>\n<li>Merge tags for dynamic content<\/li>\n<li>Full i18n support<\/li>\n<\/ul>","raw_excerpt":"Replace WordPress&#039;s ugly error screens with branded, professional pages \u2014 in one click.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/316962","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=316962"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/josifoskibojan"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=316962"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=316962"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=316962"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=316962"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=316962"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=316962"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}