C:\xampp\htdocs\landing\wp-includes\class-wp-fatal-error-handler.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
<?php
/**
 * Error Protection API: WP_Fatal_Error_Handler class
 *
 * @package WordPress
 * @since 5.2.0
 */

/**
 * Core class used as the default shutdown handler for fatal errors.
 *
 * A drop-in 'fatal-error-handler.php' can be used to override the instance of this class and use a custom
 * implementation for the fatal error handler that WordPress registers. The custom class should extend this class and
 * can override its methods individually as necessary. The file must return the instance of the class that should be
 * registered.
 *
 * @since 5.2.0
 */
class WP_Fatal_Error_Handler {

    
/**
     * Runs the shutdown handler.
     *
     * This method is registered via `register_shutdown_function()`.
     *
     * @since 5.2.0
     */
    
public function handle() {
        if ( 
defined'WP_SANDBOX_SCRAPING' ) && WP_SANDBOX_SCRAPING ) {
            return;
        }

        
// Do not trigger the fatal error handler while updates are being installed.
        
if ( wp_is_maintenance_mode() ) {
            return;
        }

        try {
            
// Bail if no error found.
            
$error $this->detect_error();
            if ( ! 
$error ) {
                return;
            }

            if ( ! isset( 
$GLOBALS['wp_locale'] ) && function_exists'load_default_textdomain' ) ) {
                
load_default_textdomain();
            }

            
$handled false;

            if ( ! 
is_multisite() && wp_recovery_mode()->is_initialized() ) {
                
$handled wp_recovery_mode()->handle_error$error );
            }

            
// Display the PHP error template if headers not sent.
            
if ( is_admin() || ! headers_sent() ) {
                
$this->display_error_template$error$handled );
            }
        } catch ( 
Exception $e ) {
            
// Catch exceptions and remain silent.
        
}
    }

    
/**
     * Detects the error causing the crash if it should be handled.
     *
     * @since 5.2.0
     *
     * @return array|null Error that was triggered, or null if no error received or if the error should not be handled.
     */
    
protected function detect_error() {
        
$error error_get_last();

        
// No error, just skip the error handling code.
        
if ( null === $error ) {
            return 
null;
        }

        
// Bail if this error should not be handled.
        
if ( ! $this->should_handle_error$error ) ) {
            return 
null;
        }

        return 
$error;
    }

    
/**
     * Determines whether we are dealing with an error that WordPress should handle
     * in order to protect the admin backend against WSODs.
     *
     * @since 5.2.0
     *
     * @param array $error Error information retrieved from error_get_last().
     * @return bool Whether WordPress should handle this error.
     */
    
protected function should_handle_error$error ) {
        
$error_types_to_handle = array(
            
E_ERROR,
            
E_PARSE,
            
E_USER_ERROR,
            
E_COMPILE_ERROR,
            
E_RECOVERABLE_ERROR,
        );

        if ( isset( 
$error['type'] ) && in_array$error['type'], $error_types_to_handletrue ) ) {
            return 
true;
        }

        
/**
         * Filters whether a given thrown error should be handled by the fatal error handler.
         *
         * This filter is only fired if the error is not already configured to be handled by WordPress core. As such,
         * it exclusively allows adding further rules for which errors should be handled, but not removing existing
         * ones.
         *
         * @since 5.2.0
         *
         * @param bool  $should_handle_error Whether the error should be handled by the fatal error handler.
         * @param array $error               Error information retrieved from error_get_last().
         */
        
return (bool) apply_filters'wp_should_handle_php_error'false$error );
    }

    
