Recovery Mode

Error protection system that detects fatal errors from plugins/themes and allows administrators to safely access the site.

Since: 5.2.0
Source: wp-includes/class-wp-recovery-mode.php, wp-includes/error-protection.php

Components

ComponentDescription
functions.mdCore helper functions for error protection
class-wp-recovery-mode.mdMain recovery mode orchestrator
class-wp-recovery-mode-cookie-service.mdCookie generation and validation
class-wp-recovery-mode-key-service.mdRecovery key generation and storage
class-wp-recovery-mode-link-service.mdRecovery URL generation and handling
class-wp-recovery-mode-email-service.mdRecovery mode email notifications
class-wp-paused-extensions-storage.mdStorage for paused plugins/themes
hooks.mdActions and filters

How It Works

When a fatal error occurs in a plugin or theme:

  1. Detection — WordPress shutdown handler catches the fatal error
  2. Email — Recovery mode email sent to admin with a secure link
  3. Entry — Admin clicks link, cookie is set, recovery mode activates
  4. Pausing — Faulty extension is paused for this session only
  5. Exit — Admin exits recovery mode or logs out, paused extensions cleared

Error Detection Flow

Fatal Error Occurs
    └── WP_Fatal_Error_Handler::handle()
            └── WP_Recovery_Mode::handle_error()
                    ├── get_extension_for_error()
                    ├── is_protected_endpoint()
                    └── WP_Recovery_Mode_Email_Service::maybe_send_recovery_mode_email()

Recovery Mode Entry Flow

Admin clicks recovery link
    └── WP_Recovery_Mode_Link_Service::handle_begin_link()
            ├── WP_Recovery_Mode_Key_Service::validate_recovery_mode_key()
            ├── WP_Recovery_Mode_Cookie_Service::set_cookie()
            └── Redirect to wp-login.php?action=entered_recovery_mode

Session Validation Flow

Subsequent requests with cookie
    └── WP_Recovery_Mode::initialize()
            └── WP_Recovery_Mode::handle_cookie()
                    ├── WP_Recovery_Mode_Cookie_Service::validate_cookie()
                    ├── WP_Recovery_Mode_Cookie_Service::get_session_id_from_cookie()
                    └── Set is_active = true

Extension Pausing Flow

php
Error occurs in active session
    └── WP_Recovery_Mode::store_error()
            ├── wp_paused_plugins()->set()
            └── wp_paused_themes()->set()
                    └── WP_Paused_Extensions_Storage::set()

Constants

ConstantDescription
WP_RECOVERY_MODE_SESSION_IDDefined during recovery mode, contains session ID
RECOVERY_MODE_COOKIECookie name for recovery mode session
WP_DISABLE_FATAL_ERROR_HANDLERSet to true in wp-config.php to disable recovery mode
RECOVERY_MODE_EMAILOverride email address for recovery notifications

Protected Endpoints

Recovery mode emails are only sent for errors on "protected endpoints":

  • Admin pages (/wp-admin/)
  • Login page (/wp-login.php)
  • AJAX requests
  • REST API requests
  • JSON API requests
  • XMLRPC requests

Frontend errors do not trigger recovery mode emails.