WordPress Version: 6.4
/**
* Prints step 2 for Network installation process.
*
* @since 3.0.0
*
* @global wpdb $wpdb WordPress database abstraction object.
* @global bool $is_nginx Whether the server software is Nginx or something else.
*
* @param false|WP_Error $errors Optional. Error object. Default false.
*/
function network_step2($errors = false)
{
global $wpdb, $is_nginx;
$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 = str_starts_with($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.
if (is_wp_error($errors)) {
wp_admin_notice($errors->get_error_message(), array('additional_classes' => array('error')));
}
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();
?>
<p><?php
_e('The original configuration steps are shown here for reference.');
?></p>
<?php
} else {
$subdomain_install = (bool) $wpdb->get_var("SELECT meta_value FROM {$wpdb->sitemeta} WHERE site_id = 1 AND meta_key = 'subdomain_install'");
wp_admin_notice('<strong>' . __('Warning:') . '</strong> ' . __('An existing WordPress network was detected.'), array('additional_classes' => array('error')));
?>
<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>
<?php
}
$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()) {
?>
<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>
<?php
$notice_message = '<strong>' . __('Caution:') . '</strong> ';
$notice_args = array('type' => 'warning', 'additional_classes' => array('inline'));
if (file_exists($home_path . '.htaccess')) {
$notice_message .= sprintf(
/* translators: 1: wp-config.php, 2: .htaccess */
__('You should 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')) {
$notice_message .= sprintf(
/* translators: 1: wp-config.php, 2: web.config */
__('You should back up your existing %1$s and %2$s files.'),
'<code>wp-config.php</code>',
'<code>web.config</code>'
);
} else {
$notice_message .= sprintf(
/* translators: %s: wp-config.php */
__('You should back up your existing %s file.'),
'<code>wp-config.php</code>'
);
}
wp_admin_notice($notice_message, $notice_args);
}
?>
<ol>
<li><p id="network-wpconfig-rules-description">
<?php
printf(
/* translators: 1: wp-config.php, 2: Location of wp-config file, 3: Translated version of "That's all, stop editing! Happy publishing." */
__('Add the following to your %1$s file in %2$s <strong>above</strong> the line reading %3$s:'),
'<code>wp-config.php</code>',
'<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
*/
'<code>/* ' . __('That’s all, stop editing! Happy publishing.') . ' */</code>'
);
?>
</p>
<p class="configuration-rules-label"><label for="network-wpconfig-rules">
<?php
printf(
/* translators: %s: File name (wp-config.php, .htaccess or web.config). */
__('Network configuration rules for %s'),
'<code>wp-config.php</code>'
);
?>
</label></p>
<textarea id="network-wpconfig-rules" class="code" readonly="readonly" cols="100" rows="7" aria-describedby="network-wpconfig-rules-description">
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>
<?php
$keys_salts = array('AUTH_KEY' => '', '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);
?>
<p id="network-wpconfig-authentication-description">
<?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>'
);
}
?>
<?php
_e('To make your installation more secure, you should also add:');
?>
</p>
<p class="configuration-rules-label"><label for="network-wpconfig-authentication"><?php
_e('Network configuration authentication keys');
?></label></p>
<textarea id="network-wpconfig-authentication" class="code" readonly="readonly" cols="100" rows="<?php
echo $num_keys_salts;
?>" aria-describedby="network-wpconfig-authentication-description"><?php
echo esc_textarea($keys_salts_str);
?></textarea>
<?php
}
?>
</li>
<?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}';
$web_config_file = '<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.webServer>
<rewrite>
<rules>
<rule name="WordPress Rule 1" stopProcessing="true">
<match url="^index\.php$" ignoreCase="false" />
<action type="None" />
</rule>';
if (is_multisite() && get_site_option('ms_files_rewriting')) {
$web_config_file .= '
<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>';
}
$web_config_file .= '
<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>
';
echo '<li><p id="network-webconfig-rules-description">';
printf(
/* translators: 1: File name (.htaccess or web.config), 2: File path. */
__('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>'
);
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>';
}
?>
<p class="configuration-rules-label"><label for="network-webconfig-rules">
<?php
printf(
/* translators: %s: File name (wp-config.php, .htaccess or web.config). */
__('Network configuration rules for %s'),
'<code>web.config</code>'
);
?>
</label></p>
<textarea id="network-webconfig-rules" class="code" readonly="readonly" cols="100" rows="20" aria-describedby="network-webconfig-rules-description"><?php
echo esc_textarea($web_config_file);
?></textarea>
</li>
</ol>
<?php
} elseif ($is_nginx) {
// End iis7_supports_permalinks(). Link to Nginx documentation instead:
echo '<li><p>';
printf(
/* translators: %s: Documentation URL. */
__('It seems your network is running with Nginx web server. <a href="%s">Learn more about further configuration</a>.'),
__('https://wordpress.org/documentation/article/nginx/')
);
echo '</p></li>';
} else {
// End $is_nginx. Construct an .htaccess file instead:
$ms_files_rewriting = '';
if (is_multisite() && get_site_option('ms_files_rewriting')) {
$ms_files_rewriting = "\n# uploaded files\nRewriteRule ^";
$ms_files_rewriting .= $subdir_match . "files/(.+) {$rewrite_base}" . WPINC . "/ms-files.php?file={$subdir_replacement_12} [L]" . "\n";
}
$htaccess_file = <<<EOF
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
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 id="network-htaccess-rules-description">';
printf(
/* translators: 1: File name (.htaccess or web.config), 2: File path. */
__('Add the following to your %1$s file in %2$s, <strong>replacing</strong> other WordPress rules:'),
'<code>.htaccess</code>',
'<code>' . $home_path . '</code>'
);
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>';
}
?>
<p class="configuration-rules-label"><label for="network-htaccess-rules">
<?php
printf(
/* translators: %s: File name (wp-config.php, .htaccess or web.config). */
__('Network configuration rules for %s'),
'<code>.htaccess</code>'
);
?>
</label></p>
<textarea id="network-htaccess-rules" class="code" readonly="readonly" cols="100" rows="<?php
echo substr_count($htaccess_file, "\n") + 1;
?>" aria-describedby="network-htaccess-rules-description"><?php
echo esc_textarea($htaccess_file);
?></textarea>
</li>
</ol>
<?php
}
// End IIS/Nginx/Apache code branches.
if (!is_multisite()) {
?>
<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>
<?php
}
}