[ Index ]

PHP Cross Reference of WordPress

title

Body

[close]

/wp-admin/ -> setup-config.php (source)

   1  <?php
   2  /**
   3   * Retrieves and creates the wp-config.php file.
   4   *
   5   * The permissions for the base directory must allow for writing files in order
   6   * for the wp-config.php to be created using this page.
   7   *
   8   * @package WordPress
   9   * @subpackage Administration
  10   */
  11  
  12  /**
  13   * We are installing.
  14   */
  15  define( 'WP_INSTALLING', true );
  16  
  17  /**
  18   * We are blissfully unaware of anything.
  19   */
  20  define( 'WP_SETUP_CONFIG', true );
  21  
  22  /**
  23   * Disable error reporting
  24   *
  25   * Set this to error_reporting( -1 ) for debugging
  26   */
  27  error_reporting( 0 );
  28  
  29  if ( ! defined( 'ABSPATH' ) ) {
  30      define( 'ABSPATH', dirname( __DIR__ ) . '/' );
  31  }
  32  
  33  require  ABSPATH . 'wp-settings.php';
  34  
  35  /** Load WordPress Administration Upgrade API */
  36  require_once ABSPATH . 'wp-admin/includes/upgrade.php';
  37  
  38  /** Load WordPress Translation Installation API */
  39  require_once ABSPATH . 'wp-admin/includes/translation-install.php';
  40  
  41  nocache_headers();
  42  
  43  // Support wp-config-sample.php one level up, for the develop repo.
  44  if ( file_exists( ABSPATH . 'wp-config-sample.php' ) ) {
  45      $config_file = file( ABSPATH . 'wp-config-sample.php' );
  46  } elseif ( file_exists( dirname( ABSPATH ) . '/wp-config-sample.php' ) ) {
  47      $config_file = file( dirname( ABSPATH ) . '/wp-config-sample.php' );
  48  } else {
  49      wp_die(
  50          sprintf(
  51              /* translators: %s: wp-config-sample.php */
  52              __( 'Sorry, I need a %s file to work from. Please re-upload this file to your WordPress installation.' ),
  53              '<code>wp-config-sample.php</code>'
  54          )
  55      );
  56  }
  57  
  58  // Check if wp-config.php has been created.
  59  if ( file_exists( ABSPATH . 'wp-config.php' ) ) {
  60      wp_die(
  61          '<p>' . sprintf(
  62              /* translators: 1: wp-config.php, 2: install.php */
  63              __( 'The file %1$s already exists. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href="%2$s">installing now</a>.' ),
  64              '<code>wp-config.php</code>',
  65              'install.php'
  66          ) . '</p>',
  67          409
  68      );
  69  }
  70  
  71  // Check if wp-config.php exists above the root directory but is not part of another installation.
  72  if ( @file_exists( ABSPATH . '../wp-config.php' ) && ! @file_exists( ABSPATH . '../wp-settings.php' ) ) {
  73      wp_die(
  74          '<p>' . sprintf(
  75              /* translators: 1: wp-config.php, 2: install.php */
  76              __( 'The file %1$s already exists one level above your WordPress installation. If you need to reset any of the configuration items in this file, please delete it first. You may try <a href="%2$s">installing now</a>.' ),
  77              '<code>wp-config.php</code>',
  78              'install.php'
  79          ) . '</p>',
  80          409
  81      );
  82  }
  83  
  84  $step = isset( $_GET['step'] ) ? (int) $_GET['step'] : -1;
  85  
  86  /**
  87   * Display setup wp-config.php file header.
  88   *
  89   * @ignore
  90   * @since 2.3.0
  91   *
  92   * @param string|string[] $body_classes Class attribute values for the body tag.
  93   */
  94  function setup_config_display_header( $body_classes = array() ) {
  95      $body_classes   = (array) $body_classes;
  96      $body_classes[] = 'wp-core-ui';
  97      $dir_attr       = '';
  98      if ( is_rtl() ) {
  99          $body_classes[] = 'rtl';
 100          $dir_attr       = ' dir="rtl"';
 101      }
 102  
 103      header( 'Content-Type: text/html; charset=utf-8' );
 104      ?>
 105  <!DOCTYPE html>
 106  <html<?php echo $dir_attr; ?>>
 107  <head>
 108      <meta name="viewport" content="width=device-width" />
 109      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 110      <meta name="robots" content="noindex,nofollow" />
 111      <title><?php _e( 'WordPress &rsaquo; Setup Configuration File' ); ?></title>
 112      <?php wp_admin_css( 'install', true ); ?>
 113  </head>
 114  <body class="<?php echo implode( ' ', $body_classes ); ?>">
 115  <p id="logo"><?php _e( 'WordPress' ); ?></p>
 116      <?php
 117  } // End function setup_config_display_header();
 118  
 119  $language = '';
 120  if ( ! empty( $_REQUEST['language'] ) ) {
 121      $language = preg_replace( '/[^a-zA-Z0-9_]/', '', $_REQUEST['language'] );
 122  } elseif ( isset( $GLOBALS['wp_local_package'] ) ) {
 123      $language = $GLOBALS['wp_local_package'];
 124  }
 125  
 126  switch ( $step ) {
 127      case -1:
 128          if ( wp_can_install_language_pack() && empty( $language ) ) {
 129              $languages = wp_get_available_translations();
 130              if ( $languages ) {
 131                  setup_config_display_header( 'language-chooser' );
 132                  echo '<h1 class="screen-reader-text">Select a default language</h1>';
 133                  echo '<form id="setup" method="post" action="?step=0">';
 134                  wp_install_language_form( $languages );
 135                  echo '</form>';
 136                  break;
 137              }
 138          }
 139  
 140          // Deliberately fall through if we can't reach the translations API.
 141  
 142      case 0:
 143          if ( ! empty( $language ) ) {
 144              $loaded_language = wp_download_language_pack( $language );
 145              if ( $loaded_language ) {
 146                  load_default_textdomain( $loaded_language );
 147                  $GLOBALS['wp_locale'] = new WP_Locale();
 148              }
 149          }
 150  
 151          setup_config_display_header();
 152          $step_1 = 'setup-config.php?step=1';
 153          if ( isset( $_REQUEST['noapi'] ) ) {
 154              $step_1 .= '&amp;noapi';
 155          }
 156          if ( ! empty( $loaded_language ) ) {
 157              $step_1 .= '&amp;language=' . $loaded_language;
 158          }
 159          ?>
 160  <h1 class="screen-reader-text"><?php _e( 'Before getting started' ); ?></h1>
 161  <p><?php _e( 'Welcome to WordPress. Before getting started, we need some information on the database. You will need to know the following items before proceeding.' ); ?></p>
 162  <ol>
 163      <li><?php _e( 'Database name' ); ?></li>
 164      <li><?php _e( 'Database username' ); ?></li>
 165      <li><?php _e( 'Database password' ); ?></li>
 166      <li><?php _e( 'Database host' ); ?></li>
 167      <li><?php _e( 'Table prefix (if you want to run more than one WordPress in a single database)' ); ?></li>
 168  </ol>
 169  <p>
 170          <?php
 171          printf(
 172              /* translators: %s: wp-config.php */
 173              __( 'We&#8217;re going to use this information to create a %s file.' ),
 174              '<code>wp-config.php</code>'
 175          );
 176          ?>
 177      <strong>
 178          <?php
 179          printf(
 180              /* translators: 1: wp-config-sample.php, 2: wp-config.php */
 181              __( 'If for any reason this automatic file creation doesn&#8217;t work, don&#8217;t worry. All this does is fill in the database information to a configuration file. You may also simply open %1$s in a text editor, fill in your information, and save it as %2$s.' ),
 182              '<code>wp-config-sample.php</code>',
 183              '<code>wp-config.php</code>'
 184          );
 185          ?>
 186      </strong>
 187          <?php
 188          printf(
 189              /* translators: %s: Documentation URL. */
 190              __( 'Need more help? <a href="%s">We got it</a>.' ),
 191              __( 'https://wordpress.org/support/article/editing-wp-config-php/' )
 192          );
 193          ?>
 194  </p>
 195  <p><?php _e( 'In all likelihood, these items were supplied to you by your web host. If you don&#8217;t have this information, then you will need to contact them before you can continue. If you&#8217;re all ready&hellip;' ); ?></p>
 196  
 197  <p class="step"><a href="<?php echo $step_1; ?>" class="button button-large"><?php _e( 'Let&#8217;s go!' ); ?></a></p>
 198          <?php
 199          break;
 200  
 201      case 1:
 202          load_default_textdomain( $language );
 203          $GLOBALS['wp_locale'] = new WP_Locale();
 204  
 205          setup_config_display_header();
 206  
 207          $autofocus = wp_is_mobile() ? '' : ' autofocus';
 208          ?>
 209  <h1 class="screen-reader-text"><?php _e( 'Set up your database connection' ); ?></h1>
 210  <form method="post" action="setup-config.php?step=2">
 211      <p><?php _e( 'Below you should enter your database connection details. If you&#8217;re not sure about these, contact your host.' ); ?></p>
 212      <table class="form-table" role="presentation">
 213          <tr>
 214              <th scope="row"><label for="dbname"><?php _e( 'Database Name' ); ?></label></th>
 215              <td><input name="dbname" id="dbname" type="text" aria-describedby="dbname-desc" size="25" value="wordpress"<?php echo $autofocus; ?>/></td>
 216              <td id="dbname-desc"><?php _e( 'The name of the database you want to use with WordPress.' ); ?></td>
 217          </tr>
 218          <tr>
 219              <th scope="row"><label for="uname"><?php _e( 'Username' ); ?></label></th>
 220              <td><input name="uname" id="uname" type="text" aria-describedby="uname-desc" size="25" value="<?php echo htmlspecialchars( _x( 'username', 'example username' ), ENT_QUOTES ); ?>" /></td>
 221              <td id="uname-desc"><?php _e( 'Your database username.' ); ?></td>
 222          </tr>
 223          <tr>
 224              <th scope="row"><label for="pwd"><?php _e( 'Password' ); ?></label></th>
 225              <td><input name="pwd" id="pwd" type="text" aria-describedby="pwd-desc" size="25" value="<?php echo htmlspecialchars( _x( 'password', 'example password' ), ENT_QUOTES ); ?>" autocomplete="off" /></td>
 226              <td id="pwd-desc"><?php _e( 'Your database password.' ); ?></td>
 227          </tr>
 228          <tr>
 229              <th scope="row"><label for="dbhost"><?php _e( 'Database Host' ); ?></label></th>
 230              <td><input name="dbhost" id="dbhost" type="text" aria-describedby="dbhost-desc" size="25" value="localhost" /></td>
 231              <td id="dbhost-desc">
 232              <?php
 233                  /* translators: %s: localhost */
 234                  printf( __( 'You should be able to get this info from your web host, if %s doesn&#8217;t work.' ), '<code>localhost</code>' );
 235              ?>
 236              </td>
 237          </tr>
 238          <tr>
 239              <th scope="row"><label for="prefix"><?php _e( 'Table Prefix' ); ?></label></th>
 240              <td><input name="prefix" id="prefix" type="text" aria-describedby="prefix-desc" value="wp_" size="25" /></td>
 241              <td id="prefix-desc"><?php _e( 'If you want to run multiple WordPress installations in a single database, change this.' ); ?></td>
 242          </tr>
 243      </table>
 244          <?php
 245          if ( isset( $_GET['noapi'] ) ) {
 246              ?>
 247  <input name="noapi" type="hidden" value="1" /><?php } ?>
 248      <input type="hidden" name="language" value="<?php echo esc_attr( $language ); ?>" />
 249      <p class="step"><input name="submit" type="submit" value="<?php echo htmlspecialchars( __( 'Submit' ), ENT_QUOTES ); ?>" class="button button-large" /></p>
 250  </form>
 251          <?php
 252          break;
 253  
 254      case 2:
 255          load_default_textdomain( $language );
 256          $GLOBALS['wp_locale'] = new WP_Locale();
 257  
 258          $dbname = trim( wp_unslash( $_POST['dbname'] ) );
 259          $uname  = trim( wp_unslash( $_POST['uname'] ) );
 260          $pwd    = trim( wp_unslash( $_POST['pwd'] ) );
 261          $dbhost = trim( wp_unslash( $_POST['dbhost'] ) );
 262          $prefix = trim( wp_unslash( $_POST['prefix'] ) );
 263  
 264          $step_1  = 'setup-config.php?step=1';
 265          $install = 'install.php';
 266          if ( isset( $_REQUEST['noapi'] ) ) {
 267              $step_1 .= '&amp;noapi';
 268          }
 269  
 270          if ( ! empty( $language ) ) {
 271              $step_1  .= '&amp;language=' . $language;
 272              $install .= '?language=' . $language;
 273          } else {
 274              $install .= '?language=en_US';
 275          }
 276  
 277          $tryagain_link = '</p><p class="step"><a href="' . $step_1 . '" onclick="javascript:history.go(-1);return false;" class="button button-large">' . __( 'Try Again' ) . '</a>';
 278  
 279          if ( empty( $prefix ) ) {
 280              wp_die( __( '<strong>Error</strong>: "Table Prefix" must not be empty.' ) . $tryagain_link );
 281          }
 282  
 283          // Validate $prefix: it can only contain letters, numbers and underscores.
 284          if ( preg_match( '|[^a-z0-9_]|i', $prefix ) ) {
 285              wp_die( __( '<strong>Error</strong>: "Table Prefix" can only contain numbers, letters, and underscores.' ) . $tryagain_link );
 286          }
 287  
 288          // Test the DB connection.
 289          /**#@+
 290           *
 291           * @ignore
 292           */
 293          define( 'DB_NAME', $dbname );
 294          define( 'DB_USER', $uname );
 295          define( 'DB_PASSWORD', $pwd );
 296          define( 'DB_HOST', $dbhost );
 297          /**#@-*/
 298  
 299          // Re-construct $wpdb with these new values.
 300          unset( $wpdb );
 301          require_wp_db();
 302  
 303          /*
 304          * The wpdb constructor bails when WP_SETUP_CONFIG is set, so we must
 305          * fire this manually. We'll fail here if the values are no good.
 306          */
 307          $wpdb->db_connect();
 308  
 309          if ( ! empty( $wpdb->error ) ) {
 310              wp_die( $wpdb->error->get_error_message() . $tryagain_link );
 311          }
 312  
 313          $errors = $wpdb->hide_errors();
 314          $wpdb->query( "SELECT $prefix" );
 315          $wpdb->show_errors( $errors );
 316          if ( ! $wpdb->last_error ) {
 317              // MySQL was able to parse the prefix as a value, which we don't want. Bail.
 318              wp_die( __( '<strong>Error</strong>: "Table Prefix" is invalid.' ) );
 319          }
 320  
 321          // Generate keys and salts using secure CSPRNG; fallback to API if enabled; further fallback to original wp_generate_password().
 322          try {
 323              $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|';
 324              $max   = strlen( $chars ) - 1;
 325              for ( $i = 0; $i < 8; $i++ ) {
 326                  $key = '';
 327                  for ( $j = 0; $j < 64; $j++ ) {
 328                      $key .= substr( $chars, random_int( 0, $max ), 1 );
 329                  }
 330                  $secret_keys[] = $key;
 331              }
 332          } catch ( Exception $ex ) {
 333              $no_api = isset( $_POST['noapi'] );
 334  
 335              if ( ! $no_api ) {
 336                  $secret_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' );
 337              }
 338  
 339              if ( $no_api || is_wp_error( $secret_keys ) ) {
 340                  $secret_keys = array();
 341                  for ( $i = 0; $i < 8; $i++ ) {
 342                      $secret_keys[] = wp_generate_password( 64, true, true );
 343                  }
 344              } else {
 345                  $secret_keys = explode( "\n", wp_remote_retrieve_body( $secret_keys ) );
 346                  foreach ( $secret_keys as $k => $v ) {
 347                      $secret_keys[ $k ] = substr( $v, 28, 64 );
 348                  }
 349              }
 350          }
 351  
 352          $key = 0;
 353          foreach ( $config_file as $line_num => $line ) {
 354              if ( '$table_prefix =' === substr( $line, 0, 15 ) ) {
 355                  $config_file[ $line_num ] = '$table_prefix = \'' . addcslashes( $prefix, "\\'" ) . "';\r\n";
 356                  continue;
 357              }
 358  
 359              if ( ! preg_match( '/^define\(\s*\'([A-Z_]+)\',([ ]+)/', $line, $match ) ) {
 360                  continue;
 361              }
 362  
 363              $constant = $match[1];
 364              $padding  = $match[2];
 365  
 366              switch ( $constant ) {
 367                  case 'DB_NAME':
 368                  case 'DB_USER':
 369                  case 'DB_PASSWORD':
 370                  case 'DB_HOST':
 371                      $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'" . addcslashes( constant( $constant ), "\\'" ) . "' );\r\n";
 372                      break;
 373                  case 'DB_CHARSET':
 374                      if ( 'utf8mb4' === $wpdb->charset || ( ! $wpdb->charset && $wpdb->has_cap( 'utf8mb4' ) ) ) {
 375                          $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'utf8mb4' );\r\n";
 376                      }
 377                      break;
 378                  case 'AUTH_KEY':
 379                  case 'SECURE_AUTH_KEY':
 380                  case 'LOGGED_IN_KEY':
 381                  case 'NONCE_KEY':
 382                  case 'AUTH_SALT':
 383                  case 'SECURE_AUTH_SALT':
 384                  case 'LOGGED_IN_SALT':
 385                  case 'NONCE_SALT':
 386                      $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'" . $secret_keys[ $key++ ] . "' );\r\n";
 387                      break;
 388              }
 389          }
 390          unset( $line );
 391  
 392          if ( ! is_writable( ABSPATH ) ) :
 393              setup_config_display_header();
 394              ?>
 395      <p>
 396              <?php
 397              /* translators: %s: wp-config.php */
 398              printf( __( 'Unable to write to %s file.' ), '<code>wp-config.php</code>' );
 399              ?>
 400  </p>
 401  <p>
 402              <?php
 403              /* translators: %s: wp-config.php */
 404              printf( __( 'You can create the %s file manually and paste the following text into it.' ), '<code>wp-config.php</code>' );
 405  
 406              $config_text = '';
 407  
 408              foreach ( $config_file as $line ) {
 409                  $config_text .= htmlentities( $line, ENT_COMPAT, 'UTF-8' );
 410              }
 411              ?>
 412  </p>
 413  <textarea id="wp-config" cols="98" rows="15" class="code" readonly="readonly"><?php echo $config_text; ?></textarea>
 414  <p><?php _e( 'After you&#8217;ve done that, click &#8220;Run the installation&#8221;.' ); ?></p>
 415  <p class="step"><a href="<?php echo $install; ?>" class="button button-large"><?php _e( 'Run the installation' ); ?></a></p>
 416  <script>
 417  (function(){
 418  if ( ! /iPad|iPod|iPhone/.test( navigator.userAgent ) ) {
 419      var el = document.getElementById('wp-config');
 420      el.focus();
 421      el.select();
 422  }
 423  })();
 424  </script>
 425              <?php
 426          else :
 427              /*
 428               * If this file doesn't exist, then we are using the wp-config-sample.php
 429               * file one level up, which is for the develop repo.
 430               */
 431              if ( file_exists( ABSPATH . 'wp-config-sample.php' ) ) {
 432                  $path_to_wp_config = ABSPATH . 'wp-config.php';
 433              } else {
 434                  $path_to_wp_config = dirname( ABSPATH ) . '/wp-config.php';
 435              }
 436  
 437              $error_message = '';
 438              $handle        = fopen( $path_to_wp_config, 'w' );
 439              /*
 440               * Why check for the absence of false instead of checking for resource with is_resource()?
 441               * To future-proof the check for when fopen returns object instead of resource, i.e. a known
 442               * change coming in PHP.
 443               */
 444              if ( false !== $handle ) {
 445                  foreach ( $config_file as $line ) {
 446                      fwrite( $handle, $line );
 447                  }
 448                  fclose( $handle );
 449              } else {
 450                  $wp_config_perms = fileperms( $path_to_wp_config );
 451                  if ( ! empty( $wp_config_perms ) && ! is_writable( $path_to_wp_config ) ) {
 452                      $error_message = sprintf(
 453                          /* translators: 1: wp-config.php, 2: Documentation URL. */
 454                          __( 'You need to make the file %1$s writable before you can save your changes. See <a href="%2$s">Changing File Permissions</a> for more information.' ),
 455                          '<code>wp-config.php</code>',
 456                          __( 'https://wordpress.org/support/article/changing-file-permissions/' )
 457                      );
 458                  } else {
 459                      $error_message = sprintf(
 460                          /* translators: %s: wp-config.php */
 461                          __( 'Unable to write to %s file.' ),
 462                          '<code>wp-config.php</code>'
 463                      );
 464                  }
 465              }
 466  
 467              chmod( $path_to_wp_config, 0666 );
 468              setup_config_display_header();
 469  
 470              if ( false !== $handle ) :
 471                  ?>
 472  <h1 class="screen-reader-text"><?php _e( 'Successful database connection' ); ?></h1>
 473  <p><?php _e( 'All right, sparky! You&#8217;ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to&hellip;' ); ?></p>
 474  
 475  <p class="step"><a href="<?php echo $install; ?>" class="button button-large"><?php _e( 'Run the installation' ); ?></a></p>
 476                  <?php
 477              else :
 478                  printf( '<p>%s</p>', $error_message );
 479              endif;
 480          endif;
 481          break;
 482  } // End of the steps switch.
 483  ?>
 484  <?php wp_print_scripts( 'language-chooser' ); ?>
 485  </body>
 486  </html>


Generated: Tue Sep 21 01:00:05 2021 Cross-referenced by PHPXref 0.7.1