Make WordPress Core

Ticket #39165: 39165.10.patch

File 39165.10.patch, 33.7 KB (added by Clorith, 7 years ago)
  • src/wp-admin/css/debug.css

     
     1body.info-php tbody td {
     2    width: 80%;
     3}
     4
     5body.info-php tbody td ul,
     6body.info-php tbody td ol {
     7    margin: 0;
     8}
     9
     10body.info-php thead th:first-child,
     11body.info-php tbody td:first-child {
     12    width: 20%;
     13}
     14
     15#wpfooter #footer-debug {
     16    margin-left: 10px;
     17}
     18 No newline at end of file
  • src/wp-admin/admin-footer.php

     
    4343                echo apply_filters( 'admin_footer_text', '<span id="footer-thankyou">' . $text . '</span>' );
    4444                ?>
    4545        </p>
     46    <p id="footer-debug" class="alignright">
     47                <?php
     48                printf(
     49                        '<a href="%s">%s</a>',
     50                        esc_url( admin_url( 'info.php' ) ),
     51                        __( 'Show debug info' )
     52                )
     53                ?>
     54    </p>
    4655        <p id="footer-upgrade" class="alignright">
    4756                <?php
    4857                /**
  • src/wp-includes/script-loader.php

     
    10571057        $styles->add( 'site-icon', "/wp-admin/css/site-icon$suffix.css" );
    10581058        $styles->add( 'l10n', "/wp-admin/css/l10n$suffix.css" );
    10591059        $styles->add( 'code-editor', "/wp-admin/css/code-editor$suffix.css", array( 'wp-codemirror' ) );
     1060        $styles->add( 'debug', "/wp-admin/css/debug$suffix.css" );
    10601061
    1061         $styles->add( 'wp-admin', false, array( 'dashicons', 'common', 'forms', 'admin-menu', 'dashboard', 'list-tables', 'edit', 'revisions', 'media', 'themes', 'about', 'nav-menus', 'widgets', 'site-icon', 'l10n' ) );
     1062        $styles->add( 'wp-admin', false, array( 'dashicons', 'common', 'forms', 'admin-menu', 'dashboard', 'list-tables', 'edit', 'revisions', 'media', 'themes', 'about', 'nav-menus', 'widgets', 'site-icon', 'l10n', 'debug' ) );
    10621063
    10631064        $styles->add( 'login', "/wp-admin/css/login$suffix.css", array( 'dashicons', 'buttons', 'forms', 'l10n' ) );
    10641065        $styles->add( 'install', "/wp-admin/css/install$suffix.css", array( 'buttons' ) );
  • src/wp-admin/info.php

     
     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                        global $wpdb;
     42
     43
     44                        $upload_dir = wp_upload_dir();
     45                        if ( file_exists( ABSPATH . 'wp-config.php') ) {
     46                                $wp_config_path = ABSPATH . 'wp-config.php';
     47                        } else if ( @file_exists( dirname( ABSPATH ) . '/wp-config.php' ) && ! @file_exists( dirname( ABSPATH ) . '/wp-settings.php' ) ) {
     48                                $wp_config_path = dirname( ABSPATH ) . '/wp-config.php';
     49                        }
     50
     51                        $info = array(
     52                                'wp-core'             => array(
     53                                        'label'  => __( 'WordPress' ),
     54                                        'fields' => array(
     55                                                array(
     56                                                        'label' => __( 'Version' ),
     57                                                        'value' => get_bloginfo( 'version' )
     58                                                ),
     59                                                array(
     60                                                        'label' => __( 'Language' ),
     61                                                        'value' => ( ! empty( $locale ) ? $original_locale : get_locale() )
     62                                                ),
     63                                                array(
     64                                                        'label'   => __( 'Home URL' ),
     65                                                        'value'   => get_bloginfo( 'url' ),
     66                                                        'private' => true
     67                                                ),
     68                                                array(
     69                                                        'label'   => __( 'Site URL' ),
     70                                                        'value'   => get_bloginfo( 'wpurl' ),
     71                                                        'private' => true
     72                                                ),
     73                                                array(
     74                                                        'label' => __( 'Permalink structure' ),
     75                                                        'value' => get_option( 'permalink_structure' )
     76                                                ),
     77                                                array(
     78                                                        'label' => __( 'Is this site using HTTPS?' ),
     79                                                        'value' => ( is_ssl() ? __( 'Yes' ) : __( 'No' ) )
     80                                                ),
     81                                                array(
     82                                                        'label' => __( 'Can anyone register on this site?' ),
     83                                                        'value' => ( get_option( 'users_can_register' ) ? __( 'Yes' ) : __( 'No' ) )
     84                                                ),
     85                                                array(
     86                                                        'label' => __( 'Default comment status' ),
     87                                                        'value' => get_option( 'default_comment_status' )
     88                                                ),
     89                                                array(
     90                                                        'label' => __( 'Is this a multisite?' ),
     91                                                        'value' => ( is_multisite() ? __( 'Yes' ) : __( 'No' ) )
     92                                                )
     93                                        ),
     94                                ),
     95                                'wp-dropins'          => array(
     96                                        'label'       => __( 'Drop-ins' ),
     97                                        'description' => __( 'Drop-ins are single files that replace or enhance WordPress features in ways that are not possible for traditional plugins' ),
     98                                        'fields'      => array()
     99                                ),
     100                                'wp-active-theme'     => array(
     101                                        'label'  => __( 'Active theme' ),
     102                                        'fields' => array()
     103                                ),
     104                                'wp-themes'           => array(
     105                                        'label'      => __( 'Other themes' ),
     106                                        'show_count' => true,
     107                                        'fields'     => array()
     108                                ),
     109                                'wp-mu-plugins'       => array(
     110                                        'label'      => __( 'Must Use Plugins' ),
     111                                        'show_count' => true,
     112                                        'fields'     => array()
     113                                ),
     114                                'wp-plugins-active'   => array(
     115                                        'label'      => __( 'Active Plugins' ),
     116                                        'show_count' => true,
     117                                        'fields'     => array()
     118                                ),
     119                                'wp-plugins-inactive' => array(
     120                                        'label'      => __( 'Inactive Plugins' ),
     121                                        'show_count' => true,
     122                                        'fields'     => array()
     123                                ),
     124                                'wp-media'            => array(
     125                                        'label'  => __( 'Media handling' ),
     126                                        'fields' => array()
     127                                ),
     128                                'wp-server'           => array(
     129                                        'label'       => __( 'Server' ),
     130                                        'description' => __( 'The options shown below relate to your server setup. If changes are required, you may need your web host\'s assistance.' ),
     131                                        'fields'      => array()
     132                                ),
     133                                'wp-database'         => array(
     134                                        'label'  => __( 'Database' ),
     135                                        'fields' => array()
     136                                ),
     137                                'wp-constants'        => array(
     138                                        'label'       => __( 'WordPress constants' ),
     139                                        '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.' ),
     140                                        'fields'      => array(
     141                                                array(
     142                                                        'label' => 'ABSPATH',
     143                                                        'value' => ( ! defined( 'ABSPATH' ) ? __( 'Undefined' ) : ABSPATH )
     144                                                ),
     145                                                array(
     146                                                        'label' => 'WP_HOME',
     147                                                        'value' => ( ! defined( 'WP_HOME' ) ? __( 'Undefined' ) : WP_HOME )
     148                                                ),
     149                                                array(
     150                                                        'label' => 'WP_SITEURL',
     151                                                        'value' => ( ! defined( 'WP_SITEURL' ) ? __( 'Undefined' ) : WP_SITEURL )
     152                                                ),
     153                                                array(
     154                                                        'label' => 'WP_DEBUG',
     155                                                        'value' => ( ! defined( 'WP_DEBUG' ) ? __( 'Undefined' ) : ( WP_DEBUG ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     156                                                ),
     157                                                array(
     158                                                        'label' => 'WP_MAX_MEMORY_LIMIT',
     159                                                        'value' => ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ? __( 'Undefined' ) : WP_MAX_MEMORY_LIMIT )
     160                                                ),
     161                                                array(
     162                                                        'label' => 'WP_DEBUG_DISPLAY',
     163                                                        'value' => ( ! defined( 'WP_DEBUG_DISPLAY' ) ? __( 'Undefined' ) : ( WP_DEBUG_DISPLAY ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     164                                                ),
     165                                                array(
     166                                                        'label' => 'WP_DEBUG_LOG',
     167                                                        'value' => ( ! defined( 'WP_DEBUG_LOG' ) ? __( 'Undefined' ) : ( WP_DEBUG_LOG ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     168                                                ),
     169                                                array(
     170                                                        'label' => 'SCRIPT_DEBUG',
     171                                                        'value' => ( ! defined( 'SCRIPT_DEBUG' ) ? __( 'Undefined' ) : ( SCRIPT_DEBUG ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     172                                                ),
     173                                                array(
     174                                                        'label' => 'WP_CACHE',
     175                                                        'value' => ( ! defined( 'WP_CACHE' ) ? __( 'Undefined' ) : ( WP_CACHE ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     176                                                ),
     177                                                array(
     178                                                        'label' => 'CONCATENATE_SCRIPTS',
     179                                                        'value' => ( ! defined( 'CONCATENATE_SCRIPTS' ) ? __( 'Undefined' ) : ( CONCATENATE_SCRIPTS ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     180                                                ),
     181                                                array(
     182                                                        'label' => 'COMPRESS_SCRIPTS',
     183                                                        'value' => ( ! defined( 'COMPRESS_SCRIPTS' ) ? __( 'Undefined' ) : ( COMPRESS_SCRIPTS ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     184                                                ),
     185                                                array(
     186                                                        'label' => 'COMPRESS_CSS',
     187                                                        'value' => ( ! defined( 'COMPRESS_CSS' ) ? __( 'Undefined' ) : ( COMPRESS_CSS ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     188                                                ),
     189                                                array(
     190                                                        'label' => 'WP_LOCAL_DEV',
     191                                                        'value' => ( ! defined( 'WP_LOCAL_DEV' ) ? __( 'Undefined' ) : ( WP_LOCAL_DEV ? __( 'Enabled' ) : __( 'Disabled' ) ) )
     192                                                )
     193                                        )
     194                                ),
     195                                'wp-filesystem' => array(
     196                                        'label'       => __( 'Filesystem permissions' ),
     197                                        'description' => __( 'The status of various locations WordPress needs to write files in various scenarios.' ),
     198                                        'fields'      => array(
     199                                                array(
     200                                                        'label' => __( 'The main WordPress directory' ),
     201                                                        'value' => ( wp_is_writable( ABSPATH ) ? __( 'Writable' ) : __( 'Not writable' ) )
     202                                                ),
     203                                                array(
     204                                                        'label' => __( 'The wp-content directory' ),
     205                                                        'value' => ( wp_is_writable( WP_CONTENT_DIR ) ? __( 'Writable' ) : __( 'Not writable' ) )
     206                                                ),
     207                                                array(
     208                                                        'label' => __( 'The uploads directory' ),
     209                                                        'value' => ( wp_is_writable( $upload_dir['basedir'] ) ? __( 'Writable' ) : __( 'Not writable' ) )
     210                                                ),
     211                                                array(
     212                                                        'label' => __( 'The plugins directory' ),
     213                                                        'value' => ( wp_is_writable( WP_PLUGIN_DIR ) ? __( 'Writable' ) : __( 'Not writable' ) )
     214                                                ),
     215                                                array(
     216                                                        'label' => __( 'The themes directory' ),
     217                                                        'value' => ( wp_is_writable( get_template_directory() . '/..' ) ? __( 'Writable' ) : __( 'Not writable' ) )
     218                                                )
     219                                        )
     220                                ),
     221                        );
     222
     223
     224
     225                        if ( is_multisite() ) {
     226                                $network_query = new WP_Network_Query();
     227                                $network_ids   = $network_query->query( array(
     228                                        'fields'        => 'ids',
     229                                        'number'        => 100,
     230                                        'no_found_rows' => false,
     231                                ) );
     232
     233                                $site_count = 0;
     234                                foreach ( $network_ids AS $network_id ) {
     235                                        $site_count += get_blog_count( $network_id );
     236                                }
     237
     238                                $info['wp-core']['fields'][] = array(
     239                                        'label' => __( 'User Count' ),
     240                                        'value' => get_user_count()
     241                                );
     242                                $info['wp-core']['fields'][] = array(
     243                                        'label' => __( 'Site Count' ),
     244                                        'value' => $site_count
     245                                );
     246                                $info['wp-core']['fields'][] = array(
     247                                        'label' => __( 'Network Count' ),
     248                                        'value' => $network_query->found_networks
     249                                );
     250                        } else {
     251                                $user_count = count_users();
     252
     253                                $info['wp-core']['fields'][] = array(
     254                                        'label' => __( 'User Count' ),
     255                                        'value' => $user_count['total_users']
     256                                );
     257                        }
     258
     259                        // WordPress features requiring processing.
     260                        $wp_dotorg = wp_remote_get( 'https://wordpress.org', array( 'timeout' => 10 ) );
     261                        if ( ! is_wp_error( $wp_dotorg ) ) {
     262                                $info['wp-core']['fields'][] = array(
     263                                        'label' => __( 'Communication with WordPress.org' ),
     264                                        'value' => sprintf(
     265                                                __( 'WordPress.org is reachable' )
     266                                        )
     267                                );
     268                        } else {
     269                                $info['wp-core']['fields'][] = array(
     270                                        'label' => __( 'Communication with WordPress.org' ),
     271                                        'value' => sprintf(
     272                                        // translators: %1$s: The IP address WordPress.org resolves to. %2$s: The error returned by the lookup.
     273                                                __( 'Unable to reach WordPress.org at %1$s: %2$s' ),
     274                                                gethostbyname( 'wordpress.org' ),
     275                                                $wp_dotorg->get_error_message()
     276                                        )
     277                                );
     278                        }
     279
     280                        $loopback = Health_Check_Loopback::can_perform_loopback();
     281                        $info['wp-core']['fields'][] = array(
     282                                'label' => __( 'Create loopback requests' ),
     283                                'value' => $loopback->message
     284                        );
     285
     286                        // Get drop-ins.
     287                        $dropins            = get_dropins();
     288                        $dropin_description = _get_dropins();
     289                        foreach ( $dropins AS $dropin_key => $dropin ) {
     290                                $info['wp-dropins']['fields'][] = array(
     291                                        'label' => $dropin_key,
     292                                        'value' => $dropin_description[ $dropin_key ][0]
     293                                );
     294                        }
     295
     296                        // Populate the media fields.
     297                        $info['wp-media']['fields'][] = array(
     298                                'label' => __( 'Active editor' ),
     299                                'value' => _wp_image_editor_choose()
     300                        );
     301
     302                        // Get ImageMagic information, if available.
     303                        if ( class_exists( 'Imagick' ) ) {
     304                                // Save the Imagick instance for later use.
     305                                $imagick = new Imagick();
     306                                $imagick_version = $imagick->getVersion();
     307                        } else {
     308                                $imagick_version = 'Imagick not available';
     309                        }
     310                        $info['wp-media']['fields'][] = array(
     311                                'label' => __( 'Imagick Module Version' ),
     312                                'value' => ( is_array( $imagick_version ) ? $imagick_version['versionNumber'] : $imagick_version )
     313                        );
     314                        $info['wp-media']['fields'][] = array(
     315                                'label' => __( 'ImageMagick Version' ),
     316                                'value' => ( is_array( $imagick_version )  ? $imagick_version['versionString'] : $imagick_version )
     317                        );
     318
     319                        // If Imagick is used as our editor, provide some more information about its limitations.
     320                        if ( 'WP_Image_Editor_Imagick' === _wp_image_editor_choose() && isset( $imagick ) && $imagick instanceof Imagick ) {
     321                                $limits = array(
     322                                        'area'   => ( defined( 'imagick::RESOURCETYPE_AREA' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_AREA ) ) : 'Not Available' ),
     323                                        'disk'   => ( defined( 'imagick::RESOURCETYPE_DISK' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_DISK ) : 'Not Available' ),
     324                                        'file'   => ( defined( 'imagick::RESOURCETYPE_FILE' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_FILE ) : 'Not Available' ),
     325                                        'map'    => ( defined( 'imagick::RESOURCETYPE_MAP' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MAP ) ) : 'Not Available' ),
     326                                        'memory' => ( defined( 'imagick::RESOURCETYPE_MEMORY' ) ? size_format( $imagick->getResourceLimit( imagick::RESOURCETYPE_MEMORY ) ) : 'Not Available' ),
     327                                        'thread' => ( defined( 'imagick::RESOURCETYPE_THREAD' ) ? $imagick->getResourceLimit( imagick::RESOURCETYPE_THREAD ) : 'Not Available' )
     328                                );
     329
     330                                $info['wp-media']['fields'][] = array(
     331                                        'label' => __( 'Imagick Resource Limits' ),
     332                                        'value' => $limits
     333                                );
     334                        }
     335
     336                        // Get GD information, if available.
     337                        if ( function_exists( 'gd_info' ) ) {
     338                                $gd = gd_info();
     339                        }
     340                        else {
     341                                $gd = false;
     342                        }
     343                        $info['wp-media']['fields'][] = array(
     344                                'label' => __( 'GD Version' ),
     345                                'value' => ( is_array( $gd ) ? $gd['GD Version'] : 'GD not available' )
     346                        );
     347
     348                        // Get Ghostscript information, if available.
     349                        if ( function_exists( 'exec' ) ) {
     350                                $gs = exec( 'gs --version' );
     351                                $gs = ( ! empty( $gs ) ? $gs : 'Not available' );
     352                        }
     353                        else {
     354                                $gs = __( 'Unable to determine if Ghostscript is installed' );
     355                        }
     356                        $info['wp-media']['fields'][] = array(
     357                                'label' => __( 'Ghostscript Version' ),
     358                                'value' => $gs
     359                        );
     360
     361                        // Populate the server debug fields.
     362                        $info['wp-server']['fields'][] = array(
     363                                'label' => __( 'Server architecture' ),
     364                                'value' => ( ! function_exists( 'php_uname' ) ? __( 'Unable to determine server architecture' ) : sprintf( '%s %s %s', php_uname( 's' ), php_uname( 'r' ), php_uname( 'm' ) ) )
     365                        );
     366                        $info['wp-server']['fields'][] = array(
     367                                'label' => __( 'PHP Version' ),
     368                                'value' => ( ! function_exists( 'phpversion' ) ? __( 'Unable to determine PHP version' ) : sprintf(
     369                                        '%s %s',
     370                                        phpversion(),
     371                                        ( 64 === PHP_INT_SIZE * 8 ? __( '(Supports 64bit values)' ) : '' )
     372                                )
     373                                )
     374                        );
     375                        $info['wp-server']['fields'][] = array(
     376                                'label' => __( 'PHP SAPI' ),
     377                                'value' => ( ! function_exists( 'php_sapi_name' ) ? __( 'Unable to determine PHP SAPI' ) : php_sapi_name() )
     378                        );
     379
     380                        if ( ! function_exists( 'ini_get' ) ) {
     381                                $info['wp-server']['fields'][] = array(
     382                                        'label' => __( 'Server settings' ),
     383                                        'value' => __( 'Unable to determine some settings as the ini_get() function has been disabled' )
     384                                );
     385                        } else {
     386                                $info['wp-server']['fields'][] = array(
     387                                        'label' => __( 'PHP max input variables' ),
     388                                        'value' => ini_get( 'max_input_vars' )
     389                                );
     390                                $info['wp-server']['fields'][] = array(
     391                                        'label' => __( 'PHP time limit' ),
     392                                        'value' => ini_get( 'max_execution_time' )
     393                                );
     394                                $info['wp-server']['fields'][] = array(
     395                                        'label' => __( 'PHP memory limit' ),
     396                                        'value' => ini_get( 'memory_limit' )
     397                                );
     398                                $info['wp-server']['fields'][] = array(
     399                                        'label' => __( 'Max input time' ),
     400                                        'value' => ini_get( 'max_input_time' )
     401                                );
     402                                $info['wp-server']['fields'][] = array(
     403                                        'label' => __( 'Upload max filesize' ),
     404                                        'value' => ini_get( 'upload_max_filesize' )
     405                                );
     406                                $info['wp-server']['fields'][] = array(
     407                                        'label' => __( 'PHP post max size' ),
     408                                        'value' => ini_get( 'post_max_size' )
     409                                );
     410                        }
     411
     412                        if ( function_exists( 'curl_version' ) ) {
     413                                $cURL                          = curl_version();
     414                                $info['wp-server']['fields'][] = array(
     415                                        'label' => __( 'cURL Version' ),
     416                                        'value' => sprintf( '%s %s', $cURL['version'], $cURL['ssl_version'] )
     417                                );
     418                        } else {
     419                                $info['wp-server']['fields'][] = array(
     420                                        'label' => __( 'cURL Version' ),
     421                                        'value' => __( 'Your server does not support cURL' )
     422                                );
     423                        }
     424
     425                        $info['wp-server']['fields'][] = array(
     426                                'label' => __( 'SUHOSIN installed' ),
     427                                'value' => ( ( extension_loaded( 'suhosin' ) || ( defined( 'SUHOSIN_PATCH' ) && constant( 'SUHOSIN_PATCH' ) ) ) ? __( 'Yes' ) : __( 'No' ) )
     428                        );
     429
     430                        $info['wp-server']['fields'][] = array(
     431                                'label' => __( 'Is the Imagick library available' ),
     432                                'value' => ( extension_loaded( 'imagick' ) ? __( 'Yes' ) : __( 'No' ) )
     433                        );
     434
     435
     436                        // Populate the database debug fields.
     437                        if ( is_resource( $wpdb->dbh ) ) {
     438                                // Old mysql extension.
     439                                $extension = 'mysql';
     440                        } else if ( is_object( $wpdb->dbh ) ) {
     441                                // mysqli or PDO.
     442                                $extension = get_class( $wpdb->dbh );
     443                        } else {
     444                                // Unknown sql extension.
     445                                $extension = null;
     446                        }
     447
     448                        if ( method_exists( $wpdb, 'db_version' ) ) {
     449                                if ( $wpdb->use_mysqli ) {
     450                                        $server = mysqli_get_server_info( $wpdb->dbh );
     451                                } else {
     452                                        $server = mysql_get_server_info( $wpdb->dbh );
     453                                }
     454                        } else {
     455                                $server = null;
     456                        }
     457
     458                        if ( isset( $wpdb->use_mysqli ) && $wpdb->use_mysqli ) {
     459                                $client_version = $wpdb->dbh->client_info;
     460                        } else {
     461                                if ( preg_match( '|[0-9]{1,2}\.[0-9]{1,2}\.[0-9]{1,2}|', mysql_get_client_info(), $matches ) ) {
     462                                        $client_version = $matches[0];
     463                                } else {
     464                                        $client_version = null;
     465                                }
     466                        }
     467
     468                        $info['wp-database']['fields'][] = array(
     469                                'label' => __( 'Extension' ),
     470                                'value' => $extension
     471                        );
     472                        $info['wp-database']['fields'][] = array(
     473                                'label' => __( 'Server version' ),
     474                                'value' => $server
     475                        );
     476                        $info['wp-database']['fields'][] = array(
     477                                'label' => __( 'Client version' ),
     478                                'value' => $client_version
     479                        );
     480                        $info['wp-database']['fields'][] = array(
     481                                'label'   => __( 'Database user' ),
     482                                'value'   => $wpdb->dbuser,
     483                                'private' => true
     484                        );
     485                        $info['wp-database']['fields'][] = array(
     486                                'label'   => __( 'Database host' ),
     487                                'value'   => $wpdb->dbhost,
     488                                'private' => true
     489                        );
     490                        $info['wp-database']['fields'][] = array(
     491                                'label'   => __( 'Database name' ),
     492                                'value'   => $wpdb->dbname,
     493                                'private' => true
     494                        );
     495                        $info['wp-database']['fields'][] = array(
     496                                'label' => __( 'Database prefix' ),
     497                                'value' => $wpdb->prefix
     498                        );
     499
     500
     501                        // List must use plugins if there are any.
     502                        $mu_plugins = get_mu_plugins();
     503
     504                        foreach ( $mu_plugins AS $plugin_path => $plugin ) {
     505                                $plugin_version = $plugin['Version'];
     506                                $plugin_author = $plugin['Author'];
     507
     508                                $plugin_version_string = __( 'No version or author information available' );
     509
     510                                if ( ! empty( $plugin_version ) && ! empty( $plugin_author ) ) {
     511                                        // translators: %1$s: Plugin version number. %2$s: Plugin author name.
     512                                        $plugin_version_string = sprintf( __( 'Version %1$s by %2$s' ), $plugin_version, $plugin_author );
     513                                }
     514                                if ( empty( $plugin_version ) && ! empty( $plugin_author ) ) {
     515                                        // translators: %s: Plugin author name.
     516                                        $plugin_version_string = sprintf( __( 'By %s' ), $plugin_author );
     517                                }
     518                                if ( ! empty( $plugin_version ) && empty( $plugin_author ) ) {
     519                                        // translators: %s: Plugin version number.
     520                                        $plugin_version_string = sprintf( __( 'Version %s' ), $plugin_version );
     521                                }
     522
     523                                $info['wp-mu-plugins']['fields'][] = array(
     524                                        'label' => $plugin['Name'],
     525                                        'value' => $plugin_version_string
     526                                );
     527                        }
     528
     529
     530                        // List all available plugins.
     531                        $plugins = get_plugins();
     532
     533                        foreach ( $plugins AS $plugin_path => $plugin ) {
     534                                $plugin_part = ( is_plugin_active( $plugin_path ) ) ? 'wp-plugins-active' : 'wp-plugins-inactive';
     535
     536                                $plugin_version = $plugin['Version'];
     537                                $plugin_author = $plugin['Author'];
     538
     539                                $plugin_version_string = __( 'No version or author information available' );
     540
     541                                if ( ! empty( $plugin_version ) && ! empty( $plugin_author ) ) {
     542                                        // translators: %1$s: Plugin version number. %2$s: Plugin author name.
     543                                        $plugin_version_string = sprintf( __( 'Version %1$s by %2$s' ), $plugin_version, $plugin_author );
     544                                }
     545                                if ( empty( $plugin_version ) && ! empty( $plugin_author ) ) {
     546                                        // translators: %s: Plugin author name.
     547                                        $plugin_version_string = sprintf( __( 'By %s' ), $plugin_author );
     548                                }
     549                                if ( ! empty( $plugin_version ) && empty( $plugin_author ) ) {
     550                                        // translators: %s: Plugin version number.
     551                                        $plugin_version_string = sprintf( __( 'Version %s' ), $plugin_version );
     552                                }
     553
     554
     555                                $info[ $plugin_part ]['fields'][] = array(
     556                                        'label' => $plugin['Name'],
     557                                        'value' => $plugin_version_string
     558                                );
     559                        }
     560
     561
     562                        // Populate the section for the currently active theme.
     563                        global $_wp_theme_features;
     564                        $theme_features = array();
     565                        if ( ! empty( $_wp_theme_features ) ) {
     566                                foreach ( $_wp_theme_features AS $feature => $options ) {
     567                                        $theme_features[] = $feature;
     568                                }
     569                        }
     570
     571                        $active_theme                      = wp_get_theme();
     572                        $info['wp-active-theme']['fields'] = array(
     573                                array(
     574                                        'label' => __( 'Name' ),
     575                                        'value' => $active_theme->Name
     576                                ),
     577                                array(
     578                                        'label' => __( 'Version' ),
     579                                        'value' => $active_theme->Version
     580                                ),
     581                                array(
     582                                        'label' => __( 'Author' ),
     583                                        'value' => wp_kses( $active_theme->Author, array() )
     584                                ),
     585                                array(
     586                                        'label' => __( 'Author website' ),
     587                                        'value' => ( $active_theme->offsetGet( 'Author URI' ) ? $active_theme->offsetGet( 'Author URI' ) : __( 'Undefined' ) )
     588                                ),
     589                                array(
     590                                        'label' => __( 'Parent theme' ),
     591                                        'value' => ( $active_theme->parent_theme ? $active_theme->parent_theme : __( 'Not a child theme' ) )
     592                                ),
     593                                array(
     594                                        'label' => __( 'Supported theme features' ),
     595                                        'value' => implode( ', ', $theme_features )
     596                                )
     597                        );
     598
     599                        // Populate a list of all themes available in the install.
     600                        $all_themes = wp_get_themes();
     601
     602                        foreach ( $all_themes AS $theme_slug => $theme ) {
     603                                // Ignore the currently active theme from the list of all themes.
     604                                if ( $active_theme->stylesheet == $theme_slug ) {
     605                                        continue;
     606                                }
     607
     608                                $theme_version = $theme->Version;
     609                                $theme_author = $theme->Author;
     610
     611                                $theme_version_string = __( 'No version or author information available' );
     612
     613                                if ( ! empty( $theme_version ) && ! empty( $theme_author ) ) {
     614                                        // translators: %1$s: Theme version number. %2$s: Theme author name.
     615                                        $theme_version_string = sprintf( __( 'Version %1$s by %2$s' ), $theme_version, wp_kses( $theme_author, array() ) );
     616                                }
     617                                if ( empty( $theme_version ) && ! empty( $theme_author ) ) {
     618                                        // translators: %s: Theme author name.
     619                                        $theme_version_string = sprintf( __( 'By %s' ), wp_kses( $theme_author, array() ) );
     620                                }
     621                                if ( ! empty( $theme_version ) && empty( $theme_author ) ) {
     622                                        // translators: %s: Theme version number.
     623                                        $theme_version_string = sprintf( __( 'Version %s' ), $theme_version );
     624                                }
     625
     626
     627                                $info['wp-themes']['fields'][] = array(
     628                                        // translators: %1$s: Theme name. %2$s: Theme slug.
     629                                        'label' => sprintf( __( '%1$s (%2$s)' ), $theme->Name, $theme_slug ),
     630                                        'value' => $theme_version_string
     631                                );
     632                        }
     633
     634                        // Add more filesystem checks
     635                        if ( defined( 'WPMU_PLUGIN_DIR' ) && is_dir( WPMU_PLUGIN_DIR ) ) {
     636                                $info['wp-filesystem']['fields'][] = array(
     637                                        'label' => __( 'The Must Use Plugins directory' ),
     638                                        'value' => ( wp_is_writable( WPMU_PLUGIN_DIR ) ? __( 'Writable' ) : __( 'Not writable' ) )
     639                                );
     640                        }
     641
     642
     643                        /**
     644                         * Add or modify new debug sections.
     645                         *
     646                         * Plugin or themes may wish to introduce their own debug information without creating additional admin pages for this
     647                         * kind of information as it is rarely needed, they can then utilize this filter to introduce their own sections.
     648                         *
     649                         * This filter intentionally does not include the fields introduced by core as those should always be un-modified
     650                         * and reliable for support related scenarios, take note that the core fields will take priority if a filtered value
     651                         * is trying to use the same array keys.
     652                         *
     653                         * Array keys added by core are all prefixed with `wp-`, plugins and themes are encouraged to use their own slug as
     654                         * a prefix, both for consistency as well as avoiding key collisions.
     655                         *
     656                         * @since 5.0.0
     657                         *
     658                         * @param array $args {
     659                         *     The debug information to be added to the core information page.
     660                         *
     661                         *     @type string  $label        The title for this section of the debug output.
     662                         *     @type string  $description  Optional. A description for your information section which may contain basic HTML
     663                         *                                 markup: `em`, `strong` and `a` for linking to documentation or putting emphasis.
     664                         *     @type boolean $show_count   Optional. If set to `true` the amount of fields will be included in the title for
     665                         *                                 this section.
     666                         *     @type boolean $private      Optional. If set to `true` the section and all associated fields will be excluded
     667                         *                                 from the copy-paste text area.
     668                         *     @type array   $fields {
     669                         *         An associative array containing the data to be displayed.
     670                         *
     671                         *         @type string  $label    The label for this piece of information.
     672                         *         @type string  $value    The output that is of interest for this field.
     673                         *         @type boolean $private  Optional. If set to `true` the field will not be included in the copy-paste text area
     674                         *                                 on top of the page, allowing you to show, for example, API keys here.
     675                         *     }
     676                         * }
     677                         */
     678                        $external_info = apply_filters( 'debug_information', array() );
     679
     680                        // Merge the core and external debug fields.
     681                        $info = array_replace_recursive( $info, array_replace_recursive( $external_info, $info ) );
     682                        ?>
     683
     684
     685                        <div class="notice notice-info">
     686                                <p>
     687                                        <?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.' ); ?>
     688                                </p>
     689                                <p>
     690                                        <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>
     691                                </p>
     692
     693                                <div id="system-information-copy-wrapper" style="display: none;">
     694                                <textarea id="system-information-copy-field" class="widefat" rows="10">`
     695<?php
     696                                        foreach ( $info AS $section => $details ) {
     697                                                // Skip this section if there are no fields, or the section has been declared as private.
     698                                                if ( empty( $details['fields'] ) || ( isset( $details['private'] ) && $details['private'] ) ) {
     699                                                        continue;
     700                                                }
     701
     702                                                printf(
     703                                                        "### %s%s ###\n\n",
     704                                                        $details['label'],
     705                                                        ( isset( $details['show_count'] ) && $details['show_count'] ? sprintf( ' (%d)', count( $details['fields'] ) ) : '' )
     706                                                );
     707
     708                                                foreach ( $details['fields'] AS $field ) {
     709                                                        if ( isset( $field['private'] ) && true === $field['private'] ) {
     710                                                                continue;
     711                                                        }
     712
     713                                                        printf(
     714                                                                "%s: %s\n",
     715                                                                $field['label'],
     716                                                                $field['value']
     717                                                        );
     718                                                }
     719                                                echo "\n";
     720                                        }
     721?>
     722`</textarea>
     723                                        <p>
     724                                                <?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.' ); ?>
     725                                                <br>
     726                                                <button type="button" class="button button-primary" onclick="document.getElementById('system-information-copy-field').select(); document.execCommand( 'copy' );"><?php esc_html_e( 'Copy' ); ?></button>
     727                                        </p>
     728                                </div>
     729                        </div>
     730
     731                        <div id="system-information-table-of-contents">
     732                                <?php
     733                                $toc = array();
     734
     735                                foreach ( $info AS $section => $details ) {
     736                                        if ( empty( $details['fields'] ) ) {
     737                                                continue;
     738                                        }
     739
     740                                        $toc[] = sprintf(
     741                                                '<a href="#%s" class="debug-toc">%s</a>',
     742                                                esc_attr( $section ),
     743                                                esc_html( $details['label'] )
     744                                        );
     745                                }
     746
     747                                echo implode( ' | ', $toc );
     748                                ?>
     749                        </div>
     750
     751                        <?php
     752                        foreach ( $info AS $section => $details ) {
     753                                if ( ! isset( $details['fields'] ) || empty( $details['fields'] ) ) {
     754                                        continue;
     755                                }
     756
     757                                printf(
     758                                        '<h2 id="%s">%s%s</h2>',
     759                                        esc_attr( $section ),
     760                                        esc_html( $details['label'] ),
     761                                        ( isset( $details['show_count'] ) && $details['show_count'] ? sprintf( ' (%d)', count( $details['fields'] ) ) : '' )
     762                                );
     763
     764                                if ( isset( $details['description'] ) && ! empty( $details['description'] ) ) {
     765                                        printf(
     766                                                '<p>%s</p>',
     767                                                wp_kses( $details['description'], array(
     768                                                        'a'      => array(
     769                                                                'href' => true
     770                                                        ),
     771                                                        'strong' => true,
     772                                                        'em'     => true,
     773                                                ) )
     774                                        );
     775                                }
     776                                ?>
     777                                <table class="widefat striped">
     778                                        <tbody>
     779                                        <?php
     780                                        foreach ( $details['fields'] AS $field ) {
     781                                                printf(
     782                                                        '<tr><td>%s</td><td>%s</td></tr>',
     783                                                        esc_html( $field['label'] ),
     784                                                        esc_html( $field['value'] )
     785                                                );
     786                                        }
     787                                        ?>
     788                                        </tbody>
     789                                </table>
     790                                <span style="display: block; width: 100%; text-align: <?php echo ( is_rtl() ? 'left' : 'right' ); ?>">
     791                                        <a href="#system-information-table-of-contents" class="debug-toc"><?php esc_html_e( 'Return to table of contents' ); ?></a>
     792                                </span>
     793                                <?php
     794                        }
     795                } else {
     796                        if ( ! function_exists( 'phpinfo' ) ) {
     797                        ?>
     798
     799                                <div class="notice notice-error">
     800                                        <p>
     801                                                <?php esc_html_e( 'The phpinfo() function has been disabled by your host. Please contact the host if you need more information about your setup.' ); ?>
     802                                        </p>
     803                                </div>
     804
     805                        <?php } else { ?>
     806
     807                                <div class="notice notice-warning">
     808                                        <p>
     809                                                <?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.' ); ?>
     810                                        </p>
     811                                </div>
     812
     813                                <?php
     814                                ob_start();
     815                                phpinfo();
     816                                $phpinfo_raw = ob_get_clean();
     817
     818                                // Extract the body of the `phpinfo()` call, to avoid all the styles they introduce.
     819                                preg_match_all("/<body[^>]*>(.*)<\/body>/siU", $phpinfo_raw, $phpinfo );
     820
     821                                // Extract the styles `phpinfo()` creates for this page.
     822                                preg_match_all( "/<style[^>]*>(.*)<\/style>/siU", $phpinfo_raw, $styles );
     823
     824                                // We remove various styles that break the visual flow of wp-admin.
     825                                $remove_patterns = array(
     826                                        "/a:.+?\n/si",
     827                                        "/body.+?\n/si"
     828                                );
     829
     830                                // Output the styles as an inline style block.
     831                                if ( isset( $styles[1][0] ) ) {
     832                                        $styles = preg_replace( $remove_patterns, "", $styles[1][0] );
     833
     834                                        echo '<style type="text/css">' . $styles . '</style>';
     835                                }
     836
     837                                // Output the actual phpinfo data.
     838                                if ( isset( $phpinfo[1][0] ) ) {
     839                                        echo $phpinfo[1][0];
     840                                }
     841                                ?>
     842
     843                        <?php } ?>
     844
     845                <?php } ?>
     846        </div>
     847
     848<script type="text/javascript">
     849    jQuery(document).ready(function( $ ) {
     850        $(".debug-toc").click(function (e) {
     851            e.preventDefault();
     852
     853            // Remove the height of the admin bar, and an extra 10px for better positioning.
     854            var offset = $( $(this).attr('href') ).offset().top - $("#wpadminbar").height() - 10;
     855
     856            $('html, body').animate({
     857                scrollTop: offset
     858            }, 1200);
     859        });
     860    });
     861</script>
     862
     863<?php
     864include( ABSPATH . 'wp-admin/admin-footer.php' );