Created
November 18, 2025 15:52
-
-
Save codeverbojan/ebc2720260319b31b9375b389cf421b8 to your computer and use it in GitHub Desktop.
Custom wp_die handler for consistent error pages
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Custom wp_die handler for consistent error pages | |
| */ | |
| function sf_custom_wp_die_handler($message, $title = '', $args = array()) { | |
| // Default values | |
| $defaults = array( | |
| 'response' => 500, | |
| 'back_link' => false, | |
| 'text_direction' => 'ltr', | |
| 'charset' => 'UTF-8', | |
| 'code' => '', | |
| 'exit' => true | |
| ); | |
| $args = wp_parse_args($args, $defaults); | |
| // Handle WP_Error objects | |
| if (is_wp_error($message)) { | |
| $message = $message->get_error_message(); | |
| } | |
| // Ensure message is a string | |
| if (!is_string($message)) { | |
| $message = 'An error occurred'; | |
| } | |
| // Get site info | |
| $site_name = get_bloginfo('name'); | |
| $site_url = home_url(); | |
| // Determine appropriate back URL based on error type | |
| $back_url = home_url('/login'); | |
| if (strpos($message, 'permission') !== false || strpos($message, 'access') !== false) { | |
| $back_url = home_url('/dashboard'); | |
| } | |
| // Set appropriate title | |
| if (empty($title)) { | |
| if (strpos($message, 'expired') !== false || strpos($message, 'invalid') !== false) { | |
| $title = 'Link Expired'; | |
| } elseif (strpos($message, 'permission') !== false || strpos($message, 'access') !== false) { | |
| $title = 'Access Denied'; | |
| } elseif (strpos($message, 'security') !== false) { | |
| $title = 'Security Error'; | |
| } else { | |
| $title = 'Error'; | |
| } | |
| } | |
| ?> | |
| <!doctype html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <meta | |
| name="viewport" | |
| content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" | |
| /> | |
| <meta http-equiv="X-UA-Compatible" content="ie=edge" /> | |
| <title><?php echo wp_kses_post($title); ?> - <?php echo wp_kses_post($site_name); ?></title> | |
| <?php wp_head(); ?> | |
| </head> | |
| <body | |
| x-data="{ page: 'blank', loaded: true, darkMode: false, stickyMenu: false, sidebarToggle: false, scrollTop: false }" | |
| x-init=" | |
| if (localStorage.getItem('darkMode') === null) { | |
| darkMode = window.matchMedia('(prefers-color-scheme: dark)').matches; | |
| localStorage.setItem('darkMode', JSON.stringify(darkMode)); | |
| } else { | |
| darkMode = JSON.parse(localStorage.getItem('darkMode')); | |
| } | |
| $watch('darkMode', value => localStorage.setItem('darkMode', JSON.stringify(value))); | |
| " | |
| :class="{ 'dark bg-gray-900': darkMode === true }" | |
| > | |
| <!-- ===== Preloader Start ===== --> | |
| <div | |
| x-show="loaded" | |
| x-init="window.addEventListener('DOMContentLoaded', () => {setTimeout(() => loaded = false, 500)})" | |
| class="fixed left-0 top-0 z-999999 flex h-screen w-screen items-center justify-center bg-white dark:bg-black" | |
| > | |
| <div | |
| class="h-16 w-16 animate-spin rounded-full border-4 border-solid border-brand-500 border-t-transparent" | |
| ></div> | |
| </div> | |
| <!-- ===== Preloader End ===== --> | |
| <!-- ===== Page Wrapper Start ===== --> | |
| <div | |
| class="relative z-1 flex min-h-screen flex-col items-center justify-center overflow-hidden p-6" | |
| > | |
| <!-- ===== Common Grid Shape Start ===== --> | |
| <div class="absolute right-0 top-0 -z-1 w-full max-w-[250px] xl:max-w-[450px]"> | |
| <img src="<?php echo get_template_directory_uri(); ?>/assets/images/shape/grid-01.svg" alt="grid" /> | |
| </div> | |
| <div | |
| class="absolute bottom-0 left-0 -z-1 w-full max-w-[250px] rotate-180 xl:max-w-[450px]" | |
| > | |
| <img src="<?php echo get_template_directory_uri(); ?>/assets/images/shape/grid-01.svg" alt="grid" /> | |
| </div> | |
| <!-- ===== Common Grid Shape End ===== --> | |
| <!-- Centered Content --> | |
| <div class="mx-auto w-full max-w-[242px] text-center sm:max-w-[472px]"> | |
| <h1 | |
| class="mb-8 text-title-md font-bold text-gray-800 dark:text-white/90 xl:text-title-2xl" | |
| > | |
| <?php echo wp_kses_post($title); ?> | |
| </h1> | |
| <div class="mb-8"> | |
| <div class="mx-auto mb-6 flex h-20 w-20 items-center justify-center rounded-full bg-red-100 dark:bg-red-900/20"> | |
| <svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-ban-icon lucide-ban text-red-600 dark:text-red-400"> | |
| <path d="M4.929 4.929 19.07 19.071"/> | |
| <circle cx="12" cy="12" r="10"/> | |
| </svg> | |
| </div> | |
| </div> | |
| <p | |
| class="mb-6 mt-10 text-base text-gray-700 dark:text-gray-400 sm:text-lg" | |
| > | |
| <?php echo wp_kses_post($message); ?> | |
| </p> | |
| <div class="flex flex-col gap-3 sm:flex-row sm:justify-center"> | |
| <a | |
| href="<?php echo esc_url($back_url); ?>" | |
| class="inline-flex items-center justify-center rounded-lg border border-gray-300 bg-white px-5 py-3.5 text-sm font-medium text-gray-700 shadow-theme-xs hover:bg-gray-50 hover:text-gray-800 dark:border-gray-700 dark:bg-gray-800 dark:text-gray-400 dark:hover:bg-white/[0.03] dark:hover:text-gray-200" | |
| > | |
| Return to Login | |
| </a> | |
| <a | |
| href="<?php echo wp_kses_post($site_url); ?>" | |
| class="inline-flex items-center justify-center rounded-lg bg-brand-500 px-5 py-3.5 text-sm font-medium text-white shadow-theme-xs hover:bg-brand-600" | |
| > | |
| Continue to Dashboard | |
| </a> | |
| </div> | |
| </div> | |
| <!-- Footer --> | |
| <p | |
| class="absolute bottom-6 left-1/2 -translate-x-1/2 text-center text-sm text-gray-500 dark:text-gray-400" | |
| > | |
| © <span id="year"></span> - <?php echo esc_html($site_name); ?> | |
| </p> | |
| </div> | |
| <!-- ===== Page Wrapper End ===== --> | |
| <?php wp_footer(); ?> | |
| </body> | |
| </html> | |
| <?php | |
| if ($args['exit']) { | |
| exit; | |
| } | |
| } | |
| // Register the custom wp_die handler globally | |
| add_filter('wp_die_handler', function() { | |
| return 'sf_custom_wp_die_handler'; | |
| }); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment