Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Select an option

  • Save codeverbojan/ebc2720260319b31b9375b389cf421b8 to your computer and use it in GitHub Desktop.

Select an option

Save codeverbojan/ebc2720260319b31b9375b389cf421b8 to your computer and use it in GitHub Desktop.
Custom wp_die handler for consistent error pages
/**
* 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"
>
&copy; <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