Skip to main content
WordPress

How We Fixed the “There Has Been a Critical Error on Your Website” in WordPress — Real Case Study (2025)

The exact steps that brought a live WordPress site back from the critical error screen: FTP plugin bisection, debug.log, and a PHP upgrade.

7 min
Read time
1,343
Words
Published
Last revised
Engr Mejba Ahmed

Written by

Engr Mejba Ahmed

Share Article

How We Fixed the “There Has Been a Critical Error on Your Website” in WordPress — Real Case Study (2025)

"There has been a critical error on your website." No pages, no admin dashboard, no warning. One of the sites my team manages went down with exactly that screen, and here is the thesis of this whole post: that message is not the error. It is WordPress hiding the error from your visitors. The real fatal error is sitting in a log file, and every minute you spend refreshing the page or waiting for a recovery email is a minute you are not spending reading it.

We got the site back the same day. This is the exact sequence we ran, including the two things the generic checklists never mention: why the recovery email often never arrives, and what actually happens in the database when you rename a plugin folder over FTP.

How We Fixed the “There Has Been a Critical Error on Your Website” in WordPress — Real Case Study (2025) - overview of what the critical error screen actually means, why you should not wait for the recovery email

What the critical error screen actually means

Since WordPress 5.2, a fatal PHP error no longer produces a blank white screen. WordPress catches the fatal, swaps in the "There has been a critical error" page, and tries to email the site admin a recovery-mode link. The usual causes, roughly in order of how often I see them on client sites:

  • A plugin or theme update that conflicts with your PHP version or another plugin
  • A PHP version that is too old for code you just updated
  • Memory exhaustion or a corrupted core file
  • A half-finished update that left files in a mixed state

The screen tells you none of this. It is deliberately vague so your visitors do not see a stack trace. That is good for security and useless for you.

Why you should not wait for the recovery email

Every tutorial says "check your inbox for the recovery mode link." We checked. Nothing came, and nothing was ever going to come, for a reason worth understanding: the email goes to the admin address stored in Settings, which on older sites is frequently a defunct address nobody reads. And if the fatal error happens early enough in the request, or your server's mail function is part of what broke, WordPress cannot send anything at all.

Treat the recovery email as a bonus if it shows up. Your actual recovery path is server access: FTP, SFTP, or SSH. If you do not have those credentials on hand for your own site, getting them is the first fix to make after you are back online.

Step 1: Bisect the plugins over FTP

With the dashboard locked, we connected with FileZilla and went to /public_html/wp-content/plugins.

The blunt-force move is renaming the whole plugins folder, which deactivates everything. I avoid that on live sites because it takes down functionality you may need (caching, security, forms) while you debug. Instead, bisect: suspect the most recently updated plugin first. In our case a page builder had auto-updated the night before, so we renamed elementor to elementor-disabled.

The site partially loaded on the next refresh. Culprit confirmed.

Here is the detail that trips people up on the way back out: when WordPress notices a plugin folder is missing, it deactivates that plugin in the database. Renaming the folder back to elementor later does not reactivate it. You have to switch it on again from the Plugins screen. If you rename a folder back and the site "still seems fine," check whether the plugin is actually running before you declare victory.

Step 2: Read the real error in debug.log

A partially loaded site told us which plugin, not why. For that we enabled debug logging in wp-config.php:

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

WP_DEBUG_DISPLAY stays false on a live site so errors go to the log, not the browser. We re-enabled the plugin briefly, refreshed once, and read /wp-content/debug.log:

Fatal error: Uncaught Error: Call to undefined function ...

An undefined-function fatal right after a plugin update almost always means one thing: the new plugin code calls a PHP function that your server's PHP version does not have. The plugin moved forward. The server did not.

Step 3: Check the PHP version and fix the mismatch

Over SSH:

php -v

The server was still on PHP 7.2, which reached end of life back in 2019. The plugin's current release had long since dropped support for it. That is the root cause, and it is why "restore a backup" alone would not have fixed anything. A backup restores the old plugin code, the site comes back, and the same crash returns on the next auto-update.

We upgraded PHP to 8.1 through the hosting control panel, restarted the web server, cleared the server-side cache, and reactivated the plugin. The critical error was gone on the next load.

One caution from doing this more than once: jumping several PHP major versions can break other old plugins even while it fixes the one that crashed. Skim debug.log again after the upgrade and click through your key pages before you close the ticket.

