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
|
<?php
/**
* Error Protection API: Functions
*
* @package WordPress
* @since 5.2.0
*/
/**
* Get the instance for storing paused plugins.
*
* @return WP_Paused_Extensions_Storage
*/
function wp_paused_plugins() {
static $storage = null;
if ( null === $storage ) {
$storage = new WP_Paused_Extensions_Storage( 'plugin' );
}
return $storage;
}
/**
* Get the instance for storing paused extensions.
*
* @return WP_Paused_Extensions_Storage
*/
function wp_paused_themes() {
static $storage = null;
if ( null === $storage ) {
$storage = new WP_Paused_Extensions_Storage( 'theme' );
}
return $storage;
}
/**
* Get a human readable description of an extension's error.
*
* @since 5.2.0
*
* @param array $error Error details from `error_get_last()`.
* @return string Formatted error description.
*/
function wp_get_extension_error_description( $error ) {
$constants = get_defined_constants( true );
$constants = isset( $constants['Core'] ) ? $constants['Core'] : $constants['internal'];
$core_errors = array();
foreach ( $constants as $constant => $value ) {
if ( str_starts_with( $constant, 'E_' ) ) {
$core_errors[ $value ] = $constant;
}
}
if ( isset( $core_errors[ $error['type'] ] ) ) {
$error['type'] = $core_errors[ $error['type'] ];
}
/* translators: 1: Error type, 2: Error line number, 3: Error file name, 4: Error message. */
$error_message = __( 'An error of type %1$s was caused in line %2$s of the file %3$s. Error message: %4$s' );
return sprintf(
$error_message,
"<code>{$error['type']}</code>",
"<code>{$error['line']}</code>",
"<code>{$error['file']}</code>",
"<code>{$error['message']}</code>"
);
}
/**
* Registers the shutdown handler for fatal errors.
*
* The handler will only be registered if {@see wp_is_fatal_error_handler_enabled()} returns true.
*
* @since 5.2.0
*/
function wp_register_fatal_error_handler() {
if ( ! wp_is_fatal_error_handler_enabled() ) {
return;
}
$handler = null;
if ( defined( 'WP_CONTENT_DIR' ) && is_readable( WP_CONTENT_DIR . '/fatal-error-handler.php' ) ) {
$handler = include WP_CONTENT_DIR . '/fatal-error-handler.php';
}
if ( ! is_object( $handler ) || ! is_callable( array( $handler, 'handle' ) ) ) {
$handler = new WP_Fatal_Error_Handler();
}
register_shutdown_function( array( $handler, 'handle' ) );
}
/**
* Checks whether the fatal error handler is enabled.
*
* A constant `WP_DISABLE_FATAL_ERROR_HANDLER` can be set in `wp-config.php` to disable it, or alternatively the
* {@see 'wp_fatal_error_handler_enabled'} filter can be used to modify the return value.
*
* @since 5.2.0
*
* @return bool True if the fatal error handler is enabled, false otherwise.
*/
function wp_is_fatal_error_handler_enabled() {
$enabled = ! defined( 'WP_DISABLE_FATAL_ERROR_HANDLER' ) || ! WP_DISABLE_FATAL_ERROR_HANDLER;
/**
* Filters whether the fatal error handler is enabled.
*
* **Important:** This filter runs before it can be used by plugins. It cannot
* be used by plugins, mu-plugins, or themes. To use this filter you must define
* a `$wp_filter` global before WordPress loads, usually in `wp-config.php`.
*
* Example:
*
* $GLOBALS['wp_filter'] = array(
* 'wp_fatal_error_handler_enabled' => array(
* 10 => array(
* array(
* 'accepted_args' => 0,
* 'function' => function() {
* return false;
* },
* ),
* ),
* ),
* );
*
* Alternatively you can use the `WP_DISABLE_FATAL_ERROR_HANDLER` constant.
*
* @since 5.2.0
*
* @param bool $enabled True if the fatal error handler is enabled, false otherwise.
*/
return apply_filters( 'wp_fatal_error_handler_enabled', $enabled );
}
/**
* Access the WordPress Recovery Mode instance.
*
* @since 5.2.0
*
* @return WP_Recovery_Mode
*/
function wp_recovery_mode() {
static $wp_recovery_mode;
if ( ! $wp_recovery_mode ) {
$wp_recovery_mode = new WP_Recovery_Mode();
}
return $wp_recovery_mode;
}
|