/**
     * Displays the PHP error template and sends the HTTP status code, typically 500.
     *
     * A drop-in 'php-error.php' can be used as a custom template. This drop-in should control the HTTP status code and
     * print the HTML markup indicating that a PHP error occurred. Note that this drop-in may potentially be executed
     * very early in the WordPress bootstrap process, so any core functions used that are not part of
     * `wp-includes/load.php` should be checked for before being called.
     *
     * If no such drop-in is available, this will call {@see WP_Fatal_Error_Handler::display_default_error_template()}.
     *
     * @since 5.2.0
     * @since 5.3.0 The `$handled` parameter was added.
     *
     * @param array         $error   Error information retrieved from `error_get_last()`.
     * @param true|WP_Error $handled Whether Recovery Mode handled the fatal error.
     */
    
protected function display_error_template$error$handled ) {
        if ( 
defined'WP_CONTENT_DIR' ) ) {
            
// Load custom PHP error template, if present.
            
$php_error_pluggable WP_CONTENT_DIR '/php-error.php';
            if ( 
is_readable$php_error_pluggable ) ) {
                require_once 
$php_error_pluggable;

                return;
            }
        }

        
// Otherwise, display the default error template.
        
$this->display_default_error_template$error$handled );
    }

    
/**
     * Displays the default PHP error template.
     *
     * This method is called conditionally if no 'php-error.php' drop-in is available.
     *
     * It calls {@see wp_die()} with a message indicating that the site is experiencing technical difficulties and a
     * login link to the admin backend. The {@see 'wp_php_error_message'} and {@see 'wp_php_error_args'} filters can
     * be used to modify these parameters.
     *
     * @since 5.2.0
     * @since 5.3.0 The `$handled` parameter was added.
     *
     * @param array         $error   Error information retrieved from `error_get_last()`.
     * @param true|WP_Error $handled Whether Recovery Mode handled the fatal error.
     */
    
protected function display_default_error_template$error$handled ) {
        if ( ! 
function_exists'__' ) ) {
            
wp_load_translations_early();
        }

        if ( ! 
function_exists'wp_die' ) ) {
            require_once 
ABSPATH WPINC '/functions.php';
        }

        if ( ! 
class_exists'WP_Error' ) ) {
            require_once 
ABSPATH WPINC '/class-wp-error.php';
        }

        if ( 
true === $handled && wp_is_recovery_mode() ) {
            
$message __'There has been a critical error on this website, putting it in recovery mode. Please check the Themes and Plugins screens for more details. If you just installed or updated a theme or plugin, check the relevant page for that first.' );
        } elseif ( 
is_protected_endpoint() ) {
            
$message __'There has been a critical error on this website. Please check your site admin email inbox for instructions.' );
        } else {
            
$message __'There has been a critical error on this website.' );
        }

        
$message sprintf(
            
'<p>%s</p><p><a href="%s">%s</a></p>',
            
$message,
            
/* translators: Documentation explaining debugging in WordPress. */
            
__'https://wordpress.org/support/article/debugging-in-wordpress/' ),
            
__'Learn more about debugging in WordPress.' )
        );

        
$args = array(
            
'response' => 500,
            
'exit'     => false,
        );

        
/**
         * Filters the message that the default PHP error template displays.
         *
         * @since 5.2.0
         *
         * @param string $message HTML error message to display.
         * @param array  $error   Error information retrieved from `error_get_last()`.
         */
        
$message apply_filters'wp_php_error_message'$message$error );

        
/**
         * Filters the arguments passed to {@see wp_die()} for the default PHP error template.
         *
         * @since 5.2.0
         *
         * @param array $args Associative array of arguments passed to `wp_die()`. By default these contain a
         *                    'response' key, and optionally 'link_url' and 'link_text' keys.
         * @param array $error Error information retrieved from `error_get_last()`.
         */
        
$args apply_filters'wp_php_error_args'$args$error );

        
$wp_error = new WP_Error(
            
'internal_server_error',
            
$message,
            array(
                
'error' => $error,
            )
        );

        
wp_die$wp_error''$args );
    }
}
x

Windows NT KPTV 6.2 build 9200 (Windows Server 2012 Datacenter Edition) i586