Step 4: Clean up what the crash left behind

The site rendered, but a few widgets and global settings had reset during the failed update cycle. We reconfigured the affected pages manually and pulled two sections from a recent UpdraftPlus backup, then flushed every cache layer: the caching plugin, the CDN, and browsers.

Partial restores like this are the argument for backups you can open surgically, not just full-site snapshots you restore all or nothing.

What we changed so it does not happen again

The error was a symptom. The process was the disease. Afterward we put four things in place on that site, and they are now standard on everything we manage:

  1. A staging copy. Plugin and core updates run on staging. first, production second. Auto-updates for major plugins are off in production.
  2. Daily automated backups with 30 days of retention, stored off-server.
  3. A PHP version policy. The server tracks a supported PHP version, checked whenever a major plugin update lands. Old PHP is the quiet cause behind a huge share of these crashes.
  4. Basic hardening, since a crash is a good excuse to audit: correct file permissions (644 files, 755 folders), PHP execution disabled in /uploads/, and login attempt limiting. I covered the deeper server-side version of this in my WordPress EC2 hardening guide.

File permissions in particular cause their own family of update failures. If your updates die with "could not create directory" instead of a critical error, that is a different root cause with its own fix. And if your site goes down repeatedly rather than once, check disk usage before anything else. A full disk produces some of the strangest WordPress failures I have seen, which is its own story.

The 10-minute recovery checklist

When the critical error screen appears, run this order:

  1. Do not wait for the recovery email. Get FTP/SFTP or SSH access.
  2. Rename the most recently updated plugin's folder. Refresh.
  3. If the site returns, you have the culprit. If not, work through the other recently changed plugins, then the theme.
  4. Enable WP_DEBUG_LOG, reproduce once, read /wp-content/debug.log.
  5. Match the fatal error to a cause: undefined function usually means a PHP version mismatch; memory exhausted means raising WP_MEMORY_LIMIT or finding the hog; a missing file means a corrupted update worth re-uploading.
  6. Fix the root cause, not just the trigger. Reactivate the plugin deliberately from the Plugins screen.
  7. Clear every cache layer before judging whether the fix worked.

If you write custom plugins yourself, defensive version checks prevent your own code from ever being the plugin in step 2. My custom WordPress plugin walkthrough covers the structure that makes that easy.

When the site is down and you are not comfortable in FTP

Everything above assumes you can calmly rename folders on a production server while the site is dark. If that is not you, or the debug log is pointing somewhere you do not recognize, this is exactly the kind of rescue work I take on. WordPress recovery, PHP upgrades, and the staging-and-backup setup that prevents round two are all part of the services I offer. Faster than learning FileZilla during an outage.

Advertisement
Coffee cup

Enjoyed this article?

Your support helps me create more in-depth technical content, open-source tools, and free resources for the developer community.

Related Topics

Engr Mejba Ahmed

Engr Mejba Ahmed

Engr. Mejba Ahmed builds AI-powered applications and secure cloud systems for businesses worldwide. With 8+ years shipping production software in Laravel, Python, and AWS, he's helped companies automate workflows, reduce infrastructure costs, and scale without security headaches. He writes about practical AI integration, cloud architecture, and developer productivity.

Related Articles

Browse All

Comments

Leave a Comment

Comments are moderated before appearing.

Learning Resources

Expand Your Knowledge

Accelerate your growth with structured courses, verified certificates, interactive flashcards, and production-ready AI agent skills.

Sample Certificate of Completion

Sample certificate — complete any course to earn yours

Engr Mejba Ahmed

Engr Mejba Ahmed

AI assistant · trained on my work

👋

Hey there!

Quick Actions

WhatsApp Direct line to me

Chat on WhatsApp

+880 1723 741224 · Replies within the hour on working days

Popular Questions

Engr Mejba Ahmed is connected
Engr Mejba Ahmed is typing...
Engr Mejba Ahmed avatar

✉ Want me to follow up? Drop your email

Engr Mejba Ahmed avatar

📞 Connect Directly

Choose how you'd like to reach me

WhatsApp

+880 1723 741224

Email

mejba.13@gmail.com

✓ Details sent! I'll get back to you shortly.

Powered by OpenAI

335+

Blog Posts

25

AI Courses

63

Projects

Services & Expertise

Pricing & Process

Learning & Resources

Connect & Support