2015-09-11 00:01:24 +02:00
< ? php
/**
* WordPress Network Administration API .
*
* @ package WordPress
* @ subpackage Administration
* @ since 4.4 . 0
*/
/**
* Check for an existing network .
*
* @ since 3.0 . 0
*
2015-10-15 01:44:25 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-09-11 00:01:24 +02:00
*
2019-01-08 06:27:50 +01:00
* @ return string | false Base domain if network exists , otherwise false .
2015-09-11 00:01:24 +02:00
*/
function network_domain_check () {
global $wpdb ;
2017-12-01 00:11:00 +01:00
$sql = $wpdb -> prepare ( 'SHOW TABLES LIKE %s' , $wpdb -> esc_like ( $wpdb -> site ) );
2015-09-11 00:01:24 +02:00
if ( $wpdb -> get_var ( $sql ) ) {
return $wpdb -> get_var ( " SELECT domain FROM $wpdb->site ORDER BY id ASC LIMIT 1 " );
}
return false ;
}
/**
2017-08-22 13:52:48 +02:00
* Allow subdomain installation
2015-09-11 00:01:24 +02:00
*
* @ since 3.0 . 0
2017-08-22 13:52:48 +02:00
* @ return bool Whether subdomain installation is allowed
2015-09-11 00:01:24 +02:00
*/
function allow_subdomain_install () {
$domain = preg_replace ( '|https?://([^/]+)|' , '$1' , get_option ( 'home' ) );
2017-12-01 00:11:00 +01:00
if ( parse_url ( get_option ( 'home' ), PHP_URL_PATH ) || 'localhost' == $domain || preg_match ( '|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|' , $domain ) ) {
2015-09-11 00:01:24 +02:00
return false ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
return true ;
}
/**
2017-08-22 13:52:48 +02:00
* Allow subdirectory installation .
2015-09-11 00:01:24 +02:00
*
* @ since 3.0 . 0
*
2015-10-15 01:44:25 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-09-11 00:01:24 +02:00
*
2017-08-22 13:52:48 +02:00
* @ return bool Whether subdirectory installation is allowed
2015-09-11 00:01:24 +02:00
*/
function allow_subdirectory_install () {
global $wpdb ;
2017-12-01 00:11:00 +01:00
/**
* Filters whether to enable the subdirectory installation feature in Multisite .
*
* @ since 3.0 . 0
*
* @ param bool $allow Whether to enable the subdirectory installation feature in Multisite . Default is false .
*/
if ( apply_filters ( 'allow_subdirectory_install' , false ) ) {
2015-09-11 00:01:24 +02:00
return true ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
2017-12-01 00:11:00 +01:00
if ( defined ( 'ALLOW_SUBDIRECTORY_INSTALL' ) && ALLOW_SUBDIRECTORY_INSTALL ) {
2015-09-11 00:01:24 +02:00
return true ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
$post = $wpdb -> get_row ( " SELECT ID FROM $wpdb->posts WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish' " );
2017-12-01 00:11:00 +01:00
if ( empty ( $post ) ) {
2015-09-11 00:01:24 +02:00
return true ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
return false ;
}
/**
* Get base domain of network .
*
* @ since 3.0 . 0
* @ return string Base domain .
*/
function get_clean_basedomain () {
2017-12-01 00:11:00 +01:00
if ( $existing_domain = network_domain_check () ) {
2015-09-11 00:01:24 +02:00
return $existing_domain ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
$domain = preg_replace ( '|https?://|' , '' , get_option ( 'siteurl' ) );
2017-12-01 00:11:00 +01:00
if ( $slash = strpos ( $domain , '/' ) ) {
2015-09-11 00:01:24 +02:00
$domain = substr ( $domain , 0 , $slash );
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
return $domain ;
}
/**
* Prints step 1 for Network installation process .
*
* @ todo Realistically , step 1 should be a welcome screen explaining what a Network is and such . Navigating to Tools > Network
2017-12-01 00:11:00 +01:00
* should not be a sudden " Welcome to a new install process! Fill this out and click here. " See also contextual help todo .
2015-09-11 00:01:24 +02:00
*
* @ since 3.0 . 0
*
* @ global bool $is_apache
*
* @ param WP_Error $errors
*/
function network_step1 ( $errors = false ) {
global $is_apache ;
2017-12-01 00:11:00 +01:00
if ( defined ( 'DO_NOT_UPGRADE_GLOBAL_TABLES' ) ) {
2017-10-18 22:02:50 +02:00
echo '<div class="error"><p><strong>' . __ ( 'ERROR:' ) . '</strong> ' . sprintf (
/* translators: %s: DO_NOT_UPGRADE_GLOBAL_TABLES */
__ ( 'The constant %s cannot be defined when creating a network.' ),
'<code>DO_NOT_UPGRADE_GLOBAL_TABLES</code>'
) . '</p></div>' ;
2015-09-11 00:01:24 +02:00
echo '</div>' ;
include ( ABSPATH . 'wp-admin/admin-footer.php' );
die ();
}
$active_plugins = get_option ( 'active_plugins' );
if ( ! empty ( $active_plugins ) ) {
2017-10-18 22:02:50 +02:00
echo '<div class="updated"><p><strong>' . __ ( 'Warning:' ) . '</strong> ' . sprintf (
/* translators: %s: Plugins screen URL */
__ ( 'Please <a href="%s">deactivate your plugins</a> before enabling the Network feature.' ),
admin_url ( 'plugins.php?plugin_status=active' )
2017-10-18 22:51:48 +02:00
) . '</p></div>' ;
echo '<p>' . __ ( 'Once the network is created, you may reactivate your plugins.' ) . '</p>' ;
2015-09-11 00:01:24 +02:00
echo '</div>' ;
include ( ABSPATH . 'wp-admin/admin-footer.php' );
die ();
}
2017-12-01 00:11:00 +01:00
$hostname = get_clean_basedomain ();
2015-09-11 00:01:24 +02:00
$has_ports = strstr ( $hostname , ':' );
if ( ( false !== $has_ports && ! in_array ( $has_ports , array ( ':80' , ':443' ) ) ) ) {
2017-10-18 21:50:47 +02:00
echo '<div class="error"><p><strong>' . __ ( 'ERROR:' ) . '</strong> ' . __ ( 'You cannot install a network of sites with your server address.' ) . '</p></div>' ;
2015-09-18 20:40:24 +02:00
echo '<p>' . sprintf (
/* translators: %s: port number */
__ ( 'You cannot use port numbers such as %s.' ),
'<code>' . $has_ports . '</code>'
) . '</p>' ;
2015-09-11 00:01:24 +02:00
echo '<a href="' . esc_url ( admin_url () ) . '">' . __ ( 'Return to Dashboard' ) . '</a>' ;
echo '</div>' ;
include ( ABSPATH . 'wp-admin/admin-footer.php' );
die ();
}
echo '<form method="post">' ;
wp_nonce_field ( 'install-network-1' );
$error_codes = array ();
if ( is_wp_error ( $errors ) ) {
echo '<div class="error"><p><strong>' . __ ( 'ERROR: The network could not be created.' ) . '</strong></p>' ;
2017-12-01 00:11:00 +01:00
foreach ( $errors -> get_error_messages () as $error ) {
2015-09-11 00:01:24 +02:00
echo " <p> $error </p> " ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
echo '</div>' ;
$error_codes = $errors -> get_error_codes ();
}
2016-08-23 02:17:27 +02:00
if ( ! empty ( $_POST [ 'sitename' ] ) && ! in_array ( 'empty_sitename' , $error_codes ) ) {
$site_name = $_POST [ 'sitename' ];
} else {
/* translators: %s: Default network name */
$site_name = sprintf ( __ ( '%s Sites' ), get_option ( 'blogname' ) );
}
if ( ! empty ( $_POST [ 'email' ] ) && ! in_array ( 'invalid_email' , $error_codes ) ) {
$admin_email = $_POST [ 'email' ];
} else {
$admin_email = get_option ( 'admin_email' );
}
2015-09-11 00:01:24 +02:00
?>
< p >< ? php _e ( 'Welcome to the Network installation process!' ); ?> </p>
< p >< ? php _e ( 'Fill in the information below and you’ll be on your way to creating a network of WordPress sites. We will create configuration files in the next step.' ); ?> </p>
< ? php
if ( isset ( $_POST [ 'subdomain_install' ] ) ) {
$subdomain_install = ( bool ) $_POST [ 'subdomain_install' ];
2017-12-01 00:11:00 +01:00
} elseif ( apache_mod_loaded ( 'mod_rewrite' ) ) { // assume nothing
2015-09-11 00:01:24 +02:00
$subdomain_install = true ;
2017-12-01 00:11:00 +01:00
} elseif ( ! allow_subdirectory_install () ) {
2015-09-11 00:01:24 +02:00
$subdomain_install = true ;
} else {
$subdomain_install = false ;
2016-06-29 01:24:27 +02:00
if ( $got_mod_rewrite = got_mod_rewrite () ) { // dangerous assumptions
2015-11-06 01:59:25 +01:00
echo '<div class="updated inline"><p><strong>' . __ ( 'Note:' ) . '</strong> ' ;
/* translators: %s: mod_rewrite */
2017-12-01 00:11:00 +01:00
printf (
__ ( 'Please make sure the Apache %s module is installed as it will be used at the end of this installation.' ),
2015-11-06 01:59:25 +01:00
'<code>mod_rewrite</code>'
);
echo '</p>' ;
} elseif ( $is_apache ) {
2017-10-18 21:50:47 +02:00
echo '<div class="error inline"><p><strong>' . __ ( 'Warning:' ) . '</strong> ' ;
2015-11-06 01:59:25 +01:00
/* translators: %s: mod_rewrite */
2017-12-01 00:11:00 +01:00
printf (
__ ( 'It looks like the Apache %s module is not installed.' ),
2015-11-06 01:59:25 +01:00
'<code>mod_rewrite</code>'
);
echo '</p>' ;
}
if ( $got_mod_rewrite || $is_apache ) { // Protect against mod_rewrite mimicry (but ! Apache)
echo '<p>' ;
/* translators: 1: mod_rewrite, 2: mod_rewrite documentation URL, 3: Google search for mod_rewrite */
2017-12-01 00:11:00 +01:00
printf (
__ ( 'If %1$s is disabled, ask your administrator to enable that module, or look at the <a href="%2$s">Apache documentation</a> or <a href="%3$s">elsewhere</a> for help setting it up.' ),
2015-11-06 01:59:25 +01:00
'<code>mod_rewrite</code>' ,
2016-06-10 06:50:33 +02:00
'https://httpd.apache.org/docs/mod/mod_rewrite.html' ,
'https://www.google.com/search?q=apache+mod_rewrite'
2015-11-06 01:59:25 +01:00
);
echo '</p></div>' ;
}
2015-09-11 00:01:24 +02:00
}
2017-12-01 00:11:00 +01:00
if ( allow_subdomain_install () && allow_subdirectory_install () ) :
2018-08-17 03:51:36 +02:00
?>
2015-09-11 00:01:24 +02:00
< h3 >< ? php esc_html_e ( 'Addresses of Sites in your Network' ); ?> </h3>
2015-11-06 01:59:25 +01:00
< p >< ? php _e ( 'Please choose whether you would like sites in your WordPress network to use sub-domains or sub-directories.' ); ?>
< strong >< ? php _e ( 'You cannot change this later.' ); ?> </strong></p>
2015-09-11 00:01:24 +02:00
< p >< ? php _e ( 'You will need a wildcard DNS record if you are going to use the virtual host (sub-domain) functionality.' ); ?> </p>
< ? php // @todo: Link to an MS readme? ?>
< table class = " form-table " >
< tr >
< th >< label >< input type = " radio " name = " subdomain_install " value = " 1 " < ? php checked ( $subdomain_install ); ?> /> <?php _e( 'Sub-domains' ); ?></label></th>
2017-12-01 00:11:00 +01:00
< td >
< ? php
printf (
2015-09-11 00:01:24 +02:00
/* translators: 1: hostname */
_x ( 'like <code>site1.%1$s</code> and <code>site2.%1$s</code>' , 'subdomain examples' ),
$hostname
2017-12-01 00:11:00 +01:00
);
?>
</ td >
2015-09-11 00:01:24 +02:00
</ tr >
< tr >
< th >< label >< input type = " radio " name = " subdomain_install " value = " 0 " < ? php checked ( ! $subdomain_install ); ?> /> <?php _e( 'Sub-directories' ); ?></label></th>
2017-12-01 00:11:00 +01:00
< td >
< ? php
printf (
2015-09-11 00:01:24 +02:00
/* translators: 1: hostname */
_x ( 'like <code>%1$s/site1</code> and <code>%1$s/site2</code>' , 'subdirectory examples' ),
$hostname
2017-12-01 00:11:00 +01:00
);
?>
</ td >
2015-09-11 00:01:24 +02:00
</ tr >
</ table >
2018-08-17 03:51:36 +02:00
< ? php
2015-09-11 00:01:24 +02:00
endif ;
2017-12-01 00:11:00 +01:00
if ( WP_CONTENT_DIR != ABSPATH . 'wp-content' && ( allow_subdirectory_install () || ! allow_subdomain_install () ) ) {
echo '<div class="error inline"><p><strong>' . __ ( 'Warning:' ) . '</strong> ' . __ ( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '</p></div>' ;
}
2015-09-11 00:01:24 +02:00
$is_www = ( 0 === strpos ( $hostname , 'www.' ) );
2017-12-01 00:11:00 +01:00
if ( $is_www ) :
2015-09-11 00:01:24 +02:00
?>
< h3 >< ? php esc_html_e ( 'Server Address' ); ?> </h3>
2017-12-01 00:11:00 +01:00
< p >
< ? php
printf (
2018-03-11 17:44:34 +01:00
/* translators: 1: site url, 2: host name, 3: www */
2015-09-18 20:18:27 +02:00
__ ( 'We recommend you change your siteurl to %1$s before enabling the network feature. It will still be possible to visit your site using the %3$s prefix with an address like %2$s but any links will not have the %3$s prefix.' ),
'<code>' . substr ( $hostname , 4 ) . '</code>' ,
'<code>' . $hostname . '</code>' ,
'<code>www</code>'
2017-12-01 00:11:00 +01:00
);
?>
</ p >
2015-09-11 00:01:24 +02:00
< table class = " form-table " >
< tr >
2017-12-01 00:11:00 +01:00
< th scope = 'row' >< ? php esc_html_e ( 'Server Address' ); ?> </th>
< td >
< ? php
printf (
2015-09-18 20:40:24 +02:00
/* translators: %s: host name */
2015-09-18 20:18:27 +02:00
__ ( 'The internet address of your network will be %s.' ),
'<code>' . $hostname . '</code>'
2017-12-01 00:11:00 +01:00
);
2018-08-17 03:51:36 +02:00
?>
2015-09-11 00:01:24 +02:00
</ td >
</ tr >
</ table >
< ? php endif ; ?>
< h3 >< ? php esc_html_e ( 'Network Details' ); ?> </h3>
< table class = " form-table " >
< ? php if ( 'localhost' == $hostname ) : ?>
< tr >
2017-08-22 13:52:48 +02:00
< th scope = " row " >< ? php esc_html_e ( 'Sub-directory Installation' ); ?> </th>
2017-12-01 00:11:00 +01:00
< td >
< ? php
2015-11-06 01:59:25 +01:00
printf (
2018-03-11 17:44:34 +01:00
/* translators: 1: localhost, 2: localhost.localdomain */
2015-11-06 01:59:25 +01:00
__ ( 'Because you are using %1$s, the sites in your WordPress network must use sub-directories. Consider using %2$s if you wish to use sub-domains.' ),
'<code>localhost</code>' ,
'<code>localhost.localdomain</code>'
);
2015-09-11 00:01:24 +02:00
// Uh oh:
2017-12-01 00:11:00 +01:00
if ( ! allow_subdirectory_install () ) {
echo ' <strong>' . __ ( 'Warning:' ) . ' ' . __ ( 'The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>' ;
}
?>
</ td >
2015-09-11 00:01:24 +02:00
</ tr >
2017-12-01 00:11:00 +01:00
< ? php elseif ( ! allow_subdomain_install () ) : ?>
2015-09-11 00:01:24 +02:00
< tr >
2017-08-22 13:52:48 +02:00
< th scope = " row " >< ? php esc_html_e ( 'Sub-directory Installation' ); ?> </th>
2017-12-01 00:11:00 +01:00
< td >
< ? php
2017-08-22 13:52:48 +02:00
_e ( 'Because your installation is in a directory, the sites in your WordPress network must use sub-directories.' );
2015-09-11 00:01:24 +02:00
// Uh oh:
2017-12-01 00:11:00 +01:00
if ( ! allow_subdirectory_install () ) {
echo ' <strong>' . __ ( 'Warning:' ) . ' ' . __ ( 'The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>' ;
}
?>
</ td >
2015-09-11 00:01:24 +02:00
</ tr >
2017-12-01 00:11:00 +01:00
< ? php elseif ( ! allow_subdirectory_install () ) : ?>
2015-09-11 00:01:24 +02:00
< tr >
2017-08-22 13:52:48 +02:00
< th scope = " row " >< ? php esc_html_e ( 'Sub-domain Installation' ); ?> </th>
2017-12-01 00:11:00 +01:00
< td >
< ? php
_e ( 'Because your installation is not new, the sites in your WordPress network must use sub-domains.' );
2017-08-22 13:52:48 +02:00
echo ' <strong>' . __ ( 'The main site in a sub-directory installation will need to use a modified permalink structure, potentially breaking existing links.' ) . '</strong>' ;
2017-12-01 00:11:00 +01:00
?>
</ td >
2015-09-11 00:01:24 +02:00
</ tr >
< ? php endif ; ?>
< ? php if ( ! $is_www ) : ?>
< tr >
< th scope = 'row' >< ? php esc_html_e ( 'Server Address' ); ?> </th>
< td >
2017-12-01 00:11:00 +01:00
< ? php
printf (
2015-09-18 20:40:24 +02:00
/* translators: %s: host name */
2015-09-18 20:18:27 +02:00
__ ( 'The internet address of your network will be %s.' ),
'<code>' . $hostname . '</code>'
2017-12-01 00:11:00 +01:00
);
?>
2015-09-11 00:01:24 +02:00
</ td >
</ tr >
< ? php endif ; ?>
< tr >
< th scope = 'row' >< ? php esc_html_e ( 'Network Title' ); ?> </th>
< td >
< input name = 'sitename' type = 'text' size = '45' value = '<?php echo esc_attr( $site_name ); ?>' />
< p class = " description " >
< ? php _e ( 'What would you like to call your network?' ); ?>
</ p >
</ td >
</ tr >
< tr >
< th scope = 'row' >< ? php esc_html_e ( 'Network Admin Email' ); ?> </th>
< td >
< input name = 'email' type = 'text' size = '45' value = '<?php echo esc_attr( $admin_email ); ?>' />
< p class = " description " >
< ? php _e ( 'Your email address.' ); ?>
</ p >
</ td >
</ tr >
</ table >
< ? php submit_button ( __ ( 'Install' ), 'primary' , 'submit' ); ?>
</ form >
< ? php
}
/**
* Prints step 2 for Network installation process .
*
* @ since 3.0 . 0
*
2015-10-15 01:44:25 +02:00
* @ global wpdb $wpdb WordPress database abstraction object .
2015-09-11 00:01:24 +02:00
*
* @ param WP_Error $errors
*/
function network_step2 ( $errors = false ) {
global $wpdb ;
$hostname = get_clean_basedomain ();
$slashed_home = trailingslashit ( get_option ( 'home' ) );
$base = parse_url ( $slashed_home , PHP_URL_PATH );
$document_root_fix = str_replace ( '\\' , '/' , realpath ( $_SERVER [ 'DOCUMENT_ROOT' ] ) );
$abspath_fix = str_replace ( '\\' , '/' , ABSPATH );
$home_path = 0 === strpos ( $abspath_fix , $document_root_fix ) ? $document_root_fix . $base : get_home_path ();
$wp_siteurl_subdir = preg_replace ( '#^' . preg_quote ( $home_path , '#' ) . '#' , '' , $abspath_fix );
$rewrite_base = ! empty ( $wp_siteurl_subdir ) ? ltrim ( trailingslashit ( $wp_siteurl_subdir ), '/' ) : '' ;
$location_of_wp_config = $abspath_fix ;
if ( ! file_exists ( ABSPATH . 'wp-config.php' ) && file_exists ( dirname ( ABSPATH ) . '/wp-config.php' ) ) {
$location_of_wp_config = dirname ( $abspath_fix );
}
$location_of_wp_config = trailingslashit ( $location_of_wp_config );
// Wildcard DNS message.
2017-12-01 00:11:00 +01:00
if ( is_wp_error ( $errors ) ) {
2015-09-11 00:01:24 +02:00
echo '<div class="error">' . $errors -> get_error_message () . '</div>' ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
if ( $_POST ) {
2017-12-01 00:11:00 +01:00
if ( allow_subdomain_install () ) {
2015-09-11 00:01:24 +02:00
$subdomain_install = allow_subdirectory_install () ? ! empty ( $_POST [ 'subdomain_install' ] ) : true ;
2017-12-01 00:11:00 +01:00
} else {
2015-09-11 00:01:24 +02:00
$subdomain_install = false ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
} else {
if ( is_multisite () ) {
$subdomain_install = is_subdomain_install ();
2018-08-17 03:51:36 +02:00
?>
2015-09-11 00:01:24 +02:00
< p >< ? php _e ( 'The original configuration steps are shown here for reference.' ); ?> </p>
2018-08-17 03:51:36 +02:00
< ? php
2015-09-11 00:01:24 +02:00
} else {
$subdomain_install = ( bool ) $wpdb -> get_var ( " SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = 1 AND meta_key = 'subdomain_install' " );
2018-08-17 03:51:36 +02:00
?>
2017-10-18 21:50:47 +02:00
< div class = " error " >< p >< strong >< ? php _e ( 'Warning:' ); ?> </strong> <?php _e( 'An existing WordPress network was detected.' ); ?></p></div>
2015-09-11 00:01:24 +02:00
< p >< ? php _e ( 'Please complete the configuration steps. To create a new network, you will need to empty or remove the network database tables.' ); ?> </p>
2018-08-17 03:51:36 +02:00
< ? php
2015-09-11 00:01:24 +02:00
}
}
$subdir_match = $subdomain_install ? '' : '([_0-9a-zA-Z-]+/)?' ;
$subdir_replacement_01 = $subdomain_install ? '' : '$1' ;
$subdir_replacement_12 = $subdomain_install ? '$1' : '$2' ;
if ( $_POST || ! is_multisite () ) {
2018-08-17 03:51:36 +02:00
?>
2015-09-11 00:01:24 +02:00
< h3 >< ? php esc_html_e ( 'Enabling the Network' ); ?> </h3>
< p >< ? php _e ( 'Complete the following steps to enable the features for creating a network of sites.' ); ?> </p>
2017-12-01 00:11:00 +01:00
< div class = " updated inline " >< p >
< ? php
if ( file_exists ( $home_path . '.htaccess' ) ) {
echo '<strong>' . __ ( 'Caution:' ) . '</strong> ' ;
printf (
2018-03-11 17:44:34 +01:00
/* translators: 1: wp-config.php, 2: .htaccess */
2017-12-01 00:11:00 +01:00
__ ( 'We recommend you back up your existing %1$s and %2$s files.' ),
'<code>wp-config.php</code>' ,
'<code>.htaccess</code>'
);
} elseif ( file_exists ( $home_path . 'web.config' ) ) {
echo '<strong>' . __ ( 'Caution:' ) . '</strong> ' ;
printf (
2018-03-11 17:44:34 +01:00
/* translators: 1: wp-config.php, 2: web.config */
2017-12-01 00:11:00 +01:00
__ ( 'We recommend you back up your existing %1$s and %2$s files.' ),
'<code>wp-config.php</code>' ,
'<code>web.config</code>'
);
} else {
echo '<strong>' . __ ( 'Caution:' ) . '</strong> ' ;
printf (
2018-03-11 17:44:34 +01:00
/* translators: %s: wp-config.php */
2017-12-01 00:11:00 +01:00
__ ( 'We recommend you back up your existing %s file.' ),
'<code>wp-config.php</code>'
);
}
?>
</ p ></ div >
2018-08-17 03:51:36 +02:00
< ? php
2015-09-11 00:01:24 +02:00
}
2018-08-17 03:51:36 +02:00
?>
2015-09-11 00:01:24 +02:00
< ol >
2017-12-01 00:11:00 +01:00
< li >< p >
< ? php
printf (
2019-01-08 05:30:50 +01:00
/* translators: 1: wp-config.php, 2: location of wp-config file, 3: translated version of "That's all, stop editing! Happy publishing." */
2016-06-29 01:24:27 +02:00
__ ( 'Add the following to your %1$s file in %2$s <strong>above</strong> the line reading %3$s:' ),
2015-09-18 20:18:27 +02:00
'<code>wp-config.php</code>' ,
2016-06-29 01:24:27 +02:00
'<code>' . $location_of_wp_config . '</code>' ,
/*
* translators : This string should only be translated if wp - config - sample . php is localized .
* You can check the localized release package or
* https :// i18n . svn . wordpress . org /< locale code >/ branches /< wp version >/ dist / wp - config - sample . php
*/
2019-01-08 05:30:50 +01:00
'<code>/* ' . __ ( 'That’s all, stop editing! Happy publishing.' ) . ' */</code>'
2017-12-01 00:11:00 +01:00
);
?>
</ p >
2015-09-11 00:01:24 +02:00
< textarea class = " code " readonly = " readonly " cols = " 100 " rows = " 7 " >
define ( 'MULTISITE' , true );
define ( 'SUBDOMAIN_INSTALL' , < ? php echo $subdomain_install ? 'true' : 'false' ; ?> );
define ( 'DOMAIN_CURRENT_SITE' , '<?php echo $hostname; ?>' );
define ( 'PATH_CURRENT_SITE' , '<?php echo $base; ?>' );
define ( 'SITE_ID_CURRENT_SITE' , 1 );
define ( 'BLOG_ID_CURRENT_SITE' , 1 );
</ textarea >
2018-08-17 03:51:36 +02:00
< ? php
2017-12-01 00:11:00 +01:00
$keys_salts = array (
'AUTH_KEY' => '' ,
'SECURE_AUTH_KEY' => '' ,
'LOGGED_IN_KEY' => '' ,
'NONCE_KEY' => '' ,
'AUTH_SALT' => '' ,
'SECURE_AUTH_SALT' => '' ,
'LOGGED_IN_SALT' => '' ,
'NONCE_SALT' => '' ,
);
2018-08-17 03:51:36 +02:00
foreach ( $keys_salts as $c => $v ) {
if ( defined ( $c ) ) {
unset ( $keys_salts [ $c ] );
}
2015-09-11 00:01:24 +02:00
}
2018-08-17 03:51:36 +02:00
if ( ! empty ( $keys_salts ) ) {
$keys_salts_str = '' ;
$from_api = wp_remote_get ( 'https://api.wordpress.org/secret-key/1.1/salt/' );
if ( is_wp_error ( $from_api ) ) {
foreach ( $keys_salts as $c => $v ) {
$keys_salts_str .= " \n define( ' $c ', ' " . wp_generate_password ( 64 , true , true ) . " ' ); " ;
}
} else {
$from_api = explode ( " \n " , wp_remote_retrieve_body ( $from_api ) );
foreach ( $keys_salts as $c => $v ) {
$keys_salts_str .= " \n define( ' $c ', ' " . substr ( array_shift ( $from_api ), 28 , 64 ) . " ' ); " ;
}
2015-09-11 00:01:24 +02:00
}
2018-08-17 03:51:36 +02:00
$num_keys_salts = count ( $keys_salts );
?>
2017-12-01 00:11:00 +01:00
< p >
2018-08-17 03:51:36 +02:00
< ? php
if ( 1 == $num_keys_salts ) {
printf (
/* translators: %s: wp-config.php */
__ ( 'This unique authentication key is also missing from your %s file.' ),
'<code>wp-config.php</code>'
);
} else {
printf (
/* translators: %s: wp-config.php */
__ ( 'These unique authentication keys are also missing from your %s file.' ),
'<code>wp-config.php</code>'
);
}
2015-09-11 00:01:24 +02:00
?>
< ? php _e ( 'To make your installation more secure, you should also add:' ); ?>
</ p >
< textarea class = " code " readonly = " readonly " cols = " 100 " rows = " <?php echo $num_keys_salts ; ?> " >< ? php echo esc_textarea ( $keys_salts_str ); ?> </textarea>
2018-08-17 03:51:36 +02:00
< ? php
}
?>
2015-09-11 00:01:24 +02:00
</ li >
2018-08-17 03:51:36 +02:00
< ? php
if ( iis7_supports_permalinks () ) :
// IIS doesn't support RewriteBase, all your RewriteBase are belong to us
$iis_subdir_match = ltrim ( $base , '/' ) . $subdir_match ;
$iis_rewrite_base = ltrim ( $base , '/' ) . $rewrite_base ;
$iis_subdir_replacement = $subdomain_install ? '' : '{R:1}' ;
2015-09-11 00:01:24 +02:00
2018-08-17 03:51:36 +02:00
$web_config_file = ' < ? xml version = " 1.0 " encoding = " UTF-8 " ?>
2015-09-11 00:01:24 +02:00
< configuration >
< system . webServer >
< rewrite >
< rules >
< rule name = " WordPress Rule 1 " stopProcessing = " true " >
< match url = " ^index \ .php $ " ignoreCase = " false " />
< action type = " None " />
</ rule > ' ;
2018-08-17 03:51:36 +02:00
if ( is_multisite () && get_site_option ( 'ms_files_rewriting' ) ) {
$web_config_file .= '
2015-09-11 00:01:24 +02:00
< rule name = " WordPress Rule for Files " stopProcessing = " true " >
< match url = " ^' . $iis_subdir_match . 'files/(.+) " ignoreCase = " false " />
< action type = " Rewrite " url = " ' . $iis_rewrite_base . WPINC . '/ms-files.php?file= { R:1} " appendQueryString = " false " />
</ rule > ' ;
2018-08-17 03:51:36 +02:00
}
2017-12-01 00:11:00 +01:00
$web_config_file .= '
2015-09-11 00:01:24 +02:00
< rule name = " WordPress Rule 2 " stopProcessing = " true " >
< match url = " ^' . $iis_subdir_match . 'wp-admin $ " ignoreCase = " false " />
< action type = " Redirect " url = " ' . $iis_subdir_replacement . 'wp-admin/ " redirectType = " Permanent " />
</ rule >
< rule name = " WordPress Rule 3 " stopProcessing = " true " >
< match url = " ^ " ignoreCase = " false " />
< conditions logicalGrouping = " MatchAny " >
< add input = " { REQUEST_FILENAME} " matchType = " IsFile " ignoreCase = " false " />
< add input = " { REQUEST_FILENAME} " matchType = " IsDirectory " ignoreCase = " false " />
</ conditions >
< action type = " None " />
</ rule >
< rule name = " WordPress Rule 4 " stopProcessing = " true " >
< match url = " ^' . $iis_subdir_match . '(wp-(content|admin|includes).*) " ignoreCase = " false " />
< action type = " Rewrite " url = " ' . $iis_rewrite_base . ' { R:1} " />
</ rule >
< rule name = " WordPress Rule 5 " stopProcessing = " true " >
< match url = " ^' . $iis_subdir_match . '([_0-9a-zA-Z-]+/)?(.* \ .php) $ " ignoreCase = " false " />
< action type = " Rewrite " url = " ' . $iis_rewrite_base . ' { R:2} " />
</ rule >
< rule name = " WordPress Rule 6 " stopProcessing = " true " >
< match url = " . " ignoreCase = " false " />
< action type = " Rewrite " url = " index.php " />
</ rule >
</ rules >
</ rewrite >
</ system . webServer >
</ configuration >
' ;
2017-12-01 00:11:00 +01:00
echo '<li><p>' ;
printf (
2018-03-11 17:44:34 +01:00
/* translators: 1: a filename like .htaccess, 2: a file path */
2017-12-01 00:11:00 +01:00
__ ( 'Add the following to your %1$s file in %2$s, <strong>replacing</strong> other WordPress rules:' ),
'<code>web.config</code>' ,
'<code>' . $home_path . '</code>'
);
2018-08-17 03:51:36 +02:00
echo '</p>' ;
if ( ! $subdomain_install && WP_CONTENT_DIR != ABSPATH . 'wp-content' ) {
echo '<p><strong>' . __ ( 'Warning:' ) . ' ' . __ ( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '</strong></p>' ;
}
?>
2017-12-01 00:11:00 +01:00
< textarea class = " code " readonly = " readonly " cols = " 100 " rows = " 20 " >< ? php echo esc_textarea ( $web_config_file ); ?>
2015-09-11 00:01:24 +02:00
</ textarea ></ li >
</ ol >
2018-08-17 03:51:36 +02:00
< ? php
2017-12-01 00:11:00 +01:00
else : // end iis7_supports_permalinks(). construct an htaccess file instead:
2015-09-11 00:01:24 +02:00
$ms_files_rewriting = '' ;
2015-10-07 19:11:25 +02:00
if ( is_multisite () && get_site_option ( 'ms_files_rewriting' ) ) {
2017-12-01 00:11:00 +01:00
$ms_files_rewriting = " \n # uploaded files \n RewriteRule ^ " ;
2015-09-11 00:01:24 +02:00
$ms_files_rewriting .= $subdir_match . " files/(.+) { $rewrite_base } " . WPINC . " /ms-files.php?file= { $subdir_replacement_12 } [L] " . " \n " ;
}
$htaccess_file = <<< EOF
RewriteEngine On
RewriteBase { $base }
RewriteRule ^ index\ . php $ - [ L ]
{ $ms_files_rewriting }
# add a trailing slash to /wp-admin
RewriteRule ^ { $subdir_match } wp - admin $ { $subdir_replacement_01 } wp - admin / [ R = 301 , L ]
RewriteCond % { REQUEST_FILENAME } - f [ OR ]
RewriteCond % { REQUEST_FILENAME } - d
RewriteRule ^ - [ L ]
RewriteRule ^ { $subdir_match }( wp - ( content | admin | includes ) .* ) { $rewrite_base }{ $subdir_replacement_12 } [ L ]
RewriteRule ^ { $subdir_match }( .* \ . php ) $ { $rewrite_base } $subdir_replacement_12 [ L ]
RewriteRule . index . php [ L ]
EOF ;
echo '<li><p>' ;
2015-09-18 20:18:27 +02:00
printf (
2018-03-11 17:44:34 +01:00
/* translators: 1: a filename like .htaccess, 2: a file path */
2015-09-18 20:18:27 +02:00
__ ( 'Add the following to your %1$s file in %2$s, <strong>replacing</strong> other WordPress rules:' ),
'<code>.htaccess</code>' ,
'<code>' . $home_path . '</code>'
);
2015-09-11 00:01:24 +02:00
echo '</p>' ;
2017-12-01 00:11:00 +01:00
if ( ! $subdomain_install && WP_CONTENT_DIR != ABSPATH . 'wp-content' ) {
2017-10-18 21:50:47 +02:00
echo '<p><strong>' . __ ( 'Warning:' ) . ' ' . __ ( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '</strong></p>' ;
2017-12-01 00:11:00 +01:00
}
2015-09-11 00:01:24 +02:00
?>
< textarea class = " code " readonly = " readonly " cols = " 100 " rows = " <?php echo substr_count( $htaccess_file , " \n " ) + 1; ?> " >
2018-08-17 03:51:36 +02:00
< ? php echo esc_textarea ( $htaccess_file ); ?> </textarea></li>
2015-09-11 00:01:24 +02:00
</ ol >
2018-08-17 03:51:36 +02:00
< ? php
2017-12-01 00:11:00 +01:00
endif ; // end IIS/Apache code branches.
2015-09-11 00:01:24 +02:00
2017-12-01 00:11:00 +01:00
if ( ! is_multisite () ) {
?>
2015-09-15 19:11:35 +02:00
< p >< ? php _e ( 'Once you complete these steps, your network is enabled and configured. You will have to log in again.' ); ?> <a href="<?php echo esc_url( wp_login_url() ); ?>"><?php _e( 'Log In' ); ?></a></p>
2018-08-17 03:51:36 +02:00
< ? php
2015-09-11 00:01:24 +02:00
}
2016-06-29 01:24:27 +02:00
}