--- a/wp/wp-includes/load.php Thu Sep 29 08:06:27 2022 +0200
+++ b/wp/wp-includes/load.php Fri Sep 05 18:40:08 2025 +0200
@@ -6,7 +6,7 @@
*/
/**
- * Return the HTTP protocol sent by the server.
+ * Returns the HTTP protocol sent by the server.
*
* @since 4.4.0
*
@@ -14,14 +14,16 @@
*/
function wp_get_server_protocol() {
$protocol = isset( $_SERVER['SERVER_PROTOCOL'] ) ? $_SERVER['SERVER_PROTOCOL'] : '';
+
if ( ! in_array( $protocol, array( 'HTTP/1.1', 'HTTP/2', 'HTTP/2.0', 'HTTP/3' ), true ) ) {
$protocol = 'HTTP/1.0';
}
+
return $protocol;
}
/**
- * Fix `$_SERVER` variables for various setups.
+ * Fixes `$_SERVER` variables for various setups.
*
* @since 3.0.0
* @access private
@@ -40,7 +42,9 @@
$_SERVER = array_merge( $default_server_values, $_SERVER );
// Fix for IIS when running with PHP ISAPI.
- if ( empty( $_SERVER['REQUEST_URI'] ) || ( 'cgi-fcgi' !== PHP_SAPI && preg_match( '/^Microsoft-IIS\//', $_SERVER['SERVER_SOFTWARE'] ) ) ) {
+ if ( empty( $_SERVER['REQUEST_URI'] )
+ || ( 'cgi-fcgi' !== PHP_SAPI && preg_match( '/^Microsoft-IIS\//', $_SERVER['SERVER_SOFTWARE'] ) )
+ ) {
if ( isset( $_SERVER['HTTP_X_ORIGINAL_URL'] ) ) {
// IIS Mod-Rewrite.
@@ -56,7 +60,7 @@
// Some IIS + PHP configurations put the script-name in the path-info (no need to append it twice).
if ( isset( $_SERVER['PATH_INFO'] ) ) {
- if ( $_SERVER['PATH_INFO'] == $_SERVER['SCRIPT_NAME'] ) {
+ if ( $_SERVER['PATH_INFO'] === $_SERVER['SCRIPT_NAME'] ) {
$_SERVER['REQUEST_URI'] = $_SERVER['PATH_INFO'];
} else {
$_SERVER['REQUEST_URI'] = $_SERVER['SCRIPT_NAME'] . $_SERVER['PATH_INFO'];
@@ -71,12 +75,12 @@
}
// Fix for PHP as CGI hosts that set SCRIPT_FILENAME to something ending in php.cgi for all requests.
- if ( isset( $_SERVER['SCRIPT_FILENAME'] ) && ( strpos( $_SERVER['SCRIPT_FILENAME'], 'php.cgi' ) == strlen( $_SERVER['SCRIPT_FILENAME'] ) - 7 ) ) {
+ if ( isset( $_SERVER['SCRIPT_FILENAME'] ) && str_ends_with( $_SERVER['SCRIPT_FILENAME'], 'php.cgi' ) ) {
$_SERVER['SCRIPT_FILENAME'] = $_SERVER['PATH_TRANSLATED'];
}
// Fix for Dreamhost and other PHP as CGI hosts.
- if ( isset( $_SERVER['SCRIPT_NAME'] ) && ( strpos( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) !== false ) ) {
+ if ( isset( $_SERVER['SCRIPT_NAME'] ) && str_contains( $_SERVER['SCRIPT_NAME'], 'php.cgi' ) ) {
unset( $_SERVER['PATH_INFO'] );
}
@@ -122,7 +126,12 @@
$token = substr( $header, 6 );
$userpass = base64_decode( $token );
- list( $user, $pass ) = explode( ':', $userpass );
+ // There must be at least one colon in the string.
+ if ( ! str_contains( $userpass, ':' ) ) {
+ return;
+ }
+
+ list( $user, $pass ) = explode( ':', $userpass, 2 );
// Now shove them in the proper keys where we're expecting later on.
$_SERVER['PHP_AUTH_USER'] = $user;
@@ -130,7 +139,7 @@
}
/**
- * Check for the required PHP version, and the MySQL extension or
+ * Checks for the required PHP version, and the mysqli extension or
* a database drop-in.
*
* Dies if requirements are not met.
@@ -143,29 +152,51 @@
*/
function wp_check_php_mysql_versions() {
global $required_php_version, $wp_version;
- $php_version = phpversion();
+
+ $php_version = PHP_VERSION;
if ( version_compare( $required_php_version, $php_version, '>' ) ) {
$protocol = wp_get_server_protocol();
header( sprintf( '%s 500 Internal Server Error', $protocol ), true, 500 );
header( 'Content-Type: text/html; charset=utf-8' );
- printf( 'Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s.', $php_version, $wp_version, $required_php_version );
+ printf(
+ 'Your server is running PHP version %1$s but WordPress %2$s requires at least %3$s.',
+ $php_version,
+ $wp_version,
+ $required_php_version
+ );
exit( 1 );
}
- if ( ! extension_loaded( 'mysql' ) && ! extension_loaded( 'mysqli' ) && ! extension_loaded( 'mysqlnd' )
- // This runs before default constants are defined, so we can't assume WP_CONTENT_DIR is set yet.
- && ( defined( 'WP_CONTENT_DIR' ) && ! file_exists( WP_CONTENT_DIR . '/db.php' )
- || ! file_exists( ABSPATH . 'wp-content/db.php' ) )
+ // This runs before default constants are defined, so we can't assume WP_CONTENT_DIR is set yet.
+ $wp_content_dir = defined( 'WP_CONTENT_DIR' ) ? WP_CONTENT_DIR : ABSPATH . 'wp-content';
+
+ if ( ! function_exists( 'mysqli_connect' )
+ && ! file_exists( $wp_content_dir . '/db.php' )
) {
require_once ABSPATH . WPINC . '/functions.php';
wp_load_translations_early();
+
+ $message = '<p>' . __( 'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.' ) . "</p>\n";
+
+ $message .= '<p>' . sprintf(
+ /* translators: %s: mysqli. */
+ __( 'Please check that the %s PHP extension is installed and enabled.' ),
+ '<code>mysqli</code>'
+ ) . "</p>\n";
+
+ $message .= '<p>' . sprintf(
+ /* translators: %s: Support forums URL. */
+ __( 'If you are unsure what these terms mean you should probably contact your host. If you still need help you can always visit the <a href="%s">WordPress support forums</a>.' ),
+ __( 'https://wordpress.org/support/forums/' )
+ ) . "</p>\n";
+
$args = array(
'exit' => false,
'code' => 'mysql_not_found',
);
wp_die(
- __( 'Your PHP installation appears to be missing the MySQL extension which is required by WordPress.' ),
+ $message,
__( 'Requirements Not Met' ),
$args
);
@@ -227,7 +258,7 @@
}
// Fetch the environment from a constant, this overrides the global system variable.
- if ( defined( 'WP_ENVIRONMENT_TYPE' ) ) {
+ if ( defined( 'WP_ENVIRONMENT_TYPE' ) && WP_ENVIRONMENT_TYPE ) {
$current_env = WP_ENVIRONMENT_TYPE;
}
@@ -240,7 +271,82 @@
}
/**
- * Don't load all of WordPress when handling a favicon.ico request.
+ * Retrieves the current development mode.
+ *
+ * The development mode affects how certain parts of the WordPress application behave,
+ * which is relevant when developing for WordPress.
+ *
+ * Development mode can be set via the `WP_DEVELOPMENT_MODE` constant in `wp-config.php`.
+ * Possible values are 'core', 'plugin', 'theme', 'all', or an empty string to disable
+ * development mode. 'all' is a special value to signify that all three development modes
+ * ('core', 'plugin', and 'theme') are enabled.
+ *
+ * Development mode is considered separately from `WP_DEBUG` and wp_get_environment_type().
+ * It does not affect debugging output, but rather functional nuances in WordPress.
+ *
+ * This function retrieves the currently set development mode value. To check whether
+ * a specific development mode is enabled, use wp_is_development_mode().
+ *
+ * @since 6.3.0
+ *
+ * @return string The current development mode.
+ */
+function wp_get_development_mode() {
+ static $current_mode = null;
+
+ if ( ! defined( 'WP_RUN_CORE_TESTS' ) && null !== $current_mode ) {
+ return $current_mode;
+ }
+
+ $development_mode = WP_DEVELOPMENT_MODE;
+
+ // Exclusively for core tests, rely on the `$_wp_tests_development_mode` global.
+ if ( defined( 'WP_RUN_CORE_TESTS' ) && isset( $GLOBALS['_wp_tests_development_mode'] ) ) {
+ $development_mode = $GLOBALS['_wp_tests_development_mode'];
+ }
+
+ $valid_modes = array(
+ 'core',
+ 'plugin',
+ 'theme',
+ 'all',
+ '',
+ );
+
+ if ( ! in_array( $development_mode, $valid_modes, true ) ) {
+ $development_mode = '';
+ }
+
+ $current_mode = $development_mode;
+
+ return $current_mode;
+}
+
+/**
+ * Checks whether the site is in the given development mode.
+ *
+ * @since 6.3.0
+ *
+ * @param string $mode Development mode to check for. Either 'core', 'plugin', 'theme', or 'all'.
+ * @return bool True if the given mode is covered by the current development mode, false otherwise.
+ */
+function wp_is_development_mode( $mode ) {
+ $current_mode = wp_get_development_mode();
+ if ( empty( $current_mode ) ) {
+ return false;
+ }
+
+ // Return true if the current mode encompasses all modes.
+ if ( 'all' === $current_mode ) {
+ return true;
+ }
+
+ // Return true if the current mode is the given mode.
+ return $mode === $current_mode;
+}
+
+/**
+ * Ensures all of WordPress is not loaded when handling a favicon.ico request.
*
* Instead, send the headers for a zero-length favicon and bail.
*
@@ -255,7 +361,7 @@
}
/**
- * Die with a maintenance message when conditions are met.
+ * Dies with a maintenance message when conditions are met.
*
* The default message can be replaced by using a drop-in (maintenance.php in
* the wp-content directory).
@@ -287,7 +393,7 @@
}
/**
- * Check if maintenance mode is enabled.
+ * Checks if maintenance mode is enabled.
*
* Checks for a file in the WordPress root directory named ".maintenance".
* This file will contain the variable $upgrading, set to the time the file
@@ -308,11 +414,22 @@
}
require ABSPATH . '.maintenance';
+
// If the $upgrading timestamp is older than 10 minutes, consider maintenance over.
if ( ( time() - $upgrading ) >= 10 * MINUTE_IN_SECONDS ) {
return false;
}
+ // Don't enable maintenance mode while scraping for fatal errors.
+ if ( is_int( $upgrading ) && isset( $_REQUEST['wp_scrape_key'], $_REQUEST['wp_scrape_nonce'] ) ) {
+ $key = stripslashes( $_REQUEST['wp_scrape_key'] );
+ $nonce = stripslashes( $_REQUEST['wp_scrape_nonce'] );
+
+ if ( md5( $upgrading ) === $key && (int) $nonce === $upgrading ) {
+ return false;
+ }
+ }
+
/**
* Filters whether to enable maintenance mode.
*
@@ -334,7 +451,7 @@
}
/**
- * Get the time elapsed so far during this PHP script.
+ * Gets the time elapsed so far during this PHP script.
*
* Uses REQUEST_TIME_FLOAT that appeared in PHP 5.4.0.
*
@@ -347,7 +464,7 @@
}
/**
- * Start the WordPress micro-timer.
+ * Starts the WordPress micro-timer.
*
* @since 0.71
* @access private
@@ -359,12 +476,14 @@
*/
function timer_start() {
global $timestart;
+
$timestart = microtime( true );
+
return true;
}
/**
- * Retrieve or display the time from the page start to when function is called.
+ * Retrieves or displays the time from the page start to when function is called.
*
* @since 0.71
*
@@ -380,17 +499,25 @@
*/
function timer_stop( $display = 0, $precision = 3 ) {
global $timestart, $timeend;
+
$timeend = microtime( true );
$timetotal = $timeend - $timestart;
- $r = ( function_exists( 'number_format_i18n' ) ) ? number_format_i18n( $timetotal, $precision ) : number_format( $timetotal, $precision );
+
+ if ( function_exists( 'number_format_i18n' ) ) {
+ $r = number_format_i18n( $timetotal, $precision );
+ } else {
+ $r = number_format( $timetotal, $precision );
+ }
+
if ( $display ) {
echo $r;
}
+
return $r;
}
/**
- * Set PHP error reporting based on WordPress debug settings.
+ * Sets PHP error reporting based on WordPress debug settings.
*
* Uses three constants: `WP_DEBUG`, `WP_DEBUG_DISPLAY`, and `WP_DEBUG_LOG`.
* All three can be defined in wp-config.php. By default, `WP_DEBUG` and
@@ -481,16 +608,20 @@
error_reporting( E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_ERROR | E_WARNING | E_PARSE | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR );
}
- if (
- defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || defined( 'MS_FILES_REQUEST' ) ||
- ( defined( 'WP_INSTALLING' ) && WP_INSTALLING ) ||
- wp_doing_ajax() || wp_is_json_request() ) {
+ /*
+ * The 'REST_REQUEST' check here is optimistic as the constant is most
+ * likely not set at this point even if it is in fact a REST request.
+ */
+ if ( defined( 'XMLRPC_REQUEST' ) || defined( 'REST_REQUEST' ) || defined( 'MS_FILES_REQUEST' )
+ || ( defined( 'WP_INSTALLING' ) && WP_INSTALLING )
+ || wp_doing_ajax() || wp_is_json_request()
+ ) {
ini_set( 'display_errors', 0 );
}
}
/**
- * Set the location of the language directory.
+ * Sets the location of the language directory.
*
* To set directory manually, define the `WP_LANG_DIR` constant
* in wp-config.php.
@@ -504,7 +635,9 @@
*/
function wp_set_lang_dir() {
if ( ! defined( 'WP_LANG_DIR' ) ) {
- if ( file_exists( WP_CONTENT_DIR . '/languages' ) && @is_dir( WP_CONTENT_DIR . '/languages' ) || ! @is_dir( ABSPATH . WPINC . '/languages' ) ) {
+ if ( file_exists( WP_CONTENT_DIR . '/languages' ) && @is_dir( WP_CONTENT_DIR . '/languages' )
+ || ! @is_dir( ABSPATH . WPINC . '/languages' )
+ ) {
/**
* Server path of the language directory.
*
@@ -513,6 +646,7 @@
* @since 2.1.0
*/
define( 'WP_LANG_DIR', WP_CONTENT_DIR . '/languages' );
+
if ( ! defined( 'LANGDIR' ) ) {
// Old static relative path maintained for limited backward compatibility - won't work in some cases.
define( 'LANGDIR', 'wp-content/languages' );
@@ -526,6 +660,7 @@
* @since 2.1.0
*/
define( 'WP_LANG_DIR', ABSPATH . WPINC . '/languages' );
+
if ( ! defined( 'LANGDIR' ) ) {
// Old relative path maintained for backward compatibility.
define( 'LANGDIR', WPINC . '/languages' );
@@ -535,7 +670,7 @@
}
/**
- * Load the database class file and instantiate the `$wpdb` global.
+ * Loads the database class file and instantiates the `$wpdb` global.
*
* @since 2.5.0
*
@@ -544,7 +679,8 @@
function require_wp_db() {
global $wpdb;
- require_once ABSPATH . WPINC . '/wp-db.php';
+ require_once ABSPATH . WPINC . '/class-wpdb.php';
+
if ( file_exists( WP_CONTENT_DIR . '/db.php' ) ) {
require_once WP_CONTENT_DIR . '/db.php';
}
@@ -562,7 +698,7 @@
}
/**
- * Set the database table prefix and the format specifiers for database
+ * Sets the database table prefix and the format specifiers for database
* table columns.
*
* Columns not listed here default to `%s`.
@@ -575,6 +711,7 @@
*/
function wp_set_wpdb_vars() {
global $wpdb, $table_prefix;
+
if ( ! empty( $wpdb->error ) ) {
dead_db();
}
@@ -624,7 +761,7 @@
wp_die(
sprintf(
/* translators: 1: $table_prefix, 2: wp-config.php */
- __( '<strong>Error</strong>: %1$s in %2$s can only contain numbers, letters, and underscores.' ),
+ __( '<strong>Error:</strong> %1$s in %2$s can only contain numbers, letters, and underscores.' ),
'<code>$table_prefix</code>',
'<code>wp-config.php</code>'
)
@@ -633,7 +770,7 @@
}
/**
- * Toggle `$_wp_using_ext_object_cache` on and off without directly
+ * Toggles `$_wp_using_ext_object_cache` on and off without directly
* touching global.
*
* @since 3.7.0
@@ -645,15 +782,18 @@
*/
function wp_using_ext_object_cache( $using = null ) {
global $_wp_using_ext_object_cache;
+
$current_using = $_wp_using_ext_object_cache;
+
if ( null !== $using ) {
$_wp_using_ext_object_cache = $using;
}
+
return $current_using;
}
/**
- * Start the WordPress object cache.
+ * Starts the WordPress object cache.
*
* If an object-cache.php file exists in the wp-content directory,
* it uses that drop-in as an external object cache.
@@ -692,6 +832,7 @@
*/
if ( file_exists( WP_CONTENT_DIR . '/object-cache.php' ) ) {
require_once WP_CONTENT_DIR . '/object-cache.php';
+
if ( function_exists( 'wp_cache_init' ) ) {
wp_using_ext_object_cache( true );
}
@@ -730,15 +871,40 @@
}
if ( function_exists( 'wp_cache_add_global_groups' ) ) {
- wp_cache_add_global_groups( array( 'users', 'userlogins', 'usermeta', 'user_meta', 'useremail', 'userslugs', 'site-transient', 'site-options', 'blog-lookup', 'blog-details', 'site-details', 'rss', 'global-posts', 'blog-id-cache', 'networks', 'sites', 'blog_meta' ) );
- wp_cache_add_non_persistent_groups( array( 'counts', 'plugins' ) );
+ wp_cache_add_global_groups(
+ array(
+ 'blog-details',
+ 'blog-id-cache',
+ 'blog-lookup',
+ 'blog_meta',
+ 'global-posts',
+ 'networks',
+ 'network-queries',
+ 'sites',
+ 'site-details',
+ 'site-options',
+ 'site-queries',
+ 'site-transient',
+ 'theme_files',
+ 'translation_files',
+ 'rss',
+ 'users',
+ 'user-queries',
+ 'user_meta',
+ 'useremail',
+ 'userlogins',
+ 'userslugs',
+ )
+ );
+
+ wp_cache_add_non_persistent_groups( array( 'counts', 'plugins', 'theme_json' ) );
}
$first_init = false;
}
/**
- * Redirect to the installer if WordPress is not installed.
+ * Redirects to the installer if WordPress is not installed.
*
* Dies with an error message when Multisite is enabled.
*
@@ -746,27 +912,27 @@
* @access private
*/
function wp_not_installed() {
- if ( is_multisite() ) {
- if ( ! is_blog_installed() && ! wp_installing() ) {
- nocache_headers();
+ if ( is_blog_installed() || wp_installing() ) {
+ return;
+ }
- wp_die( __( 'The site you have requested is not installed properly. Please contact the system administrator.' ) );
- }
- } elseif ( ! is_blog_installed() && ! wp_installing() ) {
- nocache_headers();
+ nocache_headers();
- require ABSPATH . WPINC . '/kses.php';
- require ABSPATH . WPINC . '/pluggable.php';
+ if ( is_multisite() ) {
+ wp_die( __( 'The site you have requested is not installed properly. Please contact the system administrator.' ) );
+ }
- $link = wp_guess_url() . '/wp-admin/install.php';
+ require ABSPATH . WPINC . '/kses.php';
+ require ABSPATH . WPINC . '/pluggable.php';
- wp_redirect( $link );
- die();
- }
+ $link = wp_guess_url() . '/wp-admin/install.php';
+
+ wp_redirect( $link );
+ die();
}
/**
- * Retrieve an array of must-use plugin files.
+ * Retrieves an array of must-use plugin files.
*
* The default directory is wp-content/mu-plugins. To change the default
* directory manually, define `WPMU_PLUGIN_DIR` and `WPMU_PLUGIN_URL`
@@ -779,26 +945,31 @@
*/
function wp_get_mu_plugins() {
$mu_plugins = array();
+
if ( ! is_dir( WPMU_PLUGIN_DIR ) ) {
return $mu_plugins;
}
+
$dh = opendir( WPMU_PLUGIN_DIR );
if ( ! $dh ) {
return $mu_plugins;
}
+
while ( ( $plugin = readdir( $dh ) ) !== false ) {
- if ( '.php' === substr( $plugin, -4 ) ) {
+ if ( str_ends_with( $plugin, '.php' ) ) {
$mu_plugins[] = WPMU_PLUGIN_DIR . '/' . $plugin;
}
}
+
closedir( $dh );
+
sort( $mu_plugins );
return $mu_plugins;
}
/**
- * Retrieve an array of active and valid plugin files.
+ * Retrieves an array of active and valid plugin files.
*
* While upgrading or installing WordPress, no plugins are returned.
*
@@ -829,11 +1000,11 @@
foreach ( $active_plugins as $plugin ) {
if ( ! validate_file( $plugin ) // $plugin must validate as file.
- && '.php' === substr( $plugin, -4 ) // $plugin must end with '.php'.
+ && str_ends_with( $plugin, '.php' ) // $plugin must end with '.php'.
&& file_exists( WP_PLUGIN_DIR . '/' . $plugin ) // $plugin must exist.
// Not already included as a network plugin.
&& ( ! $network_plugins || ! in_array( WP_PLUGIN_DIR . '/' . $plugin, $network_plugins, true ) )
- ) {
+ ) {
$plugins[] = WP_PLUGIN_DIR . '/' . $plugin;
}
}
@@ -854,6 +1025,8 @@
*
* @since 5.2.0
*
+ * @global WP_Paused_Extensions_Storage $_paused_plugins
+ *
* @param string[] $plugins Array of absolute plugin main file paths.
* @return string[] Filtered array of plugins, without any paused plugins.
*/
@@ -886,12 +1059,14 @@
* @since 5.1.0
* @access private
*
- * @global string $pagenow The filename of the current screen.
+ * @global string $pagenow The filename of the current screen.
+ * @global string $wp_stylesheet_path Path to current theme's stylesheet directory.
+ * @global string $wp_template_path Path to current theme's template directory.
*
* @return string[] Array of absolute paths to theme directories.
*/
function wp_get_active_and_valid_themes() {
- global $pagenow;
+ global $pagenow, $wp_stylesheet_path, $wp_template_path;
$themes = array();
@@ -899,11 +1074,11 @@
return $themes;
}
- if ( TEMPLATEPATH !== STYLESHEETPATH ) {
- $themes[] = STYLESHEETPATH;
+ if ( is_child_theme() ) {
+ $themes[] = $wp_stylesheet_path;
}
- $themes[] = TEMPLATEPATH;
+ $themes[] = $wp_template_path;
/*
* Remove themes from the list of active themes when we're on an endpoint
@@ -926,6 +1101,8 @@
*
* @since 5.2.0
*
+ * @global WP_Paused_Extensions_Storage $_paused_themes
+ *
* @param string[] $themes Array of absolute theme directory paths.
* @return string[] Filtered array of absolute paths to themes, without any paused themes.
*/
@@ -951,7 +1128,7 @@
}
/**
- * Is WordPress in Recovery Mode.
+ * Determines whether WordPress is in Recovery Mode.
*
* In this mode, plugins or themes that cause WSODs will be paused.
*
@@ -1028,6 +1205,7 @@
'search-install-plugins', // Searching for a plugin in the plugin install screen.
'update-plugin', // Update an existing plugin.
'update-theme', // Update an existing theme.
+ 'activate-plugin', // Activating an existing plugin.
);
/**
@@ -1049,7 +1227,7 @@
}
/**
- * Set internal encoding.
+ * Sets internal encoding.
*
* In most cases the default internal encoding is latin1, which is
* of no use, since we want to use the `mb_` functions for `utf-8` strings.
@@ -1068,7 +1246,7 @@
}
/**
- * Add magic quotes to `$_GET`, `$_POST`, `$_COOKIE`, and `$_SERVER`.
+ * Adds magic quotes to `$_GET`, `$_POST`, `$_COOKIE`, and `$_SERVER`.
*
* Also forces `$_REQUEST` to be `$_GET + $_POST`. If `$_SERVER`,
* `$_COOKIE`, or `$_ENV` are needed, use those superglobals directly.
@@ -1105,17 +1283,30 @@
}
/**
- * Copy an object.
+ * Clones an object.
*
* @since 2.7.0
* @deprecated 3.2.0
*
- * @param object $object The object to clone.
+ * @param object $input_object The object to clone.
* @return object The cloned object.
*/
-function wp_clone( $object ) {
+function wp_clone( $input_object ) {
// Use parens for clone to accommodate PHP 4. See #17880.
- return clone( $object );
+ return clone( $input_object );
+}
+
+/**
+ * Determines whether the current request is for the login screen.
+ *
+ * @since 6.1.0
+ *
+ * @see wp_login_url()
+ *
+ * @return bool True if inside WordPress login screen, false otherwise.
+ */
+function is_login() {
+ return false !== stripos( wp_login_url(), $_SERVER['SCRIPT_NAME'] );
}
/**
@@ -1145,7 +1336,7 @@
}
/**
- * Whether the current request is for a site's administrative interface.
+ * Determines whether the current request is for a site's administrative interface.
*
* e.g. `/wp-admin/`
*
@@ -1156,7 +1347,7 @@
*
* @global WP_Screen $current_screen WordPress current screen object.
*
- * @return bool True if inside WordPress blog administration pages.
+ * @return bool True if inside WordPress site administration pages.
*/
function is_blog_admin() {
if ( isset( $GLOBALS['current_screen'] ) ) {
@@ -1169,7 +1360,7 @@
}
/**
- * Whether the current request is for the network administrative interface.
+ * Determines whether the current request is for the network administrative interface.
*
* e.g. `/wp-admin/network/`
*
@@ -1196,7 +1387,7 @@
}
/**
- * Whether the current request is for a user admin screen.
+ * Determines whether the current request is for a user admin screen.
*
* e.g. `/wp-admin/user/`
*
@@ -1220,7 +1411,7 @@
}
/**
- * If Multisite is enabled.
+ * Determines whether Multisite is enabled.
*
* @since 3.0.0
*
@@ -1239,7 +1430,7 @@
}
/**
- * Retrieve the current site ID.
+ * Retrieves the current site ID.
*
* @since 3.1.0
*
@@ -1249,6 +1440,7 @@
*/
function get_current_blog_id() {
global $blog_id;
+
return absint( $blog_id );
}
@@ -1274,7 +1466,7 @@
}
/**
- * Attempt an early load of translations.
+ * Attempts an early load of translations.
*
* Used for errors encountered during the initial loading process, before
* the locale has been properly detected and loaded.
@@ -1286,15 +1478,17 @@
* @since 3.4.0
* @access private
*
- * @global WP_Locale $wp_locale WordPress date and time locale object.
+ * @global WP_Textdomain_Registry $wp_textdomain_registry WordPress Textdomain Registry.
+ * @global WP_Locale $wp_locale WordPress date and time locale object.
*/
function wp_load_translations_early() {
- global $wp_locale;
+ global $wp_textdomain_registry, $wp_locale;
+ static $loaded = false;
- static $loaded = false;
if ( $loaded ) {
return;
}
+
$loaded = true;
if ( function_exists( 'did_action' ) && did_action( 'init' ) ) {
@@ -1306,7 +1500,13 @@
// Translation and localization.
require_once ABSPATH . WPINC . '/pomo/mo.php';
+ require_once ABSPATH . WPINC . '/l10n/class-wp-translation-controller.php';
+ require_once ABSPATH . WPINC . '/l10n/class-wp-translations.php';
+ require_once ABSPATH . WPINC . '/l10n/class-wp-translation-file.php';
+ require_once ABSPATH . WPINC . '/l10n/class-wp-translation-file-mo.php';
+ require_once ABSPATH . WPINC . '/l10n/class-wp-translation-file-php.php';
require_once ABSPATH . WPINC . '/l10n.php';
+ require_once ABSPATH . WPINC . '/class-wp-textdomain-registry.php';
require_once ABSPATH . WPINC . '/class-wp-locale.php';
require_once ABSPATH . WPINC . '/class-wp-locale-switcher.php';
@@ -1316,6 +1516,10 @@
$locales = array();
$locations = array();
+ if ( ! $wp_textdomain_registry instanceof WP_Textdomain_Registry ) {
+ $wp_textdomain_registry = new WP_Textdomain_Registry();
+ }
+
while ( true ) {
if ( defined( 'WPLANG' ) ) {
if ( '' === WPLANG ) {
@@ -1357,10 +1561,12 @@
foreach ( $locales as $locale ) {
foreach ( $locations as $location ) {
if ( file_exists( $location . '/' . $locale . '.mo' ) ) {
- load_textdomain( 'default', $location . '/' . $locale . '.mo' );
+ load_textdomain( 'default', $location . '/' . $locale . '.mo', $locale );
+
if ( defined( 'WP_SETUP_CONFIG' ) && file_exists( $location . '/admin-' . $locale . '.mo' ) ) {
- load_textdomain( 'default', $location . '/admin-' . $locale . '.mo' );
+ load_textdomain( 'default', $location . '/admin-' . $locale . '.mo', $locale );
}
+
break 2;
}
}
@@ -1373,7 +1579,7 @@
}
/**
- * Check or set whether WordPress is in "installation" mode.
+ * Checks or sets whether WordPress is in "installation" mode.
*
* If the `WP_INSTALLING` constant is defined during the bootstrap, `wp_installing()` will default to `true`.
*
@@ -1395,6 +1601,7 @@
if ( ! is_null( $is_installing ) ) {
$old_installing = $installing;
$installing = $is_installing;
+
return (bool) $old_installing;
}
@@ -1415,12 +1622,13 @@
return true;
}
- if ( '1' == $_SERVER['HTTPS'] ) {
+ if ( '1' === (string) $_SERVER['HTTPS'] ) {
return true;
}
- } elseif ( isset( $_SERVER['SERVER_PORT'] ) && ( '443' == $_SERVER['SERVER_PORT'] ) ) {
+ } elseif ( isset( $_SERVER['SERVER_PORT'] ) && ( '443' === (string) $_SERVER['SERVER_PORT'] ) ) {
return true;
}
+
return false;
}
@@ -1440,11 +1648,11 @@
$value = strtolower( trim( $value ) );
$bytes = (int) $value;
- if ( false !== strpos( $value, 'g' ) ) {
+ if ( str_contains( $value, 'g' ) ) {
$bytes *= GB_IN_BYTES;
- } elseif ( false !== strpos( $value, 'm' ) ) {
+ } elseif ( str_contains( $value, 'm' ) ) {
$bytes *= MB_IN_BYTES;
- } elseif ( false !== strpos( $value, 'k' ) ) {
+ } elseif ( str_contains( $value, 'k' ) ) {
$bytes *= KB_IN_BYTES;
}
@@ -1474,7 +1682,9 @@
}
// Bit operator to workaround https://bugs.php.net/bug.php?id=44936 which changes access level to 63 in PHP 5.2.6 - 5.2.17.
- if ( isset( $ini_all[ $setting ]['access'] ) && ( INI_ALL === ( $ini_all[ $setting ]['access'] & 7 ) || INI_USER === ( $ini_all[ $setting ]['access'] & 7 ) ) ) {
+ if ( isset( $ini_all[ $setting ]['access'] )
+ && ( INI_ALL === ( $ini_all[ $setting ]['access'] & 7 ) || INI_USER === ( $ini_all[ $setting ]['access'] & 7 ) )
+ ) {
return true;
}
@@ -1588,7 +1798,7 @@
}
/**
- * Start scraping edited file errors.
+ * Starts scraping edited file errors.
*
* @since 4.9.0
*/
@@ -1596,6 +1806,7 @@
if ( ! isset( $_REQUEST['wp_scrape_key'] ) || ! isset( $_REQUEST['wp_scrape_nonce'] ) ) {
return;
}
+
$key = substr( sanitize_key( wp_unslash( $_REQUEST['wp_scrape_key'] ) ), 0, 32 );
$nonce = wp_unslash( $_REQUEST['wp_scrape_nonce'] );
@@ -1610,14 +1821,16 @@
echo "###### wp_scraping_result_end:$key ######";
die();
}
+
if ( ! defined( 'WP_SANDBOX_SCRAPING' ) ) {
define( 'WP_SANDBOX_SCRAPING', true );
}
+
register_shutdown_function( 'wp_finalize_scraping_edited_file_errors', $key );
}
/**
- * Finalize scraping for edited file errors.
+ * Finalizes scraping for edited file errors.
*
* @since 4.9.0
*
@@ -1625,13 +1838,18 @@
*/
function wp_finalize_scraping_edited_file_errors( $scrape_key ) {
$error = error_get_last();
+
echo "\n###### wp_scraping_result_start:$scrape_key ######\n";
- if ( ! empty( $error ) && in_array( $error['type'], array( E_CORE_ERROR, E_COMPILE_ERROR, E_ERROR, E_PARSE, E_USER_ERROR, E_RECOVERABLE_ERROR ), true ) ) {
+
+ if ( ! empty( $error )
+ && in_array( $error['type'], array( E_CORE_ERROR, E_COMPILE_ERROR, E_ERROR, E_PARSE, E_USER_ERROR, E_RECOVERABLE_ERROR ), true )
+ ) {
$error = str_replace( ABSPATH, '', $error );
echo wp_json_encode( $error );
} else {
echo wp_json_encode( true );
}
+
echo "\n###### wp_scraping_result_end:$scrape_key ######\n";
}
@@ -1644,7 +1862,6 @@
* False otherwise.
*/
function wp_is_json_request() {
-
if ( isset( $_SERVER['HTTP_ACCEPT'] ) && wp_is_json_media_type( $_SERVER['HTTP_ACCEPT'] ) ) {
return true;
}
@@ -1654,7 +1871,6 @@
}
return false;
-
}
/**
@@ -1682,7 +1898,6 @@
$jsonp_enabled = apply_filters( 'rest_jsonp_enabled', true );
return $jsonp_enabled;
-
}
/**
@@ -1723,7 +1938,7 @@
if ( isset( $_SERVER['HTTP_ACCEPT'] ) ) {
foreach ( $accepted as $type ) {
- if ( false !== strpos( $_SERVER['HTTP_ACCEPT'], $type ) ) {
+ if ( str_contains( $_SERVER['HTTP_ACCEPT'], $type ) ) {
return true;
}
}