Make WordPress Core

Ticket #39165: 39165.7.2.patch

File 39165.7.2.patch, 22.7 KB (added by birgire, 7 years ago)
  • new file src/wp-admin/info.php

    diff --git src/wp-admin/info.php src/wp-admin/info.php
    new file mode 100644
    index 0000000..59f2200
    - +  
     1<?php
     2/**
     3 * Get system status for debugging and support.
     4 *
     5 * @package WordPress
     6 * @subpackage Administration
     7 */
     8
     9/** WordPress Administration Bootstrap */
     10require_once( dirname( __FILE__ ) . '/admin.php' );
     11
     12if ( ! current_user_can( 'update_core' ) ) {
     13        wp_die( __( 'Sorry, you do not have permission to access this page.' ) );
     14}
     15
     16global $wpdb;
     17
     18$title = __( 'System information' );
     19
     20require_once( ABSPATH . 'wp-admin/admin-header.php' );
     21?>
     22
     23        <div class="wrap">
     24                <h1 class="wp-heading-inline">
     25                        <?php echo esc_html( $title ); ?>
     26
     27                        <?php if ( ! function_exists( 'phpinfo' ) ) { ?>
     28                                <?php if ( ! isset( $_GET['phpinfo'] ) ) { ?>
     29                                        <a href="<?php echo esc_url( admin_url( 'info.php?phpinfo' ) ); ?>" class="page-title-action"><?php esc_html_e( 'PHP Information' ); ?></a>
     30                                <?php } else { ?>
     31                                        <a href="<?php echo esc_url( admin_url( 'info.php' ) ); ?>" class="page-title-action"><?php esc_html_e( 'Debug Information' ); ?></a>
     32                                <?php } ?>
     33                        <?php } ?>
     34                </h1>
     35
     36                <hr class="wp-header-end">
     37
     38                <?php
     39                if ( ! isset( $_GET['phpinfo'] ) ) {
     40
     41                        $info = array(
     42                                'wp-core'             => array(
     43                                        'label'  => __( 'WordPress' ),
     44                                        'fields' => array(
     45                                                array(
     46                                                        'label' => __( 'Version' ),
     47                                                        'value' => get_bloginfo( 'version' )
     48                                                ),
     49                                                array(
     50                                                        'label' => __( 'Language' ),
     51                                                        'value' => get_locale()
     52                                                ),
     53                                                array(
     54                                                        'label'   => __( 'Home URL' ),
     55                                                        'value'   => get_bloginfo( 'url' ),
     56                                                        'private' => true
     57                                                ),
     58                                                array(
     59                                                        'label'   => __( 'Site URL' ),
     60                                                        'value'   => get_bloginfo( 'wpurl' ),
     61                                                        'private' => true
     62                                                ),
     63                                                array(
     64                                                        'label' => __( 'Permalink structure' ),
     65                                                        'value' => get_option( 'permalink_structure' )
     66                                                ),
     67                                                array(
     68                                                        'label' => __( 'Is this site using HTTPS' ),
     69                                                        'value' => ( is_ssl() ? __( 'Yes' ) : __( 'No' ) )
     70                                                ),
     71                                                array(
     72                                                        'label' => __( 'Is the main WordPress directory writable' ),
     73                                                        'value' => ( wp_is_writable( ABSPATH ) ? __( 'Yes' ) : __( 'No' ) )
     74                                                ),
     75                                                array(
     76                                                        'label' => __( 'Is the theme directory writable' ),
     77                                                        'value' => ( wp_is_writable( get_template_directory() . '/..' ) ? __( 'Yes' ) : __( 'No' ) )
     78                                                ),
     79                                                array(
     80                                                        'label' => __( 'Is the plugin directory writable' ),
     81                                                        'value' => ( wp_is_writable( WP_PLUGIN_DIR ) ? __( 'Yes' ) : __( 'No' ) )
     82                                                ),
     83                                                array(
     84                                                        'label' => __( 'Can anyone register on this site' ),
     85                                                        'value' => ( get_option( 'users_can_register' ) ? __( 'Yes' ) : __( 'No' ) )
     86                                                ),
     87                                                array(
     88                                                        'label' => __( 'Default comment status' ),
     89                                                        'value' => get_option( 'default_comment_status' )
     90                                                ),
     91                                                array(
     92                                                        'label' => __( 'Is this a multisite' ),
     93                                                        'value' => ( is_multisite() ? __( 'Yes' ) : __( 'No' ) )
     94                                                )
     95                                        ),
     96                                ),
     97                                'wp-dropins'          => array(
     98                                        'label'       => __( 'Drop-ins' ),
     99                                        'description' => __( 'Drop-ins are single files that replace or enhance WordPress features in ways that are not possible for traditional plugins' ),
     100                                        'fields'      => array()
     101                                ),
     102                                'wp-active-theme'     => array(
     103                                        'label'  => __( 'Active theme' ),
     104                                        'fields' => array()
     105                                ),
     106                                'wp-themes'           => array(
     107                                        'label'      => __( 'Other themes' ),
     108                                        'show_count' => true,
     109                                        'fields'     => array()
     110                                ),
     111                                'wp-mu-plugins'       => array(
     112                                        'label'      => __( 'Must User Plugins' ),
     113                                        'show_count' => true,
     114                                        'fields'     => array()
     115                                ),
     116                                'wp-plugins-active'   => array(
     117                                        'label'      => __( 'Active Plugins' ),
     118                                        'show_count' => true,
     119                                        'fields'     => array()
     120                                ),
     121                                'wp-plugins-inactive' => array(
     122                                        'label'      => __( 'Inactive Plugins' ),
     123                                        'show_count' => true,
     124                                        'fields'     => array()
     125                                ),
     126                                'wp-server'           => array(
     127                                        'label'       => 'Server',
     128                                        'description' => __( 'The options shown below relate to your server setup. If changes are required, you may need your web host\'s assistance.' ),
     129                                        'fields'      => array()
     130                                ),
     131                                'wp-database'         => array(
     132                                        'label'  => __( 'Database' ),
     133                                        'fields' => array()
     134                                ),
     135                                'wp-constants'        => array(
     136                                        'label'       => __( 'WordPress constants' ),
     137                                        'description' => __( 'These values represent values set in your websites code which affect WordPress in various ways that may be of importance when seeking help with your site.' ),
     138                                        'fields'      => array(
     139                                                array(
     140                                                        'label' => 'WP_DEBUG',
     141                                                        'value' => ( ! defined( 'WP_DEBUG' ) ? __( 'Undefined' ) : ( WP_DEBUG ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     142                                                ),
     143                                                array(
     144                                                        'label' => 'WP_MAX_MEMORY_LIMIT',
     145                                                        'value' => ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ? __( 'Undefined' ) : WP_MAX_MEMORY_LIMIT )
     146                                                ),
     147                                                array(
     148                                                        'label' => 'WP_DEBUG_DISPLAY',
     149                                                        'value' => ( ! defined( 'WP_DEBUG_DISPLAY' ) ? __( 'Undefined' ) : ( WP_DEBUG_DISPLAY ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     150                                                ),
     151                                                array(
     152                                                        'label' => 'WP_DEBUG_LOG',
     153                                                        'value' => ( ! defined( 'WP_DEBUG_LOG' ) ? __( 'Undefined' ) : ( WP_DEBUG_LOG ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     154                                                ),
     155                                                array(
     156                                                        'label' => 'SCRIPT_DEBUG',
     157                                                        'value' => ( ! defined( 'SCRIPT_DEBUG' ) ? __( 'Undefined' ) : ( SCRIPT_DEBUG ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     158                                                ),
     159                                                array(
     160                                                        'label' => 'WP_CACHE',
     161                                                        'value' => ( ! defined( 'WP_CACHE' ) ? __( 'Undefined' ) : ( WP_CACHE ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     162                                                ),
     163                                                array(
     164                                                        'label' => 'CONCATENATE_SCRIPTS',
     165                                                        'value' => ( ! defined( 'CONCATENATE_SCRIPTS' ) ? __( 'Undefined' ) : ( CONCATENATE_SCRIPTS ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     166                                                ),
     167                                                array(
     168                                                        'label' => 'COMPRESS_SCRIPTS',
     169                                                        'value' => ( ! defined( 'COMPRESS_SCRIPTS' ) ? __( 'Undefined' ) : ( COMPRESS_SCRIPTS ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     170                                                ),
     171                                                array(
     172                                                        'label' => 'COMPRESS_CSS',
     173                                                        'value' => ( ! defined( 'COMPRESS_CSS' ) ? __( 'Undefined' ) : ( COMPRESS_CSS ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     174                                                ),
     175                                                array(
     176                                                        'label' => 'WP_LOCAL_DEV',
     177                                                        'value' => ( ! defined( 'WP_LOCAL_DEV' ) ? __( 'Undefined' ) : ( WP_LOCAL_DEV ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     178                                                )
     179                                        )
     180                                )
     181                        );
     182
     183                        if ( is_multisite() ) {
     184                                $network_query = new WP_Network_Query();
     185                                $network_ids   = $network_query->query( array(
     186                                        'fields'        => 'ids',
     187                                        'number'        => 100,
     188                                        'no_found_rows' => false,
     189                                ) );
     190
     191                                $site_count = 0;
     192                                foreach ( $network_ids AS $network_id ) {
     193                                        $site_count += get_blog_count( $network_id );
     194                                }
     195
     196                                $info['wp-core']['fields'][] = array(
     197                                        'label' => __( 'User Count' ),
     198                                        'value' => get_user_count()
     199                                );
     200                                $info['wp-core']['fields'][] = array(
     201                                        'label' => __( 'Site Count' ),
     202                                        'value' => $site_count
     203                                );
     204                                $info['wp-core']['fields'][] = array(
     205                                        'label' => __( 'Network Count' ),
     206                                        'value' => $network_query->found_networks
     207                                );
     208                        } else {
     209                                $user_count = count_users();
     210
     211                                $info['wp-core']['fields'][] = array(
     212                                        'label' => __( 'User Count' ),
     213                                        'value' => $user_count['total_users']
     214                                );
     215                        }
     216
     217                        // WordPress features requiring processing.
     218                        $wp_dotorg = wp_remote_get( 'https://wordpress.org', array( 'timeout' => 10 ) );
     219                        if ( ! is_wp_error( $wp_dotorg ) ) {
     220                                $info['wp-core']['fields'][] = array(
     221                                        'label' => __( 'Communication with WordPress.org' ),
     222                                        'value' => sprintf(
     223                                                __( 'WordPress.org is reachable' )
     224                                        )
     225                                );
     226                        } else {
     227                                $info['wp-core']['fields'][] = array(
     228                                        'label' => __( 'Communication with WordPress.org' ),
     229                                        'value' => sprintf(
     230                                        // translators: %1$s: The IP address WordPress.org resolves to. %2$s: The error returned by the lookup.
     231                                                __( 'Unable to reach WordPress.org at %1$s: %2$s' ),
     232                                                gethostbyname( 'wordpress.org' ),
     233                                                $wp_dotorg->get_error_message()
     234                                        )
     235                                );
     236                        }
     237
     238                        // Get drop-ins.
     239                        $dropins            = get_dropins();
     240                        $dropin_description = _get_dropins();
     241                        foreach ( $dropins AS $dropin_key => $dropin ) {
     242                                $info['wp-dropins']['fields'][] = array(
     243                                        'label' => $dropin_key,
     244                                        'value' => $dropin_description[ $dropin_key ][0]
     245                                );
     246                        }
     247
     248                        // Populate the server debug fields.
     249                        $info['wp-server']['fields'][] = array(
     250                                'label' => _( 'Server architecture' ),
     251                                'value' => ( ! function_exists( 'php_uname' ) ? __( 'Unable to determine server architecture' ) : sprintf( '%s %s %s', php_uname( 's' ), php_uname( 'r' ), php_uname( 'm' ) ) )
     252                        );
     253                        $info['wp-server']['fields'][] = array(
     254                                'label' => __( 'PHP Version' ),
     255                                'value' => ( ! function_exists( 'phpversion' ) ? __( 'Unable to determine PHP version' ) : phpversion() )
     256                        );
     257                        $info['wp-server']['fields'][] = array(
     258                                'label' => __( 'PHP SAPI' ),
     259                                'value' => ( ! function_exists( 'php_sapi_name' ) ? __( 'Unable to determine PHP SAPI' ) : php_sapi_name() )
     260                        );
     261
     262                        if ( ! function_exists( 'ini_get' ) ) {
     263                                $info['wp-server']['fields'][] = array(
     264                                        'label' => __( 'Server settings' ),
     265                                        'value' => __( 'Unable to determine some settings as the ini_get() function has been disabled' )
     266                                );
     267                        } else {
     268                                $info['wp-server']['fields'][] = array(
     269                                        'label' => __( 'PHP max input variables' ),
     270                                        'value' => ini_get( 'max_input_vars' )
     271                                );
     272                                $info['wp-server']['fields'][] = array(
     273                                        'label' => __( 'PHP time limit' ),
     274                                        'value' => ini_get( 'max_execution_time' )
     275                                );
     276                                $info['wp-server']['fields'][] = array(
     277                                        'label' => __( 'PHP memory limit' ),
     278                                        'value' => ini_get( 'memory_limit' )
     279                                );
     280                                $info['wp-server']['fields'][] = array(
     281                                        'label' => __( 'Upload max filesize' ),
     282                                        'value' => ini_get( 'upload_max_filesize' )
     283                                );
     284                                $info['wp-server']['fields'][] = array(
     285                                        'label' => __( 'PHP post max size' ),
     286                                        'value' => ini_get( 'post_max_size' )
     287                                );
     288                        }
     289
     290                        if ( function_exists( 'curl_version' ) ) {
     291                                $cURL                          = curl_version();
     292                                $info['wp-server']['fields'][] = array(
     293                                        'label' => __( 'cURL Version' ),
     294                                        'value' => sprintf( '%s %s', $cURL['version'], $cURL['ssl_version'] )
     295                                );
     296                        } else {
     297                                $info['wp-server']['fields'][] = array(
     298                                        'label' => __( 'cURL Version' ),
     299                                        'value' => __( 'Your server does not support cURL' )
     300                                );
     301                        }
     302
     303                        $info['wp-server']['fields'][] = array(
     304                                'label' => __( 'SUHOSIN installed' ),
     305                                'value' => ( ( extension_loaded( 'suhosin' ) || ( defined( 'SUHOSIN_PATCH' ) && constant( 'SUHOSIN_PATCH' ) ) ) ? __( 'Yes' ) : __( 'No' ) )
     306                        );
     307
     308                        $info['wp-server']['fields'][] = array(
     309                                'label' => __( 'Is the Imagick library available' ),
     310                                'value' => ( extension_loaded( 'imagick' ) ? __( 'Yes' ) : __( 'No' ) )
     311                        );
     312
     313
     314                        // Populate the database debug fields.
     315                        if ( is_resource( $wpdb->dbh ) ) {
     316                                // Old mysql extension.
     317                                $extension = 'mysql';
     318                        } else if ( is_object( $wpdb->dbh ) ) {
     319                                // mysqli or PDO.
     320                                $extension = get_class( $wpdb->dbh );
     321                        } else {
     322                                // Unknown sql extension.
     323                                $extension = null;
     324                        }
     325
     326                        if ( method_exists( $wpdb, 'db_version' ) ) {
     327                                if ( $wpdb->use_mysqli ) {
     328                                        $server = mysqli_get_server_info( $wpdb->dbh );
     329                                } else {
     330                                        $server = mysql_get_server_info( $wpdb->dbh );
     331                                }
     332                        } else {
     333                                $server = null;
     334                        }
     335
     336                        if ( isset( $wpdb->use_mysqli ) && $wpdb->use_mysqli ) {
     337                                $client_version = $wpdb->dbh->client_info;
     338                        } else {
     339                                if ( preg_match( '|[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}|', mysql_get_client_info(), $matches ) ) {
     340                                        $client_version = $matches[0];
     341                                } else {
     342                                        $client_version = null;
     343                                }
     344                        }
     345
     346                        $info['wp-database']['fields'][] = array(
     347                                'label' => __( 'Extension' ),
     348                                'value' => $extension
     349                        );
     350                        $info['wp-database']['fields'][] = array(
     351                                'label' => __( 'Server version' ),
     352                                'value' => $server
     353                        );
     354                        $info['wp-database']['fields'][] = array(
     355                                'label' => __( 'Client version' ),
     356                                'value' => $client_version
     357                        );
     358                        $info['wp-database']['fields'][] = array(
     359                                'label'   => __( 'Database user' ),
     360                                'value'   => $wpdb->dbuser,
     361                                'private' => true
     362                        );
     363                        $info['wp-database']['fields'][] = array(
     364                                'label'   => __( 'Database host' ),
     365                                'value'   => $wpdb->dbhost,
     366                                'private' => true
     367                        );
     368                        $info['wp-database']['fields'][] = array(
     369                                'label'   => __( 'Database table' ),
     370                                'value'   => $wpdb->dbname,
     371                                'private' => true
     372                        );
     373                        $info['wp-database']['fields'][] = array(
     374                                'label' => __( 'Database prefix' ),
     375                                'value' => $wpdb->prefix
     376                        );
     377
     378
     379                        // List must use plugins if there are any.
     380                        $mu_plugins = get_mu_plugins();
     381
     382                        foreach ( $mu_plugins AS $plugin_path => $plugin ) {
     383                                $info['wp-mu-plugins']['fields'][] = array(
     384                                        'label' => $plugin['Name'],
     385                                        // translators: %1$s: Plugin version number. %2$s: Plugin author name.
     386                                        'value' => sprintf( __( 'version %1$s by %2$s' ), $plugin['Version'], $plugin['Author'] )
     387                                );
     388                        }
     389
     390
     391                        // List all available plugins.
     392                        $plugins = get_plugins();
     393
     394                        foreach ( $plugins AS $plugin_path => $plugin ) {
     395                                $plugin_part = ( is_plugin_active( $plugin_path ) ) ? 'wp-plugins-active' : 'wp-plugins-inactive';
     396
     397                                $info[ $plugin_part ]['fields'][] = array(
     398                                        'label' => $plugin['Name'],
     399                                        // translators: %1$s: Plugin version number. %2$s: Plugin author name.
     400                                        'value' => sprintf( __( 'version %1$s by %2$s' ), $plugin['Version'], $plugin['Author'] )
     401                                );
     402                        }
     403
     404
     405                        // Populate the section for the currently active theme.
     406                        global $_wp_theme_features;
     407                        $theme_features = array();
     408                        foreach ( $_wp_theme_features AS $feature => $options ) {
     409                                $theme_features[] = $feature;
     410                        }
     411
     412                        $active_theme                      = wp_get_theme();
     413                        $info['wp-active-theme']['fields'] = array(
     414                                array(
     415                                        'label' => __( 'Name' ),
     416                                        'value' => $active_theme->Name
     417                                ),
     418                                array(
     419                                        'label' => __( 'Version' ),
     420                                        'value' => $active_theme->Version
     421                                ),
     422                                array(
     423                                        'label' => __( 'Author' ),
     424                                        'value' => wp_kses( $active_theme->Author, array() )
     425                                ),
     426                                array(
     427                                        'label' => __( 'Author website' ),
     428                                        'value' => ( $active_theme->offsetGet( 'Author URI' ) ?: __( 'Undefined' ) )
     429                                ),
     430                                array(
     431                                        'label' => __( 'Parent theme' ),
     432                                        'value' => ( $active_theme->parent_theme ?: __( 'Not a child theme' ) )
     433                                ),
     434                                array(
     435                                        'label' => __( 'Supported theme features' ),
     436                                        'value' => implode( ', ', $theme_features )
     437                                )
     438                        );
     439
     440                        // Populate a list of all themes available in the install.
     441                        $all_themes = wp_get_themes();
     442
     443                        foreach ( $all_themes AS $theme_slug => $theme ) {
     444                                // Ignore the currently active theme from the list of all themes.
     445                                if ( $active_theme->stylesheet == $theme_slug ) {
     446                                        continue;
     447                                }
     448
     449                                $info['wp-themes']['fields'][] = array(
     450                                        // translators: %1$s: Theme name. %2$s: Theme slug.
     451                                        'label' => sprintf( __( '%1$s (%2$s)' ), $theme->Name, $theme_slug ),
     452                                        // translators: %1$s Theme version number. %2$s: Theme author name.
     453                                        'value' => sprintf( __( 'version %1$s by %2$s ' ), $theme->Version, wp_kses( $theme->Author, array() ) )
     454                                );
     455                        }
     456
     457
     458                        /**
     459                         * Add or modify new debug sections.
     460                         *
     461                         * Plugin or themes may wish to introduce their own debug information without creating additional admin pages for this
     462                         * kind of information as it is rarely needed, they can then utilize this filter to introduce their own sections.
     463                         *
     464                         * This filter intentionally does not include the fields introduced by core as those should always be un-modified
     465                         * and reliable for support related scenarios, take note that the core fields will take priority if a filtered value
     466                         * is trying to use the same array keys.
     467                         *
     468                         * Array keys added by core are all prefixed with `wp-`, plugins and themes are encouraged to use their own slug as
     469                         * a prefix, both for consistency as well as avoiding key collisions.
     470                         *
     471                         * @since 4.9.0
     472                         *
     473                         * @param array $args {
     474                         *     The debug information to be added to the core information page.
     475                         *
     476                         *     @type string  $label        The title for this section of the debug output.
     477                         *     @type string  $description  Optional. A description for your information section which may contain basic HTML
     478                         *                                 markup: `em`, `strong` and `a` for linking to documentation or putting emphasis.
     479                         *     @type boolean $show_count   Optional. If set to `true` the amount of fields will be included in the title for
     480                         *                                 this section.
     481                         *     @type boolean $private      Optional. If set to `true` the section and all associated fields will be excluded
     482                         *                                 from the copy-paste text area.
     483                         *     @type array   $fields {
     484                         *         An associative array containing the data to be displayed.
     485                         *
     486                         *         @type string  $label    The label for this piece of information.
     487                         *         @type string  $value    The output that is of interest for this field.
     488                         *         @type boolean $private  Optional. If set to `true` the field will not be included in the copy-paste text area
     489                         *                                 on top of the page, allowing you to show, for example, API keys here.
     490                         *     }
     491                         * }
     492                         */
     493                        $external_info = apply_filters( 'debug_information', array() );
     494
     495                        // Merge the core and external debug fields.
     496                        $info = array_replace_recursive( $info, array_replace_recursive( $external_info, $info ) );
     497                        ?>
     498
     499
     500                        <div class="notice notice-info">
     501                                <p>
     502                                        <?php esc_html_e( 'The system information shown below can also be copied and pasted into support requests such as on the WordPress.org forums, or to your theme and plugin developers.' ); ?>
     503                                </p>
     504                                <p>
     505                                        <button type="button" class="button button-primary" onclick="document.getElementById('system-information-copy-wrapper').style.display = 'block'; this.style.display = 'none';"><?php esc_html_e( 'Show copy and paste field' ); ?></button>
     506                                </p>
     507
     508                                <div id="system-information-copy-wrapper" style="display: none;">
     509                                <textarea id="system-information-copy-field" class="widefat" rows="10">`
     510<?php
     511                                        foreach ( $info AS $section => $details ) {
     512                                                // Skip this section if there are no fields, or the section has been declared as private.
     513                                                if ( empty( $details['fields'] ) || ( isset( $details['private'] ) && $details['private'] ) ) {
     514                                                        continue;
     515                                                }
     516
     517                                                printf(
     518                                                        "### %s%s ###\n\n",
     519                                                        $details['label'],
     520                                                        ( isset( $details['show_count'] ) && $details['show_count'] ? sprintf( ' (%d)', count( $details['fields'] ) ) : '' )
     521                                                );
     522
     523                                                foreach ( $details['fields'] AS $field ) {
     524                                                        if ( isset( $field['private'] ) && true === $field['private'] ) {
     525                                                                continue;
     526                                                        }
     527
     528                                                        printf(
     529                                                                "%s: %s\n",
     530                                                                $field['label'],
     531                                                                $field['value']
     532                                                        );
     533                                                }
     534                                                echo "\n";
     535                                        }
     536?>
     537`</textarea>
     538                                        <p>
     539                                                <?php esc_html_e( 'Some information may be filtered out from the list you are about to copy, this is information that may be considers private, and is not meant to be shared in a public forum.' ); ?>
     540                                                <br>
     541                                                <button type="button" class="button button-primary" onclick="document.getElementById('system-information-copy-field').select();"><?php esc_html_e( 'Mark field for copying' ); ?></button>
     542                                        </p>
     543                                </div>
     544                        </div>
     545
     546                        <div id="system-information-table-of-contents">
     547                                <?php
     548                                $toc = array();
     549
     550                                foreach ( $info AS $section => $details ) {
     551                                        if ( empty( $details['fields'] ) ) {
     552                                                continue;
     553                                        }
     554
     555                                        $toc[] = sprintf(
     556                                                '<a href="#%s">%s</a>',
     557                                                esc_attr( $section ),
     558                                                esc_html( $details['label'] )
     559                                        );
     560                                }
     561
     562                                echo implode( ' | ', $toc );
     563                                ?>
     564                        </div>
     565
     566                        <?php
     567                        foreach ( $info AS $section => $details ) {
     568                                if ( ! isset( $details['fields'] ) || empty( $details['fields'] ) ) {
     569                                        continue;
     570                                }
     571
     572                                printf(
     573                                        '<h2 id="%s">%s%s</h2>',
     574                                        esc_attr( $section ),
     575                                        esc_html( $details['label'] ),
     576                                        ( isset( $details['show_count'] ) && $details['show_count'] ? sprintf( ' (%d)', count( $details['fields'] ) ) : '' )
     577                                );
     578
     579                                if ( isset( $details['description'] ) && ! empty( $details['description'] ) ) {
     580                                        printf(
     581                                                '<p>%s</p>',
     582                                                wp_kses( $details['description'], array(
     583                                                        'a'      => array(
     584                                                                'href' => true
     585                                                        ),
     586                                                        'strong' => true,
     587                                                        'em'     => true,
     588                                                ) )
     589                                        );
     590                                }
     591                                ?>
     592                                <table class="widefat striped">
     593                                        <tbody>
     594                                        <?php
     595                                        foreach ( $details['fields'] AS $field ) {
     596                                                printf(
     597                                                        '<tr><td>%s</td><td>%s</td></tr>',
     598                                                        esc_html( $field['label'] ),
     599                                                        esc_html( $field['value'] )
     600                                                );
     601                                        }
     602                                        ?>
     603                                        </tbody>
     604                                </table>
     605                                <span style="display: block; width: 100%; text-align: <?php echo ( is_rtl() ? 'left' : 'right' ); ?>">
     606                                        <a href="#system-information-table-of-contents"><?php esc_html_e( 'Return to table of contents' ); ?></a>
     607                                </span>
     608                                <?php
     609                        }
     610                } elseif( function_exists( 'phpinfo' ) ) {
     611                        ?>
     612
     613                        <div class="notice notice-warning">
     614                                <p>
     615                                        <?php esc_html_e( 'Some scenarios require you to look up more detailed server configurations than what is normally required. This page allows you to view all available configuration options for your PHP setup. Please be advised that WordPress does not guarantee that any information shown on this page may not be considered private.' ); ?>
     616                                </p>
     617                        </div>
     618
     619                        <?php
     620                        ob_start();
     621                        phpinfo();
     622                        $phpinfo_raw = ob_get_clean();
     623
     624                        // Extract the body of the `phpinfo()` call, to avoid all the styles they introduce.
     625                        preg_match_all("/<body[^>]*>(.*)<\/body>/siU", $phpinfo_raw, $phpinfo );
     626
     627                        // Extract the styles `phpinfo()` creates for this page.
     628                        preg_match_all( "/<style[^>]*>(.*)<\/style>/siU", $phpinfo_raw, $styles );
     629
     630                        // We remove various styles that break the visual flow of wp-admin.
     631                        $remove_patterns = array(
     632                                "/a:.+?\n/si",
     633                                "/body.+?\n/si"
     634                        );
     635
     636                        // Output the styles as an inline style block.
     637                        if( isset( $styles[1][0] ) ) {
     638                                $styles = preg_replace( $remove_patterns, "", $styles[1][0] );
     639                                echo '<style type="text/css">' . $styles . '</style>';
     640                        }
     641
     642                        // Output the actual phpinfo data.
     643                        if( isset( $phpinfo[1][0] ) ) {
     644                                echo $phpinfo[1][0];
     645                        }
     646
     647                } else {
     648                        ?>                             
     649
     650                        <div class="notice notice-warning">
     651                                <p>
     652                                        <?php esc_html_e( 'The phpinfo() function is disabled.' ); ?>
     653                                </p>
     654                        </div>
     655
     656                        <?php
     657                }
     658                        ?>
     659        </div>
     660
     661<?php
     662include( ABSPATH . 'wp-admin/admin-footer.php' );