[ Index ] |
PHP Cross Reference of WordPress |
[Summary view] [Print] [Text view]
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 › 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 .= '&noapi'; 155 } 156 if ( ! empty( $loaded_language ) ) { 157 $step_1 .= '&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, you will need to know the following items.' ); ?></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 __( 'This information is being used 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 does not work, do not 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: 1: Documentation URL, 2: wp-config.php */ 190 __( 'Need more help? <a href="%1$s">Read the support article on %2$s</a>.' ), 191 __( 'https://wordpress.org/support/article/editing-wp-config-php/' ), 192 '<code>wp-config.php</code>' 193 ); 194 ?> 195 </p> 196 <p><?php _e( 'In all likelihood, these items were supplied to you by your web host. If you do not have this information, then you will need to contact them before you can continue. If you are ready…' ); ?></p> 197 198 <p class="step"><a href="<?php echo $step_1; ?>" class="button button-large"><?php _e( 'Let’s go!' ); ?></a></p> 199 <?php 200 break; 201 202 case 1: 203 load_default_textdomain( $language ); 204 $GLOBALS['wp_locale'] = new WP_Locale(); 205 206 setup_config_display_header(); 207 208 $autofocus = wp_is_mobile() ? '' : ' autofocus'; 209 ?> 210 <h1 class="screen-reader-text"><?php _e( 'Set up your database connection' ); ?></h1> 211 <form method="post" action="setup-config.php?step=2"> 212 <p><?php _e( 'Below you should enter your database connection details. If you are not sure about these, contact your host.' ); ?></p> 213 <table class="form-table" role="presentation"> 214 <tr> 215 <th scope="row"><label for="dbname"><?php _e( 'Database Name' ); ?></label></th> 216 <td><input name="dbname" id="dbname" type="text" aria-describedby="dbname-desc" size="25" value="wordpress"<?php echo $autofocus; ?>/></td> 217 <td id="dbname-desc"><?php _e( 'The name of the database you want to use with WordPress.' ); ?></td> 218 </tr> 219 <tr> 220 <th scope="row"><label for="uname"><?php _e( 'Username' ); ?></label></th> 221 <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> 222 <td id="uname-desc"><?php _e( 'Your database username.' ); ?></td> 223 </tr> 224 <tr> 225 <th scope="row"><label for="pwd"><?php _e( 'Password' ); ?></label></th> 226 <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> 227 <td id="pwd-desc"><?php _e( 'Your database password.' ); ?></td> 228 </tr> 229 <tr> 230 <th scope="row"><label for="dbhost"><?php _e( 'Database Host' ); ?></label></th> 231 <td><input name="dbhost" id="dbhost" type="text" aria-describedby="dbhost-desc" size="25" value="localhost" /></td> 232 <td id="dbhost-desc"> 233 <?php 234 /* translators: %s: localhost */ 235 printf( __( 'You should be able to get this info from your web host, if %s does not work.' ), '<code>localhost</code>' ); 236 ?> 237 </td> 238 </tr> 239 <tr> 240 <th scope="row"><label for="prefix"><?php _e( 'Table Prefix' ); ?></label></th> 241 <td><input name="prefix" id="prefix" type="text" aria-describedby="prefix-desc" value="wp_" size="25" /></td> 242 <td id="prefix-desc"><?php _e( 'If you want to run multiple WordPress installations in a single database, change this.' ); ?></td> 243 </tr> 244 </table> 245 <?php 246 if ( isset( $_GET['noapi'] ) ) { 247 ?> 248 <input name="noapi" type="hidden" value="1" /><?php } ?> 249 <input type="hidden" name="language" value="<?php echo esc_attr( $language ); ?>" /> 250 <p class="step"><input name="submit" type="submit" value="<?php echo htmlspecialchars( __( 'Submit' ), ENT_QUOTES ); ?>" class="button button-large" /></p> 251 </form> 252 <?php 253 break; 254 255 case 2: 256 load_default_textdomain( $language ); 257 $GLOBALS['wp_locale'] = new WP_Locale(); 258 259 $dbname = trim( wp_unslash( $_POST['dbname'] ) ); 260 $uname = trim( wp_unslash( $_POST['uname'] ) ); 261 $pwd = trim( wp_unslash( $_POST['pwd'] ) ); 262 $dbhost = trim( wp_unslash( $_POST['dbhost'] ) ); 263 $prefix = trim( wp_unslash( $_POST['prefix'] ) ); 264 265 $step_1 = 'setup-config.php?step=1'; 266 $install = 'install.php'; 267 if ( isset( $_REQUEST['noapi'] ) ) { 268 $step_1 .= '&noapi'; 269 } 270 271 if ( ! empty( $language ) ) { 272 $step_1 .= '&language=' . $language; 273 $install .= '?language=' . $language; 274 } else { 275 $install .= '?language=en_US'; 276 } 277 278 $tryagain_link = '</p><p class="step"><a href="' . $step_1 . '" onclick="javascript:history.go(-1);return false;" class="button button-large">' . __( 'Try Again' ) . '</a>'; 279 280 if ( empty( $prefix ) ) { 281 wp_die( __( '<strong>Error</strong>: "Table Prefix" must not be empty.' ) . $tryagain_link ); 282 } 283 284 // Validate $prefix: it can only contain letters, numbers and underscores. 285 if ( preg_match( '|[^a-z0-9_]|i', $prefix ) ) { 286 wp_die( __( '<strong>Error</strong>: "Table Prefix" can only contain numbers, letters, and underscores.' ) . $tryagain_link ); 287 } 288 289 // Test the DB connection. 290 /**#@+ 291 * 292 * @ignore 293 */ 294 define( 'DB_NAME', $dbname ); 295 define( 'DB_USER', $uname ); 296 define( 'DB_PASSWORD', $pwd ); 297 define( 'DB_HOST', $dbhost ); 298 /**#@-*/ 299 300 // Re-construct $wpdb with these new values. 301 unset( $wpdb ); 302 require_wp_db(); 303 304 /* 305 * The wpdb constructor bails when WP_SETUP_CONFIG is set, so we must 306 * fire this manually. We'll fail here if the values are no good. 307 */ 308 $wpdb->db_connect(); 309 310 if ( ! empty( $wpdb->error ) ) { 311 wp_die( $wpdb->error->get_error_message() . $tryagain_link ); 312 } 313 314 $errors = $wpdb->hide_errors(); 315 $wpdb->query( "SELECT $prefix" ); 316 $wpdb->show_errors( $errors ); 317 if ( ! $wpdb->last_error ) { 318 // MySQL was able to parse the prefix as a value, which we don't want. Bail. 319 wp_die( __( '<strong>Error</strong>: "Table Prefix" is invalid.' ) ); 320 } 321 322 // Generate keys and salts using secure CSPRNG; fallback to API if enabled; further fallback to original wp_generate_password(). 323 try { 324 $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_ []{}<>~`+=,.;:/?|'; 325 $max = strlen( $chars ) - 1; 326 for ( $i = 0; $i < 8; $i++ ) { 327 $key = ''; 328 for ( $j = 0; $j < 64; $j++ ) { 329 $key .= substr( $chars, random_int( 0, $max ), 1 ); 330 } 331 $secret_keys[] = $key; 332 } 333 } catch ( Exception $ex ) { 334 $no_api = isset( $_POST['noapi'] ); 335 336 if ( ! $no_api ) { 337 $secret_keys = wp_remote_get( 'https://api.wordpress.org/secret-key/1.1/salt/' ); 338 } 339 340 if ( $no_api || is_wp_error( $secret_keys ) ) { 341 $secret_keys = array(); 342 for ( $i = 0; $i < 8; $i++ ) { 343 $secret_keys[] = wp_generate_password( 64, true, true ); 344 } 345 } else { 346 $secret_keys = explode( "\n", wp_remote_retrieve_body( $secret_keys ) ); 347 foreach ( $secret_keys as $k => $v ) { 348 $secret_keys[ $k ] = substr( $v, 28, 64 ); 349 } 350 } 351 } 352 353 $key = 0; 354 foreach ( $config_file as $line_num => $line ) { 355 if ( '$table_prefix =' === substr( $line, 0, 15 ) ) { 356 $config_file[ $line_num ] = '$table_prefix = \'' . addcslashes( $prefix, "\\'" ) . "';\r\n"; 357 continue; 358 } 359 360 if ( ! preg_match( '/^define\(\s*\'([A-Z_]+)\',([ ]+)/', $line, $match ) ) { 361 continue; 362 } 363 364 $constant = $match[1]; 365 $padding = $match[2]; 366 367 switch ( $constant ) { 368 case 'DB_NAME': 369 case 'DB_USER': 370 case 'DB_PASSWORD': 371 case 'DB_HOST': 372 $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'" . addcslashes( constant( $constant ), "\\'" ) . "' );\r\n"; 373 break; 374 case 'DB_CHARSET': 375 if ( 'utf8mb4' === $wpdb->charset || ( ! $wpdb->charset && $wpdb->has_cap( 'utf8mb4' ) ) ) { 376 $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'utf8mb4' );\r\n"; 377 } 378 break; 379 case 'AUTH_KEY': 380 case 'SECURE_AUTH_KEY': 381 case 'LOGGED_IN_KEY': 382 case 'NONCE_KEY': 383 case 'AUTH_SALT': 384 case 'SECURE_AUTH_SALT': 385 case 'LOGGED_IN_SALT': 386 case 'NONCE_SALT': 387 $config_file[ $line_num ] = "define( '" . $constant . "'," . $padding . "'" . $secret_keys[ $key++ ] . "' );\r\n"; 388 break; 389 } 390 } 391 unset( $line ); 392 393 if ( ! is_writable( ABSPATH ) ) : 394 setup_config_display_header(); 395 ?> 396 <p> 397 <?php 398 /* translators: %s: wp-config.php */ 399 printf( __( 'Unable to write to %s file.' ), '<code>wp-config.php</code>' ); 400 ?> 401 </p> 402 <p> 403 <?php 404 /* translators: %s: wp-config.php */ 405 printf( __( 'You can create the %s file manually and paste the following text into it.' ), '<code>wp-config.php</code>' ); 406 407 $config_text = ''; 408 409 foreach ( $config_file as $line ) { 410 $config_text .= htmlentities( $line, ENT_COMPAT, 'UTF-8' ); 411 } 412 ?> 413 </p> 414 <textarea id="wp-config" cols="98" rows="15" class="code" readonly="readonly"><?php echo $config_text; ?></textarea> 415 <p><?php _e( 'After you’ve done that, click “Run the installation”.' ); ?></p> 416 <p class="step"><a href="<?php echo $install; ?>" class="button button-large"><?php _e( 'Run the installation' ); ?></a></p> 417 <script> 418 (function(){ 419 if ( ! /iPad|iPod|iPhone/.test( navigator.userAgent ) ) { 420 var el = document.getElementById('wp-config'); 421 el.focus(); 422 el.select(); 423 } 424 })(); 425 </script> 426 <?php 427 else : 428 /* 429 * If this file doesn't exist, then we are using the wp-config-sample.php 430 * file one level up, which is for the develop repo. 431 */ 432 if ( file_exists( ABSPATH . 'wp-config-sample.php' ) ) { 433 $path_to_wp_config = ABSPATH . 'wp-config.php'; 434 } else { 435 $path_to_wp_config = dirname( ABSPATH ) . '/wp-config.php'; 436 } 437 438 $error_message = ''; 439 $handle = fopen( $path_to_wp_config, 'w' ); 440 /* 441 * Why check for the absence of false instead of checking for resource with is_resource()? 442 * To future-proof the check for when fopen returns object instead of resource, i.e. a known 443 * change coming in PHP. 444 */ 445 if ( false !== $handle ) { 446 foreach ( $config_file as $line ) { 447 fwrite( $handle, $line ); 448 } 449 fclose( $handle ); 450 } else { 451 $wp_config_perms = fileperms( $path_to_wp_config ); 452 if ( ! empty( $wp_config_perms ) && ! is_writable( $path_to_wp_config ) ) { 453 $error_message = sprintf( 454 /* translators: 1: wp-config.php, 2: Documentation URL. */ 455 __( '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.' ), 456 '<code>wp-config.php</code>', 457 __( 'https://wordpress.org/support/article/changing-file-permissions/' ) 458 ); 459 } else { 460 $error_message = sprintf( 461 /* translators: %s: wp-config.php */ 462 __( 'Unable to write to %s file.' ), 463 '<code>wp-config.php</code>' 464 ); 465 } 466 } 467 468 chmod( $path_to_wp_config, 0666 ); 469 setup_config_display_header(); 470 471 if ( false !== $handle ) : 472 ?> 473 <h1 class="screen-reader-text"><?php _e( 'Successful database connection' ); ?></h1> 474 <p><?php _e( 'All right, sparky! You’ve made it through this part of the installation. WordPress can now communicate with your database. If you are ready, time now to…' ); ?></p> 475 476 <p class="step"><a href="<?php echo $install; ?>" class="button button-large"><?php _e( 'Run the installation' ); ?></a></p> 477 <?php 478 else : 479 printf( '<p>%s</p>', $error_message ); 480 endif; 481 endif; 482 break; 483 } // End of the steps switch. 484 ?> 485 <?php wp_print_scripts( 'language-chooser' ); ?> 486 </body> 487 </html>
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sat Dec 21 01:00:02 2024 | Cross-referenced by PHPXref 0.7.1 |