diff --git a/wp-admin/includes/network.php b/wp-admin/includes/network.php new file mode 100644 index 0000000000..b47d831656 --- /dev/null +++ b/wp-admin/includes/network.php @@ -0,0 +1,500 @@ +prepare( "SHOW TABLES LIKE %s", $wpdb->esc_like( $wpdb->site ) ); + if ( $wpdb->get_var( $sql ) ) { + return $wpdb->get_var( "SELECT domain FROM $wpdb->site ORDER BY id ASC LIMIT 1" ); + } + return false; +} + +/** + * Allow subdomain install + * + * @since 3.0.0 + * @return bool Whether subdomain install is allowed + */ +function allow_subdomain_install() { + $domain = preg_replace( '|https?://([^/]+)|', '$1', get_option( 'home' ) ); + if ( parse_url( get_option( 'home' ), PHP_URL_PATH ) || 'localhost' == $domain || preg_match( '|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|', $domain ) ) + return false; + + return true; +} + +/** + * Allow subdirectory install. + * + * @since 3.0.0 + * + * @global wpdb $wpdb + * + * @return bool Whether subdirectory install is allowed + */ +function allow_subdirectory_install() { + global $wpdb; + /** + * Filter whether to enable the subdirectory install feature in Multisite. + * + * @since 3.0.0 + * + * @param bool true Whether to enable the subdirectory install feature in Multisite. Default is false. + */ + if ( apply_filters( 'allow_subdirectory_install', false ) ) + return true; + + if ( defined( 'ALLOW_SUBDIRECTORY_INSTALL' ) && ALLOW_SUBDIRECTORY_INSTALL ) + return true; + + $post = $wpdb->get_row( "SELECT ID FROM $wpdb->posts WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish'" ); + if ( empty( $post ) ) + return true; + + return false; +} + +/** + * Get base domain of network. + * + * @since 3.0.0 + * @return string Base domain. + */ +function get_clean_basedomain() { + if ( $existing_domain = network_domain_check() ) + return $existing_domain; + $domain = preg_replace( '|https?://|', '', get_option( 'siteurl' ) ); + if ( $slash = strpos( $domain, '/' ) ) + $domain = substr( $domain, 0, $slash ); + 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 + * should not be a sudden "Welcome to a new install process! Fill this out and click here." See also contextual help todo. + * + * @since 3.0.0 + * + * @global bool $is_apache + * + * @param WP_Error $errors + */ +function network_step1( $errors = false ) { + global $is_apache; + + if ( defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) { + echo '

' . __('ERROR:') . ' ' . __( 'The constant DO_NOT_UPGRADE_GLOBAL_TABLES cannot be defined when creating a network.' ) . '

'; + echo ''; + include( ABSPATH . 'wp-admin/admin-footer.php' ); + die(); + } + + $active_plugins = get_option( 'active_plugins' ); + if ( ! empty( $active_plugins ) ) { + echo '

' . __('Warning:') . ' ' . sprintf( __( 'Please deactivate your plugins before enabling the Network feature.' ), admin_url( 'plugins.php?plugin_status=active' ) ) . '

' . __( 'Once the network is created, you may reactivate your plugins.' ) . '

'; + echo ''; + include( ABSPATH . 'wp-admin/admin-footer.php' ); + die(); + } + + $hostname = get_clean_basedomain(); + $has_ports = strstr( $hostname, ':' ); + if ( ( false !== $has_ports && ! in_array( $has_ports, array( ':80', ':443' ) ) ) ) { + echo '

' . __( 'ERROR:') . ' ' . __( 'You cannot install a network of sites with your server address.' ) . '

'; + echo '

' . sprintf( __( 'You cannot use port numbers such as %s.' ), $has_ports ) . '

'; + echo '' . __( 'Return to Dashboard' ) . ''; + echo ''; + include( ABSPATH . 'wp-admin/admin-footer.php' ); + die(); + } + + echo '
'; + + wp_nonce_field( 'install-network-1' ); + + $error_codes = array(); + if ( is_wp_error( $errors ) ) { + echo '

' . __( 'ERROR: The network could not be created.' ) . '

'; + foreach ( $errors->get_error_messages() as $error ) + echo "

$error

"; + echo '
'; + $error_codes = $errors->get_error_codes(); + } + + $site_name = ( ! empty( $_POST['sitename'] ) && ! in_array( 'empty_sitename', $error_codes ) ) ? $_POST['sitename'] : sprintf( _x('%s Sites', 'Default network name' ), get_option( 'blogname' ) ); + $admin_email = ( ! empty( $_POST['email'] ) && ! in_array( 'invalid_email', $error_codes ) ) ? $_POST['email'] : get_option( 'admin_email' ); + ?> +

+

+

' . __( 'Note:' ) . ' ' . __( 'Please make sure the Apache mod_rewrite module is installed as it will be used at the end of this installation.' ) . '

'; + elseif ( $is_apache ) + echo '

' . __( 'Warning!' ) . ' ' . __( 'It looks like the Apache mod_rewrite module is not installed.' ) . '

'; + if ( $got_mod_rewrite || $is_apache ) // Protect against mod_rewrite mimicry (but ! Apache) + echo '

' . __( 'If mod_rewrite is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up.' ) . '

'; + } + + if ( allow_subdomain_install() && allow_subdirectory_install() ) : ?> +

+

You cannot change this later.' ); ?>

+

+ + + + + + + + + + +
site1.%1$s and site2.%1$s', 'subdomain examples' ), + $hostname + ); ?>
%1$s/site1 and %1$s/site2', 'subdirectory examples' ), + $hostname + ); ?>
+ +

' . __('Warning!') . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

'; + + $is_www = ( 0 === strpos( $hostname, 'www.' ) ); + if ( $is_www ) : + ?> +

+

%1$s before enabling the network feature. It will still be possible to visit your site using the www prefix with an address like %2$s but any links will not have the www prefix.' ), substr( $hostname, 4 ), $hostname ); ?>

+ + + + + +
+ %s.' ), $hostname ); ?> +
+ + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
localhost, the sites in your WordPress network must use sub-directories. Consider using localhost.localdomain if you wish to use sub-domains.' ); + // Uh oh: + if ( !allow_subdirectory_install() ) + echo ' ' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; + ?>
' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; + ?>
' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; + ?>
+ %s.' ), $hostname ); ?> +
+ +

+ +

+
+ +

+ +

+
+ +
+ ' . $errors->get_error_message() . ''; + + if ( $_POST ) { + if ( allow_subdomain_install() ) + $subdomain_install = allow_subdirectory_install() ? ! empty( $_POST['subdomain_install'] ) : true; + else + $subdomain_install = false; + } else { + if ( is_multisite() ) { + $subdomain_install = is_subdomain_install(); +?> +

+get_var( "SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = 1 AND meta_key = 'subdomain_install'" ); +?> +

+

+ +

+

+

Caution: We recommend you back up your existing wp-config.php and %s files.' ), '.htaccess' ); + elseif ( file_exists( $home_path . 'web.config' ) ) + printf( __( 'Caution: We recommend you back up your existing wp-config.php and %s files.' ), 'web.config' ); + else + _e( 'Caution: We recommend you back up your existing wp-config.php file.' ); + ?>

+ +
    +
  1. wp-config.php file in %s above the line reading /* That’s all, stop editing! Happy blogging. */:' ), $location_of_wp_config ); ?>

    + + '', 'SECURE_AUTH_KEY' => '', 'LOGGED_IN_KEY' => '', 'NONCE_KEY' => '', 'AUTH_SALT' => '', 'SECURE_AUTH_SALT' => '', 'LOGGED_IN_SALT' => '', 'NONCE_SALT' => '' ); + foreach ( $keys_salts as $c => $v ) { + if ( defined( $c ) ) + unset( $keys_salts[ $c ] ); + } + + 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 .= "\ndefine( '$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 .= "\ndefine( '$c', '" . substr( array_shift( $from_api ), 28, 64 ) . "' );"; + } + } + $num_keys_salts = count( $keys_salts ); +?> +

    + wp-config.php file.' ); + } else { + _e( 'These unique authentication keys are also missing from your wp-config.php file.' ); + } + ?> + +

    + + +
  2. + + + + + + + + + '; + if ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) { + $web_config_file .= ' + + + + '; + } + $web_config_file .= ' + + + + + + + + + + + + + + + + + + + + + + + + + + + + +'; + + echo '
  3. '; + /* translators: 1: a filename like .htaccess. 2: a file path. */ + printf( __( 'Add the following to your %1$s file in %2$s, replacing other WordPress rules:' ), + 'web.config', '' . $home_path . '' ); + echo '

    '; + if ( ! $subdomain_install && WP_CONTENT_DIR != ABSPATH . 'wp-content' ) + echo '

    ' . __('Warning:') . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

    '; + ?> +
  4. +
+ +

'; + /* translators: 1: a filename like .htaccess. 2: a file path. */ + printf( __( 'Add the following to your %1$s file in %2$s, replacing other WordPress rules:' ), + '.htaccess', '' . $home_path . '' ); + echo '

'; + if ( ! $subdomain_install && WP_CONTENT_DIR != ABSPATH . 'wp-content' ) + echo '

' . __('Warning:') . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

'; + ?> + + + + +

+tables( 'ms_global' ) as $table => $prefixed_table ) +foreach ( $wpdb->tables( 'ms_global' ) as $table => $prefixed_table ) { $wpdb->$table = $prefixed_table; - -/** - * Check for an existing network. - * - * @since 3.0.0 - * - * @global wpdb $wpdb - * - * @return Whether a network exists. - */ -function network_domain_check() { - global $wpdb; - - $sql = $wpdb->prepare( "SHOW TABLES LIKE %s", $wpdb->esc_like( $wpdb->site ) ); - if ( $wpdb->get_var( $sql ) ) { - return $wpdb->get_var( "SELECT domain FROM $wpdb->site ORDER BY id ASC LIMIT 1" ); - } - return false; } -/** - * Allow subdomain install - * - * @since 3.0.0 - * @return bool Whether subdomain install is allowed - */ -function allow_subdomain_install() { - $domain = preg_replace( '|https?://([^/]+)|', '$1', get_option( 'home' ) ); - if ( parse_url( get_option( 'home' ), PHP_URL_PATH ) || 'localhost' == $domain || preg_match( '|^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$|', $domain ) ) - return false; - - return true; -} -/** - * Allow subdirectory install. - * - * @since 3.0.0 - * - * @global wpdb $wpdb - * - * @return bool Whether subdirectory install is allowed - */ -function allow_subdirectory_install() { - global $wpdb; - /** - * Filter whether to enable the subdirectory install feature in Multisite. - * - * @since 3.0.0 - * - * @param bool true Whether to enable the subdirectory install feature in Multisite. Default is false. - */ - if ( apply_filters( 'allow_subdirectory_install', false ) ) - return true; - - if ( defined( 'ALLOW_SUBDIRECTORY_INSTALL' ) && ALLOW_SUBDIRECTORY_INSTALL ) - return true; - - $post = $wpdb->get_row( "SELECT ID FROM $wpdb->posts WHERE post_date < DATE_SUB(NOW(), INTERVAL 1 MONTH) AND post_status = 'publish'" ); - if ( empty( $post ) ) - return true; - - return false; -} -/** - * Get base domain of network. - * - * @since 3.0.0 - * @return string Base domain. - */ -function get_clean_basedomain() { - if ( $existing_domain = network_domain_check() ) - return $existing_domain; - $domain = preg_replace( '|https?://|', '', get_option( 'siteurl' ) ); - if ( $slash = strpos( $domain, '/' ) ) - $domain = substr( $domain, 0, $slash ); - return $domain; -} - -if ( ! network_domain_check() && ( ! defined( 'WP_ALLOW_MULTISITE' ) || ! WP_ALLOW_MULTISITE ) ) +if ( ! network_domain_check() && ( ! defined( 'WP_ALLOW_MULTISITE' ) || ! WP_ALLOW_MULTISITE ) ) { wp_die( __( 'You must define the WP_ALLOW_MULTISITE constant as true in your wp-config.php file to allow creation of a Network.' ) ); +} if ( is_network_admin() ) { $title = __( 'Network Setup' ); @@ -148,419 +78,6 @@ include( ABSPATH . 'wp-admin/admin-header.php' );

Network - * should not be a sudden "Welcome to a new install process! Fill this out and click here." See also contextual help todo. - * - * @since 3.0.0 - * - * @global bool $is_apache - * - * @param WP_Error $errors - */ -function network_step1( $errors = false ) { - global $is_apache; - - if ( defined('DO_NOT_UPGRADE_GLOBAL_TABLES') ) { - echo '

' . __('ERROR:') . ' ' . __( 'The constant DO_NOT_UPGRADE_GLOBAL_TABLES cannot be defined when creating a network.' ) . '

'; - echo ''; - include( ABSPATH . 'wp-admin/admin-footer.php' ); - die(); - } - - $active_plugins = get_option( 'active_plugins' ); - if ( ! empty( $active_plugins ) ) { - echo '

' . __('Warning:') . ' ' . sprintf( __( 'Please deactivate your plugins before enabling the Network feature.' ), admin_url( 'plugins.php?plugin_status=active' ) ) . '

' . __( 'Once the network is created, you may reactivate your plugins.' ) . '

'; - echo ''; - include( ABSPATH . 'wp-admin/admin-footer.php' ); - die(); - } - - $hostname = get_clean_basedomain(); - $has_ports = strstr( $hostname, ':' ); - if ( ( false !== $has_ports && ! in_array( $has_ports, array( ':80', ':443' ) ) ) ) { - echo '

' . __( 'ERROR:') . ' ' . __( 'You cannot install a network of sites with your server address.' ) . '

'; - echo '

' . sprintf( __( 'You cannot use port numbers such as %s.' ), $has_ports ) . '

'; - echo '' . __( 'Return to Dashboard' ) . ''; - echo ''; - include( ABSPATH . 'wp-admin/admin-footer.php' ); - die(); - } - - echo '
'; - - wp_nonce_field( 'install-network-1' ); - - $error_codes = array(); - if ( is_wp_error( $errors ) ) { - echo '

' . __( 'ERROR: The network could not be created.' ) . '

'; - foreach ( $errors->get_error_messages() as $error ) - echo "

$error

"; - echo '
'; - $error_codes = $errors->get_error_codes(); - } - - $site_name = ( ! empty( $_POST['sitename'] ) && ! in_array( 'empty_sitename', $error_codes ) ) ? $_POST['sitename'] : sprintf( _x('%s Sites', 'Default network name' ), get_option( 'blogname' ) ); - $admin_email = ( ! empty( $_POST['email'] ) && ! in_array( 'invalid_email', $error_codes ) ) ? $_POST['email'] : get_option( 'admin_email' ); - ?> -

-

-

' . __( 'Note:' ) . ' ' . __( 'Please make sure the Apache mod_rewrite module is installed as it will be used at the end of this installation.' ) . '

'; - elseif ( $is_apache ) - echo '

' . __( 'Warning!' ) . ' ' . __( 'It looks like the Apache mod_rewrite module is not installed.' ) . '

'; - if ( $got_mod_rewrite || $is_apache ) // Protect against mod_rewrite mimicry (but ! Apache) - echo '

' . __( 'If mod_rewrite is disabled, ask your administrator to enable that module, or look at the Apache documentation or elsewhere for help setting it up.' ) . '

'; - } - - if ( allow_subdomain_install() && allow_subdirectory_install() ) : ?> -

-

You cannot change this later.' ); ?>

-

- - - - - - - - - - -
site1.%1$s and site2.%1$s', 'subdomain examples' ), - $hostname - ); ?>
%1$s/site1 and %1$s/site2', 'subdirectory examples' ), - $hostname - ); ?>
- -

' . __('Warning!') . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

'; - - $is_www = ( 0 === strpos( $hostname, 'www.' ) ); - if ( $is_www ) : - ?> -

-

%1$s before enabling the network feature. It will still be possible to visit your site using the www prefix with an address like %2$s but any links will not have the www prefix.' ), substr( $hostname, 4 ), $hostname ); ?>

- - - - - -
- %s.' ), $hostname ); ?> -
- - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
localhost, the sites in your WordPress network must use sub-directories. Consider using localhost.localdomain if you wish to use sub-domains.' ); - // Uh oh: - if ( !allow_subdirectory_install() ) - echo ' ' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; - ?>
' . __( 'Warning!' ) . ' ' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; - ?>
' . __( 'The main site in a sub-directory install will need to use a modified permalink structure, potentially breaking existing links.' ) . ''; - ?>
- %s.' ), $hostname ); ?> -
- -

- -

-
- -

- -

-
- -
- ' . $errors->get_error_message() . ''; - - if ( $_POST ) { - if ( allow_subdomain_install() ) - $subdomain_install = allow_subdirectory_install() ? ! empty( $_POST['subdomain_install'] ) : true; - else - $subdomain_install = false; - } else { - if ( is_multisite() ) { - $subdomain_install = is_subdomain_install(); -?> -

-get_var( "SELECT meta_value FROM $wpdb->sitemeta WHERE site_id = 1 AND meta_key = 'subdomain_install'" ); -?> -

-

- -

-

-

Caution: We recommend you back up your existing wp-config.php and %s files.' ), '.htaccess' ); - elseif ( file_exists( $home_path . 'web.config' ) ) - printf( __( 'Caution: We recommend you back up your existing wp-config.php and %s files.' ), 'web.config' ); - else - _e( 'Caution: We recommend you back up your existing wp-config.php file.' ); - ?>

- -
    -
  1. wp-config.php file in %s above the line reading /* That’s all, stop editing! Happy blogging. */:' ), $location_of_wp_config ); ?>

    - - '', 'SECURE_AUTH_KEY' => '', 'LOGGED_IN_KEY' => '', 'NONCE_KEY' => '', 'AUTH_SALT' => '', 'SECURE_AUTH_SALT' => '', 'LOGGED_IN_SALT' => '', 'NONCE_SALT' => '' ); - foreach ( $keys_salts as $c => $v ) { - if ( defined( $c ) ) - unset( $keys_salts[ $c ] ); - } - - 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 .= "\ndefine( '$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 .= "\ndefine( '$c', '" . substr( array_shift( $from_api ), 28, 64 ) . "' );"; - } - } - $num_keys_salts = count( $keys_salts ); -?> -

    - wp-config.php file.' ); - } else { - _e( 'These unique authentication keys are also missing from your wp-config.php file.' ); - } - ?> - -

    - - -
  2. - - - - - - - - - '; - if ( is_multisite() && get_site_option( 'ms_files_rewriting' ) ) { - $web_config_file .= ' - - - - '; - } - $web_config_file .= ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - -'; - - echo '
  3. '; - /* translators: 1: a filename like .htaccess. 2: a file path. */ - printf( __( 'Add the following to your %1$s file in %2$s, replacing other WordPress rules:' ), - 'web.config', '' . $home_path . '' ); - echo '

    '; - if ( ! $subdomain_install && WP_CONTENT_DIR != ABSPATH . 'wp-content' ) - echo '

    ' . __('Warning:') . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

    '; - ?> -
  4. -
- -

'; - /* translators: 1: a filename like .htaccess. 2: a file path. */ - printf( __( 'Add the following to your %1$s file in %2$s, replacing other WordPress rules:' ), - '.htaccess', '' . $home_path . '' ); - echo '

'; - if ( ! $subdomain_install && WP_CONTENT_DIR != ABSPATH . 'wp-content' ) - echo '

' . __('Warning:') . ' ' . __( 'Subdirectory networks may not be fully compatible with custom wp-content directories.' ) . '

'; - ?> - - - - -

-