diff options
Diffstat (limited to 'srcs/wordpress/wp-admin/includes/class-wp-site-health.php')
| -rw-r--r-- | srcs/wordpress/wp-admin/includes/class-wp-site-health.php | 2170 |
1 files changed, 0 insertions, 2170 deletions
diff --git a/srcs/wordpress/wp-admin/includes/class-wp-site-health.php b/srcs/wordpress/wp-admin/includes/class-wp-site-health.php deleted file mode 100644 index 62f089b..0000000 --- a/srcs/wordpress/wp-admin/includes/class-wp-site-health.php +++ /dev/null @@ -1,2170 +0,0 @@ -<?php -/** - * Class for looking up a site's health based on a user's WordPress environment. - * - * @package WordPress - * @subpackage Site_Health - * @since 5.2.0 - */ - -class WP_Site_Health { - private $mysql_min_version_check; - private $mysql_rec_version_check; - - public $is_mariadb = false; - private $mysql_server_version = ''; - private $health_check_mysql_required_version = '5.5'; - private $health_check_mysql_rec_version = ''; - - public $schedules; - public $crons; - public $last_missed_cron = null; - public $last_late_cron = null; - private $timeout_missed_cron = null; - private $timeout_late_cron = null; - - /** - * WP_Site_Health constructor. - * - * @since 5.2.0 - */ - public function __construct() { - $this->prepare_sql_data(); - - $this->timeout_late_cron = 0; - $this->timeout_missed_cron = - 5 * MINUTE_IN_SECONDS; - - if ( defined( 'DISABLE_WP_CRON' ) && DISABLE_WP_CRON ) { - $this->timeout_late_cron = - 15 * MINUTE_IN_SECONDS; - $this->timeout_missed_cron = - 1 * HOUR_IN_SECONDS; - } - - add_filter( 'admin_body_class', array( $this, 'admin_body_class' ) ); - - add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) ); - } - - /** - * Enqueues the site health scripts. - * - * @since 5.2.0 - */ - public function enqueue_scripts() { - $screen = get_current_screen(); - if ( 'site-health' !== $screen->id ) { - return; - } - - $health_check_js_variables = array( - 'screen' => $screen->id, - 'nonce' => array( - 'site_status' => wp_create_nonce( 'health-check-site-status' ), - 'site_status_result' => wp_create_nonce( 'health-check-site-status-result' ), - ), - 'site_status' => array( - 'direct' => array(), - 'async' => array(), - 'issues' => array( - 'good' => 0, - 'recommended' => 0, - 'critical' => 0, - ), - ), - ); - - $issue_counts = get_transient( 'health-check-site-status-result' ); - - if ( false !== $issue_counts ) { - $issue_counts = json_decode( $issue_counts ); - - $health_check_js_variables['site_status']['issues'] = $issue_counts; - } - - if ( 'site-health' === $screen->id && ! isset( $_GET['tab'] ) ) { - $tests = WP_Site_Health::get_tests(); - - // Don't run https test on localhost - if ( 'localhost' === preg_replace( '|https?://|', '', get_site_url() ) ) { - unset( $tests['direct']['https_status'] ); - } - - foreach ( $tests['direct'] as $test ) { - if ( is_string( $test['test'] ) ) { - $test_function = sprintf( - 'get_test_%s', - $test['test'] - ); - - if ( method_exists( $this, $test_function ) && is_callable( array( $this, $test_function ) ) ) { - /** - * Filter the output of a finished Site Health test. - * - * @since 5.3.0 - * - * @param array $test_result { - * An associated array of test result data. - * - * @param string $label A label describing the test, and is used as a header in the output. - * @param string $status The status of the test, which can be a value of `good`, `recommended` or `critical`. - * @param array $badge { - * Tests are put into categories which have an associated badge shown, these can be modified and assigned here. - * - * @param string $label The test label, for example `Performance`. - * @param string $color Default `blue`. A string representing a color to use for the label. - * } - * @param string $description A more descriptive explanation of what the test looks for, and why it is important for the end user. - * @param string $actions An action to direct the user to where they can resolve the issue, if one exists. - * @param string $test The name of the test being ran, used as a reference point. - * } - */ - $health_check_js_variables['site_status']['direct'][] = apply_filters( 'site_status_test_result', call_user_func( array( $this, $test_function ) ) ); - continue; - } - } - - if ( is_callable( $test['test'] ) ) { - /** This filter is documented in wp-admin/includes/class-wp-site-health.php */ - $health_check_js_variables['site_status']['direct'][] = apply_filters( 'site_status_test_result', call_user_func( $test['test'] ) ); - } - } - - foreach ( $tests['async'] as $test ) { - if ( is_string( $test['test'] ) ) { - $health_check_js_variables['site_status']['async'][] = array( - 'test' => $test['test'], - 'completed' => false, - ); - } - } - } - - wp_localize_script( 'site-health', 'SiteHealth', $health_check_js_variables ); - } - - /** - * Run the SQL version checks. - * - * These values are used in later tests, but the part of preparing them is more easily managed early - * in the class for ease of access and discovery. - * - * @since 5.2.0 - * - * @global wpdb $wpdb WordPress database abstraction object. - */ - private function prepare_sql_data() { - global $wpdb; - - if ( $wpdb->use_mysqli ) { - // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysqli_get_server_info - $mysql_server_type = mysqli_get_server_info( $wpdb->dbh ); - } else { - // phpcs:ignore WordPress.DB.RestrictedFunctions.mysql_mysql_get_server_info,PHPCompatibility.Extensions.RemovedExtensions.mysql_DeprecatedRemoved - $mysql_server_type = mysql_get_server_info( $wpdb->dbh ); - } - - $this->mysql_server_version = $wpdb->get_var( 'SELECT VERSION()' ); - - $this->health_check_mysql_rec_version = '5.6'; - - if ( stristr( $mysql_server_type, 'mariadb' ) ) { - $this->is_mariadb = true; - $this->health_check_mysql_rec_version = '10.0'; - } - - $this->mysql_min_version_check = version_compare( '5.5', $this->mysql_server_version, '<=' ); - $this->mysql_rec_version_check = version_compare( $this->health_check_mysql_rec_version, $this->mysql_server_version, '<=' ); - } - - /** - * Test if `wp_version_check` is blocked. - * - * It's possible to block updates with the `wp_version_check` filter, but this can't be checked during an - * AJAX call, as the filter is never introduced then. - * - * This filter overrides a normal page request if it's made by an admin through the AJAX call with the - * right query argument to check for this. - * - * @since 5.2.0 - */ - public function check_wp_version_check_exists() { - if ( ! is_admin() || ! is_user_logged_in() || ! current_user_can( 'update_core' ) || ! isset( $_GET['health-check-test-wp_version_check'] ) ) { - return; - } - - echo ( has_filter( 'wp_version_check', 'wp_version_check' ) ? 'yes' : 'no' ); - - die(); - } - - /** - * Tests for WordPress version and outputs it. - * - * Gives various results depending on what kind of updates are available, if any, to encourage the - * user to install security updates as a priority. - * - * @since 5.2.0 - * - * @return array The test result. - */ - public function get_test_wordpress_version() { - $result = array( - 'label' => '', - 'status' => '', - 'badge' => array( - 'label' => __( 'Performance' ), - 'color' => 'blue', - ), - 'description' => '', - 'actions' => '', - 'test' => 'wordpress_version', - ); - - $core_current_version = get_bloginfo( 'version' ); - $core_updates = get_core_updates(); - - if ( ! is_array( $core_updates ) ) { - $result['status'] = 'recommended'; - - $result['label'] = sprintf( - /* translators: %s: Your current version of WordPress. */ - __( 'WordPress version %s' ), - $core_current_version - ); - - $result['description'] = sprintf( - '<p>%s</p>', - __( 'We were unable to check if any new versions of WordPress are available.' ) - ); - - $result['actions'] = sprintf( - '<a href="%s">%s</a>', - esc_url( admin_url( 'update-core.php?force-check=1' ) ), - __( 'Check for updates manually' ) - ); - } else { - foreach ( $core_updates as $core => $update ) { - if ( 'upgrade' === $update->response ) { - $current_version = explode( '.', $core_current_version ); - $new_version = explode( '.', $update->version ); - - $current_major = $current_version[0] . '.' . $current_version[1]; - $new_major = $new_version[0] . '.' . $new_version[1]; - - $result['label'] = sprintf( - /* translators: %s: The latest version of WordPress available. */ - __( 'WordPress update available (%s)' ), - $update->version - ); - - $result['actions'] = sprintf( - '<a href="%s">%s</a>', - esc_url( admin_url( 'update-core.php' ) ), - __( 'Install the latest version of WordPress' ) - ); - - if ( $current_major !== $new_major ) { - // This is a major version mismatch. - $result['status'] = 'recommended'; - $result['description'] = sprintf( - '<p>%s</p>', - __( 'A new version of WordPress is available.' ) - ); - } else { - // This is a minor version, sometimes considered more critical. - $result['status'] = 'critical'; - $result['badge']['label'] = __( 'Security' ); - $result['description'] = sprintf( - '<p>%s</p>', - __( 'A new minor update is available for your site. Because minor updates often address security, it’s important to install them.' ) - ); - } - } else { - $result['status'] = 'good'; - $result['label'] = sprintf( - /* translators: %s: The current version of WordPress installed on this site. */ - __( 'Your version of WordPress (%s) is up to date' ), - $core_current_version - ); - - $result['description'] = sprintf( - '<p>%s</p>', - __( 'You are currently running the latest version of WordPress available, keep it up!' ) - ); - } - } - } - - return $result; - } - - /** - * Test if plugins are outdated, or unnecessary. - * - * The tests checks if your plugins are up to date, and encourages you to remove any that are not in use. - * - * @since 5.2.0 - * - * @return array The test result. - */ - public function get_test_plugin_version() { - $result = array( - 'label' => __( 'Your plugins are all up to date' ), - 'status' => 'good', - 'badge' => array( - 'label' => __( 'Security' ), - 'color' => 'blue', - ), - 'description' => sprintf( - '<p>%s</p>', - __( 'Plugins extend your site’s functionality with things like contact forms, ecommerce and much more. That means they have deep access to your site, so it’s vital to keep them up to date.' ) - ), - 'actions' => sprintf( - '<p><a href="%s">%s</a></p>', - esc_url( admin_url( 'plugins.php' ) ), - __( 'Manage your plugins' ) - ), - 'test' => 'plugin_version', - ); - - $plugins = get_plugins(); - $plugin_updates = get_plugin_updates(); - - $plugins_have_updates = false; - $plugins_active = 0; - $plugins_total = 0; - $plugins_need_update = 0; - - // Loop over the available plugins and check their versions and active state. - foreach ( $plugins as $plugin_path => $plugin ) { - $plugins_total++; - - if ( is_plugin_active( $plugin_path ) ) { - $plugins_active++; - } - - $plugin_version = $plugin['Version']; - - if ( array_key_exists( $plugin_path, $plugin_updates ) ) { - $plugins_need_update++; - $plugins_have_updates = true; - } - } - - // Add a notice if there are outdated plugins. - if ( $plugins_need_update > 0 ) { - $result['status'] = 'critical'; - - $result['label'] = __( 'You have plugins waiting to be updated' ); - - $result['description'] .= sprintf( - '<p>%s</p>', - sprintf( - /* translators: %d: The number of outdated plugins. */ - _n( - 'Your site has %d plugin waiting to be updated.', - 'Your site has %d plugins waiting to be updated.', - $plugins_need_update - ), - $plugins_need_update - ) - ); - - $result['actions'] .= sprintf( - '<p><a href="%s">%s</a></p>', - esc_url( network_admin_url( 'plugins.php?plugin_status=upgrade' ) ), - __( 'Update your plugins' ) - ); - } else { - if ( 1 === $plugins_active ) { - $result['description'] .= sprintf( - '<p>%s</p>', - __( 'Your site has 1 active plugin, and it is up to date.' ) - ); - } else { - $result['description'] .= sprintf( - '<p>%s</p>', - sprintf( - /* translators: %d: The number of active plugins. */ - _n( - 'Your site has %d active plugin, and it is up to date.', - 'Your site has %d active plugins, and they are all up to date.', - $plugins_active - ), - $plugins_active - ) - ); - } - } - - // Check if there are inactive plugins. - if ( $plugins_total > $plugins_active && ! is_multisite() ) { - $unused_plugins = $plugins_total - $plugins_active; - - $result['status'] = 'recommended'; - - $result['label'] = __( 'You should remove inactive plugins' ); - - $result['description'] .= sprintf( - '<p>%s %s</p>', - sprintf( - /* translators: %d: The number of inactive plugins. */ - _n( - 'Your site has %d inactive plugin.', - 'Your site has %d inactive plugins.', - $unused_plugins - ), - $unused_plugins - ), - __( 'Inactive plugins are tempting targets for attackers. If you’re not going to use a plugin, we recommend you remove it.' ) - ); - - $result['actions'] .= sprintf( - '<p><a href="%s">%s</a></p>', - esc_url( admin_url( 'plugins.php?plugin_status=inactive' ) ), - __( 'Manage inactive plugins' ) - ); - } - - return $result; - } - - /** - * Test if themes are outdated, or unnecessary. - * - * The tests checks if your site has a default theme (to fall back on if there is a need), if your themes - * are up to date and, finally, encourages you to remove any themes that are not needed. - * - * @since 5.2.0 - * - * @return array The test results. - */ - public function get_test_theme_version() { - $result = array( - 'label' => __( 'Your themes are all up to date' ), - 'status' => 'good', - 'badge' => array( - 'label' => __( 'Security' ), - 'color' => 'blue', - ), - 'description' => sprintf( - '<p>%s</p>', - __( 'Themes add your site’s look and feel. It’s important to keep them up to date, to stay consistent with your brand and keep your site secure.' ) - ), - 'actions' => sprintf( - '<p><a href="%s">%s</a></p>', - esc_url( admin_url( 'themes.php' ) ), - __( 'Manage your themes' ) - ), - 'test' => 'theme_version', - ); - - $theme_updates = get_theme_updates(); - - $themes_total = 0; - $themes_need_updates = 0; - $themes_inactive = 0; - - // This value is changed during processing to determine how many themes are considered a reasonable amount. - $allowed_theme_count = 1; - - $has_default_theme = false; - $has_unused_themes = false; - $show_unused_themes = true; - $using_default_theme = false; - - // Populate a list of all themes available in the install. - $all_themes = wp_get_themes(); - $active_theme = wp_get_theme(); - - // If WP_DEFAULT_THEME doesn't exist, fall back to the latest core default theme. - $default_theme = wp_get_theme( WP_DEFAULT_THEME ); - if ( ! $default_theme->exists() ) { - $default_theme = WP_Theme::get_core_default_theme(); - } - - if ( $default_theme ) { - $has_default_theme = true; - - if ( - $active_theme->get_stylesheet() === $default_theme->get_stylesheet() - || - is_child_theme() && $active_theme->get_template() === $default_theme->get_template() - ) { - $using_default_theme = true; - } - } - - foreach ( $all_themes as $theme_slug => $theme ) { - $themes_total++; - - if ( array_key_exists( $theme_slug, $theme_updates ) ) { - $themes_need_updates++; - } - } - - // If this is a child theme, increase the allowed theme count by one, to account for the parent. - if ( is_child_theme() ) { - $allowed_theme_count++; - } - - // If there's a default theme installed and not in use, we count that as allowed as well. - if ( $has_default_theme && ! $using_default_theme ) { - $allowed_theme_count++; - } - - if ( $themes_total > $allowed_theme_count ) { - $has_unused_themes = true; - $themes_inactive = ( $themes_total - $allowed_theme_count ); - } - - // Check if any themes need to be updated. - if ( $themes_need_updates > 0 ) { - $result['status'] = 'critical'; - - $result['label'] = __( 'You have themes waiting to be updated' ); - - $result['description'] .= sprintf( - '<p>%s</p>', - sprintf( - /* translators: %d: The number of outdated themes. */ - _n( - 'Your site has %d theme waiting to be updated.', - 'Your site has %d themes waiting to be updated.', - $themes_need_updates - ), - $themes_need_updates - ) - ); - } else { - // Give positive feedback about the site being good about keeping things up to date. - if ( 1 === $themes_total ) { - $result['description'] .= sprintf( - '<p>%s</p>', - __( 'Your site has 1 installed theme, and it is up to date.' ) - ); - } else { - $result['description'] .= sprintf( - '<p>%s</p>', - sprintf( - /* translators: %d: The number of themes. */ - _n( - 'Your site has %d installed theme, and it is up to date.', - 'Your site has %d installed themes, and they are all up to date.', - $themes_total - ), - $themes_total - ) - ); - } - } - - if ( $has_unused_themes && $show_unused_themes && ! is_multisite() ) { - - // This is a child theme, so we want to be a bit more explicit in our messages. - if ( is_child_theme() ) { - // Recommend removing inactive themes, except a default theme, your current one, and the parent theme. - $result['status'] = 'recommended'; - - $result['label'] = __( 'You should remove inactive themes' ); - - if ( $using_default_theme ) { - $result['description'] .= sprintf( - '<p>%s %s</p>', - sprintf( - /* translators: %d: The number of inactive themes. */ - _n( - 'Your site has %d inactive theme.', - 'Your site has %d inactive themes.', - $themes_inactive - ), - $themes_inactive - ), - sprintf( - /* translators: 1: The currently active theme. 2: The active theme's parent theme. */ - __( 'To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep your current theme, %1$s, and %2$s, its parent theme.' ), - $active_theme->name, - $active_theme->parent()->name - ) - ); - } else { - $result['description'] .= sprintf( - '<p>%s %s</p>', - sprintf( - /* translators: %d: The number of inactive themes. */ - _n( - 'Your site has %d inactive theme.', - 'Your site has %d inactive themes.', - $themes_inactive - ), - $themes_inactive - ), - sprintf( - /* translators: 1: The default theme for WordPress. 2: The currently active theme. 3: The active theme's parent theme. */ - __( 'To enhance your site’s security, we recommend you remove any themes you’re not using. You should keep %1$s, the default WordPress theme, %2$s, your current theme, and %3$s, its parent theme.' ), - $default_theme ? $default_theme->name : WP_DEFAULT_THEME, - $active_theme->name, - $active_theme->parent()->name - ) - ); - } - } else { - // Recommend removing all inactive themes. - $result['status'] = 'recommended'; - - $result['label'] = __( 'You should remove inactive themes' ); - - if ( $using_default_theme ) { - $result['description'] .= sprintf( - '<p>%s %s</p>', - sprintf( - /* translators: 1: The amount of inactive themes. 2: The currently active theme. */ - _n( - 'Your site has %1$d inactive theme, other than %2$s, your active theme.', - 'Your site has %1$d inactive themes, other than %2$s, your active theme.', - $themes_inactive - ), - $themes_inactive, - $active_theme->name - ), - __( 'We recommend removing any unused themes to enhance your site’s security.' ) - ); - } else { - $result['description'] .= sprintf( - '<p>%s %s</p>', - sprintf( - /* translators: 1: The amount of inactive themes. 2: The default theme for WordPress. 3: The currently active theme. */ - _n( - 'Your site has %1$d inactive theme, other than %2$s, the default WordPress theme, and %3$s, your active theme.', - 'Your site has %1$d inactive themes, other than %2$s, the default WordPress theme, and %3$s, your active theme.', - $themes_inactive - ), - $themes_inactive, - $default_theme ? $default_theme->name : WP_DEFAULT_THEME, - $active_theme->name - ), - __( 'We recommend removing any unused themes to enhance your site’s security.' ) - ); - } - } - } - - // If no default Twenty* theme exists. - if ( ! $has_default_theme ) { - $result['status'] = 'recommended'; - - $result['label'] = __( 'Have a default theme available' ); - - $result['description'] .= sprintf( - '<p>%s</p>', - __( 'Your site does not have any default theme. Default themes are used by WordPress automatically if anything is wrong with your normal theme.' ) - ); - } - - return $result; - } - - /** - * Test if the supplied PHP version is supported. - * - * @since 5.2.0 - * - * @return array The test results. - */ - public function get_test_php_version() { - $response = wp_check_php_version(); - - $result = array( - 'label' => sprintf( - /* translators: %s: The current PHP version. */ - __( 'Your version of PHP (%s) is up to date' ), - PHP_VERSION - ), - 'status' => 'good', - 'badge' => array( - 'label' => __( 'Performance' ), - 'color' => 'blue', - ), - 'description' => sprintf( - '<p>%s</p>', - sprintf( - /* translators: %s: The minimum recommended PHP version. */ - __( 'PHP is the programming language used to build and maintain WordPress. Newer versions of PHP are faster and more secure, so staying up to date will help your site’s overall performance and security. The minimum recommended version of PHP is %s.' ), - $response['recommended_version'] - ) - ), - 'actions' => sprintf( - '<p><a href="%s" target="_blank" rel="noopener noreferrer">%s <span class="screen-reader-text">%s</span><span aria-hidden="true" class="dashicons dashicons-external"></span></a></p>', - esc_url( wp_get_update_php_url() ), - __( 'Learn more about updating PHP' ), - /* translators: Accessibility text. */ - __( '(opens in a new tab)' ) - ), - 'test' => 'php_version', - ); - - // PHP is up to date. - if ( ! $response || version_compare( PHP_VERSION, $response['recommended_version'], '>=' ) ) { - return $result; - } - - // The PHP version is older than the recommended version, but still receiving active support. - if ( $response['is_supported'] ) { - $result['label'] = sprintf( - /* translators: %s: The server PHP version. */ - __( 'Your version of PHP (%s) is out of date' ), - PHP_VERSION - ); - $result['status'] = 'recommended'; - - return $result; - } - - // The PHP version is only receiving security fixes. - if ( $response['is_secure'] ) { - $result['label'] = sprintf( - /* translators: %s: The server PHP version. */ - __( 'Your version of PHP (%s) should be updated' ), - PHP_VERSION - ); - $result['status'] = 'recommended'; - - return $result; - } - - // Anything no longer secure must be updated. - $result['label'] = sprintf( - /* translators: %s: The server PHP version. */ - __( 'Your version of PHP (%s) requires an update' ), - PHP_VERSION - ); - $result['status'] = 'critical'; - $result['badge']['label'] = __( 'Security' ); - - return $result; - } - - /** - * Check if the passed extension or function are available. - * - * Make the check for available PHP modules into a simple boolean operator for a cleaner test runner. - * - * @since 5.2.0 - * @since 5.3.0 The `$constant` and `$class` parameters were added. - * - * @param string $extension Optional. The extension name to test. Default null. - * @param string $function Optional. The function name to test. Default null. - * @param string $constant Optional. The constant name to test for. Default null. - * @param string $class Optional. The class name to test for. Default null. - * - * @return bool Whether or not the extension and function are available. - */ - private function test_php_extension_availability( $extension = null, $function = null, $constant = null, $class = null ) { - // If no extension or function is passed, claim to fail testing, as we have nothing to test against. - if ( ! $extension && ! $function && ! $constant && ! $class ) { - return false; - } - - if ( $extension && ! extension_loaded( $extension ) ) { - return false; - } - if ( $function && ! function_exists( $function ) ) { - return false; - } - if ( $constant && ! defined( $constant ) ) { - return false; - } - if ( $class && ! class_exists( $class ) ) { - return false; - } - - return true; - } - - /** - * Test if required PHP modules are installed on the host. - * - * This test builds on the recommendations made by the WordPress Hosting Team - * as seen at https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions - * - * @since 5.2.0 - * - * @return array - */ - public function get_test_php_extensions() { - $result = array( - 'label' => __( 'Required and recommended modules are installed' ), - 'status' => 'good', - 'badge' => array( - 'label' => __( 'Performance' ), - 'color' => 'blue', - ), - 'description' => sprintf( - '<p>%s</p><p>%s</p>', - __( 'PHP modules perform most of the tasks on the server that make your site run. Any changes to these must be made by your server administrator.' ), - sprintf( - /* translators: 1: Link to the hosting group page about recommended PHP modules. 2: Additional link attributes. 3: Accessibility text. */ - __( 'The WordPress Hosting Team maintains a list of those modules, both recommended and required, in <a href="%1$s" %2$s>the team handbook%3$s</a>.' ), - /* translators: Localized team handbook, if one exists. */ - esc_url( __( 'https://make.wordpress.org/hosting/handbook/handbook/server-environment/#php-extensions' ) ), - 'target="_blank" rel="noopener noreferrer"', - sprintf( - ' <span class="screen-reader-text">%s</span><span aria-hidden="true" class="dashicons dashicons-external"></span>', - /* translators: Accessibility text. */ - __( '(opens in a new tab)' ) - ) - ) - ), - 'actions' => '', - 'test' => 'php_extensions', - ); - - $modules = array( - 'curl' => array( - 'function' => 'curl_version', - 'required' => false, - ), - 'dom' => array( - 'class' => 'DOMNode', - 'required' => false, - ), - 'exif' => array( - 'function' => 'exif_read_data', - 'required' => false, - ), - 'fileinfo' => array( - 'function' => 'finfo_file', - 'required' => false, - ), - 'hash' => array( - 'function' => 'hash', - 'required' => false, - ), - 'json' => array( - 'function' => 'json_last_error', - 'required' => true, - ), - 'mbstring' => array( - 'function' => 'mb_check_encoding', - 'required' => false, - ), - 'mysqli' => array( - 'function' => 'mysqli_connect', - 'required' => false, - ), - 'libsodium' => array( - 'constant' => 'SODIUM_LIBRARY_VERSION', - 'required' => false, - 'php_bundled_version' => '7.2.0', - ), - 'openssl' => array( - 'function' => 'openssl_encrypt', - 'required' => false, - ), - 'pcre' => array( - 'function' => 'preg_match', - 'required' => false, - ), - 'imagick' => array( - 'extension' => 'imagick', - 'required' => false, - ), - 'mod_xml' => array( - 'extension' => 'libxml', - 'required' => false, - ), - 'zip' => array( - 'class' => 'ZipArchive', - 'required' => false, - ), - 'filter' => array( - 'function' => 'filter_list', - 'required' => false, - ), - 'gd' => array( - 'extension' => 'gd', - 'required' => false, - 'fallback_for' => 'imagick', - ), - 'iconv' => array( - 'function' => 'iconv', - 'required' => false, - ), - 'mcrypt' => array( - 'extension' => 'mcrypt', - 'required' => false, - 'fallback_for' => 'libsodium', - ), - 'simplexml' => array( - 'extension' => 'simplexml', - 'required' => false, - 'fallback_for' => 'mod_xml', - ), - 'xmlreader' => array( - 'extension' => 'xmlreader', - 'required' => false, - 'fallback_for' => 'mod_xml', - ), - 'zlib' => array( - 'extension' => 'zlib', - 'required' => false, - 'fallback_for' => 'zip', - ), - ); - - /** - * An array representing all the modules we wish to test for. - * - * @since 5.2.0 - * @since 5.3.0 The `$constant` and `$class` parameters were added. - * - * @param array $modules { - * An associated array of modules to test for. - * - * array $module { - * An associated array of module properties used during testing. - * One of either `$function` or `$extension` must be provided, or they will fail by default. - * - * string $function Optional. A function name to test for the existence of. - * string $extension Optional. An extension to check if is loaded in PHP. - * string $constant Optional. A constant name to check for to verify an extension exists. - * string $class Optional. A class name to check for to verify an extension exists. - * bool $required Is this a required feature or not. - * string $fallback_for Optional. The module this module replaces as a fallback. - * } - * } - */ - $modules = apply_filters( 'site_status_test_php_modules', $modules ); - - $failures = array(); - - foreach ( $modules as $library => $module ) { - $extension = ( isset( $module['extension'] ) ? $module['extension'] : null ); - $function = ( isset( $module['function'] ) ? $module['function'] : null ); - $constant = ( isset( $module['constant'] ) ? $module['constant'] : null ); - $class_name = ( isset( $module['class'] ) ? $module['class'] : null ); - - // If this module is a fallback for another function, check if that other function passed. - if ( isset( $module['fallback_for'] ) ) { - /* - * If that other function has a failure, mark this module as required for normal operations. - * If that other function hasn't failed, skip this test as it's only a fallback. - */ - if ( isset( $failures[ $module['fallback_for'] ] ) ) { - $module['required'] = true; - } else { - continue; - } - } - - if ( ! $this->test_php_extension_availability( $extension, $function, $constant, $class_name ) && ( ! isset( $module['php_bundled_version'] ) || version_compare( PHP_VERSION, $module['php_bundled_version'], '<' ) ) ) { - if ( $module['required'] ) { - $result['status'] = 'critical'; - - $class = 'error'; - $screen_reader = __( 'Error' ); - $message = sprintf( - /* translators: %s: The module name. */ - __( 'The required module, %s, is not installed, or has been disabled.' ), - $library - ); - } else { - $class = 'warning'; - $screen_reader = __( 'Warning' ); - $message = sprintf( - /* translators: %s: The module name. */ - __( 'The optional module, %s, is not installed, or has been disabled.' ), - $library - ); - } - - if ( ! $module['required'] && 'good' === $result['status'] ) { - $result['status'] = 'recommended'; - } - - $failures[ $library ] = "<span class='dashicons $class'><span class='screen-reader-text'>$screen_reader</span></span> $message"; - } - } - - if ( ! empty( $failures ) ) { - $output = '<ul>'; - - foreach ( $failures as $failure ) { - $output .= sprintf( - '<li>%s</li>', - $failure - ); - } - - $output .= '</ul>'; - } - - if ( 'good' !== $result['status'] ) { - if ( 'recommended' === $result['status'] ) { - $result['label'] = __( 'One or more recommended modules are missing' ); - } - if ( 'critical' === $result['status'] ) { - $result['label'] = __( 'One or more required modules are missing' ); - } - - $result['description'] .= sprintf( - '<p>%s</p>', - $output - ); - } - - return $result; - } - - /** - * Test if the PHP default timezone is set to UTC. - * - * @since 5.3.1 - * - * @return array The test results. - */ - public function get_test_php_default_timezone() { - $result = array( - 'label' => __( 'PHP default timezone is valid' ), - 'status' => 'good', - 'badge' => array( - 'label' => __( 'Performance' ), - 'color' => 'blue', - ), - 'description' => sprintf( - '<p>%s</p>', - __( 'PHP default timezone was configured by WordPress on loading. This is necessary for correct calculations of dates and times.' ) - ), - 'test' => 'php_default_timezone', - ); - - if ( 'UTC' !== date_default_timezone_get() ) { - $result['status'] = 'critical'; - - $result['label'] = __( 'PHP default timezone is invalid' ); - - $result['description'] = sprintf( - '<p>%s</p>', - sprintf( - /* translators: %s: date_default_timezone_set() */ - __( 'PHP default timezone was changed after WordPress loading by a %s function call. This interferes with correct calculations of dates and times.' ), - '<code>date_default_timezone_set()</code>' - ) - |
