"Critical Error on This Website" on WP: Notify and Prevent

Updated 02/06/2024, Posted 02/06/2024 by James Parsons James Parsons 0 Comments

This is another fun one! Today I logged into check the latest search engine and SEO news as I usually do, and I see this on Search Engine Watch:

Sew Error

What's worse, it's been like this all day. I'm surprised nobody's fixed it by now when hundreds of thousands of people are seeing this error and leaving.

Needless to say, this situation sucks, and it's happened to us all! This is just how WordPress handles things. If a plugin has an issue after an automatic update, it breaks your entire site. They don't disable the plugin for security reasons; after all, if it's your security plugin that happened to malfunction, this would disable your security and your site would be easier to compromise. To WordPress, it's safer to just take your site down - even if the plugin isn't mission critical.

I don't think it's the best way of handling these situations, and it's better to be proactive about these things so you don't end up like Search Engine Watch today.

I set out to create a script that will keep a look out for these critical PHP errors and if it finds a plugin with a critical error, it will alert you (the admin) so that you can fix it quickly.

Note: Thoroughly test this in a non-production environment before you consider using this on a live site.

/*
 * Notify me when a plugin just broke my site
 */ 
 
function notify_admin_of_plugin_error($pluginDir, $errorType, $message, $file, $line) {
	$lastSent = get_option('my_custom_error_last_sent_' . $pluginDir);
	$currentTime = time();
	if (!$lastSent || $currentTime - $lastSent >= 3600) {
		update_option('my_custom_error_last_sent_' . $pluginDir, $currentTime);
		$subject = "Critical Plugin Error: " . $pluginDir;
		$body = "A critical error occurred in the plugin: {$pluginDir}\n";
		$body .= "Error Type: {$errorType}\n";
		$body .= "Error Message: {$message}\n";
		$body .= "File: {$file}\n";
		$body .= "Line: {$line}\n";
		$body .= "Time: " . date("Y-m-d H:i:s", $currentTime);
		wp_mail(get_option('admin_email'), $subject, $body);
		error_log("Notified admin of critical error in plugin: {$pluginDir}");
	}
}

function my_custom_error_handler($severity, $message, $file, $line) {
	if (!in_array($severity, [E_ERROR, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR])) {
		return false;
	}
	if (strpos($file, '/wp-content/plugins/') !== false) {
		$start = strpos($file, '/plugins/') + 9;
		$end = strpos($file, '/', $start);
		$pluginDir = substr($file, $start, $end - $start);
		notify_admin_of_plugin_error($pluginDir, "Error", $message, $file, $line);
	}
	return false;
}

function my_custom_exception_handler($exception) {
	$file = $exception->getFile();
	if (strpos($file, '/wp-content/plugins/') !== false) {
		$start = strpos($file, '/plugins/') + 9;
		$end = strpos($file, '/', $start);
		$pluginDir = substr($file, $start, $end - $start);
		notify_admin_of_plugin_error($pluginDir, "Exception", $exception->getMessage(), $file, $exception->getLine());
	}
}

set_error_handler('my_custom_error_handler');
set_exception_handler('my_custom_exception_handler');

How to install

To install, save this code as a .php file (example: notify-on-critical-error.php) and then upload that file to the following directory via FTP or a file manager plugin:

  • /wp-content/mu-plugins/

Why the /mu-plugins/ folder?

Well, if you have a real site-breaking issue, there's a real chance that execution of your code will stop before this code even has a chance to run. And that kind of defeats the purpose, right?

What's cool is that when you put this code in the /mu-plugins/ directory, it will run before all of your other plugins and theme code. This establishes a much more reliable mechanism to react to errors.

How does it notify me?

This is configured to message the admin email (the one set in WordPress > Settings > General > Administration Email Address) when something breaks.

If you wanted to, you could even modify this pretty easily to send you a SMS message for even faster and more urgent notifications. After all, if your site goes down when you're out

This script is configured to send a message no more than once per hour, so you won't get hit with a thousand emails over and over. But, don't wait forever, or those notices will stack up - this is designed for critical, site-breaking errors and emergency notifications. of the office, an email may not do you much good unless you happen to be checking your inbox.

What versions of WordPress and PHP does this work with?

This should work with most modern versions of WordPress.

The error "There has been a critical error on this website." was introduced in WordPress Version 5.2 on May 7, 2019 - so since you're reading this and you're trying to prevent these errors, I can safely assume your WordPress installation is newer than that!

This is also configured to work with various versions of PHP. Before PHP 7, errors were represented by simple error codes which limited error handling. PHP 7 introduced a hierarchy of throwable exceptions and errors for more sophisticated error handling. This code should satisfy both as it has two different error handlers; one legacy, one modern.

Closing thoughts

What do you think? How do you currently handle and prevent the "There has been a critical error on this website." WordPress error? Please let me know in the comments!

Related Code Snippets

Written by James Parsons

Hi, I'm James Parsons! I founded Content Powered, a content marketing agency where I partner with businesses to help them grow through strategic content. With nearly twenty years of SEO and content marketing experience, I've had the joy of helping companies connect with their audiences in meaningful ways. I started my journey by building and growing several successful eCommerce companies solely through content marketing, and I love to share what I've learned along the way. You'll find my thoughts and insights in publications like Search Engine Watch, Search Engine Journal, Forbes, Entrepreneur, and Inc, among others. I've been fortunate to work with wonderful clients ranging from growing businesses to Fortune 500 companies like eBay and Expedia, and helping them shape their content strategies. My focus is on creating optimized content that resonates and converts. I'd love to connect – the best way to contact me is by scheduling a call or by email.