wp/wp-admin/options-permalink.php
changeset 21 48c4eec2b7e6
parent 19 3d72ae0968f4
--- a/wp/wp-admin/options-permalink.php	Thu Sep 29 08:06:27 2022 +0200
+++ b/wp/wp-admin/options-permalink.php	Fri Sep 05 18:40:08 2025 +0200
@@ -57,14 +57,14 @@
 );
 
 $help_sidebar_content = '<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
-						'<p>' . __( '<a href="https://wordpress.org/support/article/settings-permalinks-screen/">Documentation on Permalinks Settings</a>' ) . '</p>' .
-						'<p>' . __( '<a href="https://wordpress.org/support/article/using-permalinks/">Documentation on Using Permalinks</a>' ) . '</p>';
+	'<p>' . __( '<a href="https://wordpress.org/documentation/article/settings-permalinks-screen/">Documentation on Permalinks Settings</a>' ) . '</p>' .
+	'<p>' . __( '<a href="https://wordpress.org/documentation/article/customize-permalinks/">Documentation on Using Permalinks</a>' ) . '</p>';
 
 if ( $is_nginx ) {
-	$help_sidebar_content .= '<p>' . __( '<a href="https://wordpress.org/support/article/nginx/">Documentation on Nginx configuration</a>.' ) . '</p>';
+	$help_sidebar_content .= '<p>' . __( '<a href="https://developer.wordpress.org/advanced-administration/server/web-server/nginx/">Documentation on Nginx configuration</a>.' ) . '</p>';
 }
 
-$help_sidebar_content .= '<p>' . __( '<a href="https://wordpress.org/support/">Support</a>' ) . '</p>';
+$help_sidebar_content .= '<p>' . __( '<a href="https://wordpress.org/support/forums/">Support forums</a>' ) . '</p>';
 
 get_current_screen()->set_help_sidebar( $help_sidebar_content );
 unset( $help_sidebar_content );
@@ -73,10 +73,11 @@
 $iis7_permalinks     = iis7_supports_permalinks();
 $permalink_structure = get_option( 'permalink_structure' );
 
-$prefix      = '';
-$blog_prefix = '';
+$index_php_prefix = '';
+$blog_prefix      = '';
+
 if ( ! got_url_rewrite() ) {
-	$prefix = '/index.php';
+	$index_php_prefix = '/index.php';
 }
 
 /*
@@ -85,7 +86,9 @@
  * network. If the `permalink_structure` option has been changed to remove this
  * base prefix, WordPress core can no longer account for the possible collision.
  */
-if ( is_multisite() && ! is_subdomain_install() && is_main_site() && 0 === strpos( $permalink_structure, '/blog/' ) ) {
+if ( is_multisite() && ! is_subdomain_install() && is_main_site()
+	&& str_starts_with( $permalink_structure, '/blog/' )
+) {
 	$blog_prefix = '/blog';
 }
 
@@ -107,8 +110,9 @@
 
 		if ( ! empty( $permalink_structure ) ) {
 			$permalink_structure = preg_replace( '#/+#', '/', '/' . str_replace( '#', '', $permalink_structure ) );
-			if ( $prefix && $blog_prefix ) {
-				$permalink_structure = $prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
+
+			if ( $index_php_prefix && $blog_prefix ) {
+				$permalink_structure = $index_php_prefix . preg_replace( '#^/?index\.php#', '', $permalink_structure );
 			} else {
 				$permalink_structure = $blog_prefix . $permalink_structure;
 			}
@@ -143,15 +147,19 @@
 }
 
 if ( $iis7_permalinks ) {
-	if ( ( ! file_exists( $home_path . 'web.config' ) && win_is_writable( $home_path ) ) || win_is_writable( $home_path . 'web.config' ) ) {
+	if ( ( ! file_exists( $home_path . 'web.config' )
+		&& win_is_writable( $home_path ) ) || win_is_writable( $home_path . 'web.config' )
+	) {
 		$writable = true;
 	} else {
 		$writable = false;
 	}
-} elseif ( $is_nginx ) {
+} elseif ( $is_nginx || $is_caddy ) {
 	$writable = false;
 } else {
-	if ( ( ! file_exists( $home_path . '.htaccess' ) && is_writable( $home_path ) ) || is_writable( $home_path . '.htaccess' ) ) {
+	if ( ( ! file_exists( $home_path . '.htaccess' )
+		&& is_writable( $home_path ) ) || is_writable( $home_path . '.htaccess' )
+	) {
 		$writable = true;
 	} else {
 		$writable       = false;
@@ -182,7 +190,7 @@
 					'<code>web.config</code>'
 				);
 			}
-		} elseif ( ! $is_nginx && $htaccess_update_required && ! $writable ) {
+		} elseif ( ! $is_nginx && ! $is_caddy && $htaccess_update_required && ! $writable ) {
 			$message = sprintf(
 				/* translators: %s: .htaccess */
 				__( 'You should update your %s file now.' ),
@@ -195,7 +203,7 @@
 		add_settings_error( 'general', 'settings_updated', $message, 'success' );
 	}
 
-	set_transient( 'settings_errors', get_settings_errors(), 30 );
+	set_transient( 'settings_errors', get_settings_errors(), 30 ); // 30 seconds.
 
 	wp_redirect( admin_url( 'options-permalink.php?settings-updated=true' ) );
 	exit;
@@ -211,145 +219,231 @@
 <form name="form" action="options-permalink.php" method="post">
 <?php wp_nonce_field( 'update-permalink' ); ?>
 
-	<p>
-	<?php
-		printf(
-			/* translators: %s: Documentation URL. */
-			__( 'WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A <a href="%s">number of tags are available</a>, and here are some examples to get you started.' ),
-			__( 'https://wordpress.org/support/article/using-permalinks/' )
-		);
-		?>
-	</p>
+<p>
+<?php
+printf(
+	/* translators: %s: Documentation URL. */
+	__( 'WordPress offers you the ability to create a custom URL structure for your permalinks and archives. Custom URL structures can improve the aesthetics, usability, and forward-compatibility of your links. A <a href="%s">number of tags are available</a>, and here are some examples to get you started.' ),
+	__( 'https://wordpress.org/documentation/article/customize-permalinks/' )
+);
+?>
+</p>
 
 <?php
-if ( is_multisite() && ! is_subdomain_install() && is_main_site() && 0 === strpos( $permalink_structure, '/blog/' ) ) {
+if ( is_multisite() && ! is_subdomain_install() && is_main_site()
+	&& str_starts_with( $permalink_structure, '/blog/' )
+) {
 	$permalink_structure = preg_replace( '|^/?blog|', '', $permalink_structure );
 	$category_base       = preg_replace( '|^/?blog|', '', $category_base );
 	$tag_base            = preg_replace( '|^/?blog|', '', $tag_base );
 }
 
-$structures = array(
-	0 => '',
-	1 => $prefix . '/%year%/%monthnum%/%day%/%postname%/',
-	2 => $prefix . '/%year%/%monthnum%/%postname%/',
-	3 => $prefix . '/' . _x( 'archives', 'sample permalink base' ) . '/%post_id%',
-	4 => $prefix . '/%postname%/',
+$url_base = home_url( $blog_prefix . $index_php_prefix );
+
+$default_structures = array(
+	array(
+		'id'      => 'plain',
+		'label'   => __( 'Plain' ),
+		'value'   => '',
+		'example' => home_url( '/?p=123' ),
+	),
+	array(
+		'id'      => 'day-name',
+		'label'   => __( 'Day and name' ),
+		'value'   => $index_php_prefix . '/%year%/%monthnum%/%day%/%postname%/',
+		'example' => $url_base . '/' . gmdate( 'Y/m/d' ) . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/',
+	),
+	array(
+		'id'      => 'month-name',
+		'label'   => __( 'Month and name' ),
+		'value'   => $index_php_prefix . '/%year%/%monthnum%/%postname%/',
+		'example' => $url_base . '/' . gmdate( 'Y/m' ) . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/',
+	),
+	array(
+		'id'      => 'numeric',
+		'label'   => __( 'Numeric' ),
+		'value'   => $index_php_prefix . '/' . _x( 'archives', 'sample permalink base' ) . '/%post_id%',
+		'example' => $url_base . '/' . _x( 'archives', 'sample permalink base' ) . '/123',
+	),
+	array(
+		'id'      => 'post-name',
+		'label'   => __( 'Post name' ),
+		'value'   => $index_php_prefix . '/%postname%/',
+		'example' => $url_base . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/',
+	),
 );
+
+$default_structure_values = wp_list_pluck( $default_structures, 'value' );
+
+$available_tags = array(
+	/* translators: %s: Permalink structure tag. */
+	'year'     => __( '%s (The year of the post, four digits, for example 2004.)' ),
+	/* translators: %s: Permalink structure tag. */
+	'monthnum' => __( '%s (Month of the year, for example 05.)' ),
+	/* translators: %s: Permalink structure tag. */
+	'day'      => __( '%s (Day of the month, for example 28.)' ),
+	/* translators: %s: Permalink structure tag. */
+	'hour'     => __( '%s (Hour of the day, for example 15.)' ),
+	/* translators: %s: Permalink structure tag. */
+	'minute'   => __( '%s (Minute of the hour, for example 43.)' ),
+	/* translators: %s: Permalink structure tag. */
+	'second'   => __( '%s (Second of the minute, for example 33.)' ),
+	/* translators: %s: Permalink structure tag. */
+	'post_id'  => __( '%s (The unique ID of the post, for example 423.)' ),
+	/* translators: %s: Permalink structure tag. */
+	'postname' => __( '%s (The sanitized post title (slug).)' ),
+	/* translators: %s: Permalink structure tag. */
+	'category' => __( '%s (Category slug. Nested sub-categories appear as nested directories in the URL.)' ),
+	/* translators: %s: Permalink structure tag. */
+	'author'   => __( '%s (A sanitized version of the author name.)' ),
+);
+
+/**
+ * Filters the list of available permalink structure tags on the Permalinks settings page.
+ *
+ * @since 4.9.0
+ *
+ * @param string[] $available_tags An array of key => value pairs of available permalink structure tags.
+ */
+$available_tags = apply_filters( 'available_permalink_structure_tags', $available_tags );
+
+/* translators: %s: Permalink structure tag. */
+$tag_added = __( '%s added to permalink structure' );
+/* translators: %s: Permalink structure tag. */
+$tag_removed = __( '%s removed from permalink structure' );
+/* translators: %s: Permalink structure tag. */
+$tag_already_used = __( '%s (already used in permalink structure)' );
 ?>
 <h2 class="title"><?php _e( 'Common Settings' ); ?></h2>
-<table class="form-table permalink-structure">
-	<tr>
-		<th scope="row"><label><input name="selection" type="radio" value="" <?php checked( '', $permalink_structure ); ?> /> <?php _e( 'Plain' ); ?></label></th>
-		<td><code><?php echo get_option( 'home' ); ?>/?p=123</code></td>
-	</tr>
-	<tr>
-		<th scope="row"><label><input name="selection" type="radio" value="<?php echo esc_attr( $structures[1] ); ?>" <?php checked( $structures[1], $permalink_structure ); ?> /> <?php _e( 'Day and name' ); ?></label></th>
-		<td><code><?php echo get_option( 'home' ) . $blog_prefix . $prefix . '/' . gmdate( 'Y' ) . '/' . gmdate( 'm' ) . '/' . gmdate( 'd' ) . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/'; ?></code></td>
-	</tr>
-	<tr>
-		<th scope="row"><label><input name="selection" type="radio" value="<?php echo esc_attr( $structures[2] ); ?>" <?php checked( $structures[2], $permalink_structure ); ?> /> <?php _e( 'Month and name' ); ?></label></th>
-		<td><code><?php echo get_option( 'home' ) . $blog_prefix . $prefix . '/' . gmdate( 'Y' ) . '/' . gmdate( 'm' ) . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/'; ?></code></td>
-	</tr>
-	<tr>
-		<th scope="row"><label><input name="selection" type="radio" value="<?php echo esc_attr( $structures[3] ); ?>" <?php checked( $structures[3], $permalink_structure ); ?> /> <?php _e( 'Numeric' ); ?></label></th>
-		<td><code><?php echo get_option( 'home' ) . $blog_prefix . $prefix . '/' . _x( 'archives', 'sample permalink base' ) . '/123'; ?></code></td>
-	</tr>
-	<tr>
-		<th scope="row"><label><input name="selection" type="radio" value="<?php echo esc_attr( $structures[4] ); ?>" <?php checked( $structures[4], $permalink_structure ); ?> /> <?php _e( 'Post name' ); ?></label></th>
-		<td><code><?php echo get_option( 'home' ) . $blog_prefix . $prefix . '/' . _x( 'sample-post', 'sample permalink structure' ) . '/'; ?></code></td>
-	</tr>
-	<tr>
-		<th scope="row">
-			<label><input name="selection" id="custom_selection" type="radio" value="custom" <?php checked( ! in_array( $permalink_structure, $structures, true ) ); ?> />
-			<?php _e( 'Custom Structure' ); ?>
-			</label>
-		</th>
-		<td>
-			<code><?php echo get_option( 'home' ) . $blog_prefix; ?></code>
-			<input name="permalink_structure" id="permalink_structure" type="text" value="<?php echo esc_attr( $permalink_structure ); ?>" class="regular-text code" />
-			<div class="available-structure-tags hide-if-no-js">
-				<div id="custom_selection_updated" aria-live="assertive" class="screen-reader-text"></div>
+<p>
+<?php
+printf(
+	/* translators: %s: %postname% */
+	__( 'Select the permalink structure for your website. Including the %s tag makes links easy to understand, and can help your posts rank higher in search engines.' ),
+	'<code>%postname%</code>'
+);
+?>
+</p>
+<table class="form-table permalink-structure" role="presentation">
+<tbody>
+<tr>
+	<th scope="row"><?php _e( 'Permalink structure' ); ?></th>
+	<td>
+		<fieldset class="structure-selection">
+			<legend class="screen-reader-text">
 				<?php
-				$available_tags = array(
-					/* translators: %s: Permalink structure tag. */
-					'year'     => __( '%s (The year of the post, four digits, for example 2004.)' ),
-					/* translators: %s: Permalink structure tag. */
-					'monthnum' => __( '%s (Month of the year, for example 05.)' ),
-					/* translators: %s: Permalink structure tag. */
-					'day'      => __( '%s (Day of the month, for example 28.)' ),
-					/* translators: %s: Permalink structure tag. */
-					'hour'     => __( '%s (Hour of the day, for example 15.)' ),
-					/* translators: %s: Permalink structure tag. */
-					'minute'   => __( '%s (Minute of the hour, for example 43.)' ),
-					/* translators: %s: Permalink structure tag. */
-					'second'   => __( '%s (Second of the minute, for example 33.)' ),
-					/* translators: %s: Permalink structure tag. */
-					'post_id'  => __( '%s (The unique ID of the post, for example 423.)' ),
-					/* translators: %s: Permalink structure tag. */
-					'postname' => __( '%s (The sanitized post title (slug).)' ),
-					/* translators: %s: Permalink structure tag. */
-					'category' => __( '%s (Category slug. Nested sub-categories appear as nested directories in the URL.)' ),
-					/* translators: %s: Permalink structure tag. */
-					'author'   => __( '%s (A sanitized version of the author name.)' ),
-				);
+				/* translators: Hidden accessibility text. */
+				_e( 'Permalink structure' );
+				?>
+			</legend>
+			<?php foreach ( $default_structures as $input ) : ?>
+			<div class="row">
+				<input id="permalink-input-<?php echo esc_attr( $input['id'] ); ?>"
+					name="selection" aria-describedby="permalink-<?php echo esc_attr( $input['id'] ); ?>"
+					type="radio" value="<?php echo esc_attr( $input['value'] ); ?>"
+					<?php checked( $input['value'], $permalink_structure ); ?>
+				/>
+				<div>
+					<label for="permalink-input-<?php echo esc_attr( $input['id'] ); ?>">
+						<?php echo esc_html( $input['label'] ); ?>
+					</label>
+					<p>
+						<code id="permalink-<?php echo esc_attr( $input['id'] ); ?>">
+							<?php echo esc_html( $input['example'] ); ?>
+						</code>
+					</p>
+				</div>
+			</div><!-- .row -->
+			<?php endforeach; ?>
 
-				/**
-				 * Filters the list of available permalink structure tags on the Permalinks settings page.
-				 *
-				 * @since 4.9.0
-				 *
-				 * @param string[] $available_tags An array of key => value pairs of available permalink structure tags.
-				 */
-				$available_tags = apply_filters( 'available_permalink_structure_tags', $available_tags );
-
-				/* translators: %s: Permalink structure tag. */
-				$structure_tag_added = __( '%s added to permalink structure' );
+			<div class="row">
+				<input id="custom_selection"
+					name="selection" type="radio" value="custom"
+					<?php checked( ! in_array( $permalink_structure, $default_structure_values, true ) ); ?>
+				/>
+				<div>
+					<label for="custom_selection"><?php _e( 'Custom Structure' ); ?></label>
+					<p>
+						<label for="permalink_structure" class="screen-reader-text">
+							<?php
+							/* translators: Hidden accessibility text. */
+							_e( 'Customize permalink structure by selecting available tags' );
+							?>
+						</label>
+						<span class="code">
+							<code id="permalink-custom"><?php echo esc_url( $url_base ); ?></code>
+							<input name="permalink_structure" id="permalink_structure"
+								type="text" value="<?php echo esc_attr( $permalink_structure ); ?>"
+								aria-describedby="permalink-custom" class="regular-text code"
+							/>
+						</span>
+					</p>
 
-				/* translators: %s: Permalink structure tag. */
-				$structure_tag_already_used = __( '%s (already used in permalink structure)' );
-
-				if ( ! empty( $available_tags ) ) :
-					?>
-					<p><?php _e( 'Available tags:' ); ?></p>
-					<ul role="list">
-						<?php
-						foreach ( $available_tags as $tag => $explanation ) {
-							?>
-							<li>
-								<button type="button"
+					<div class="available-structure-tags hide-if-no-js">
+						<div id="custom_selection_updated" aria-live="assertive" class="screen-reader-text"></div>
+						<?php if ( ! empty( $available_tags ) ) : ?>
+						<fieldset>
+							<legend><?php _e( 'Available tags:' ); ?></legend>
+							<ul role="list">
+							<?php foreach ( $available_tags as $tag => $explanation ) : ?>
+								<li>
+									<button type="button"
 										class="button button-secondary"
 										aria-label="<?php echo esc_attr( sprintf( $explanation, $tag ) ); ?>"
-										data-added="<?php echo esc_attr( sprintf( $structure_tag_added, $tag ) ); ?>"
-										data-used="<?php echo esc_attr( sprintf( $structure_tag_already_used, $tag ) ); ?>">
-									<?php echo '%' . $tag . '%'; ?>
-								</button>
-							</li>
-							<?php
-						}
-						?>
-					</ul>
-				<?php endif; ?>
-			</div>
-		</td>
-	</tr>
+										data-added="<?php echo esc_attr( sprintf( $tag_added, $tag ) ); ?>"
+										data-removed="<?php echo esc_attr( sprintf( $tag_removed, $tag ) ); ?>"
+										data-used="<?php echo esc_attr( sprintf( $tag_already_used, $tag ) ); ?>">
+										<?php echo '%' . esc_html( $tag ) . '%'; ?>
+									</button>
+								</li>
+							<?php endforeach; ?>
+							</ul>
+						</fieldset>
+						<?php endif; ?>
+					</div><!-- .available-structure-tags -->
+				</div>
+			</div><!-- .row -->
+		</fieldset><!-- .structure-selection -->
+	</td>
+</tr>
+</tbody>
 </table>
 
 <h2 class="title"><?php _e( 'Optional' ); ?></h2>
 <p>
 <?php
-/* translators: %s: Placeholder that must come at the start of the URL. */
-printf( __( 'If you like, you may enter custom structures for your category and tag URLs here. For example, using <code>topics</code> as your category base would make your category links like <code>%s/topics/uncategorized/</code>. If you leave these blank the defaults will be used.' ), get_option( 'home' ) . $blog_prefix . $prefix );
+printf(
+	/* translators: %s: Placeholder that must come at the start of the URL. */
+	__( 'If you like, you may enter custom structures for your category and tag URLs here. For example, using <code>topics</code> as your category base would make your category links like <code>%s/topics/uncategorized/</code>. If you leave these blank the defaults will be used.' ),
+	$url_base
+);
 ?>
 </p>
 
 <table class="form-table" role="presentation">
 	<tr>
-		<th><label for="category_base"><?php /* translators: Prefix for category permalinks. */ _e( 'Category base' ); ?></label></th>
-		<td><?php echo $blog_prefix; ?> <input name="category_base" id="category_base" type="text" value="<?php echo esc_attr( $category_base ); ?>" class="regular-text code" /></td>
+		<th>
+			<label for="category_base">
+				<?php /* translators: Prefix for category permalinks. */ _e( 'Category base' ); ?>
+			</label>
+		</th>
+		<td>
+			<?php echo $blog_prefix; ?>
+			<input name="category_base" id="category_base" type="text"
+				value="<?php echo esc_attr( $category_base ); ?>" class="regular-text code"
+			/>
+		</td>
 	</tr>
 	<tr>
-		<th><label for="tag_base"><?php _e( 'Tag base' ); ?></label></th>
-		<td><?php echo $blog_prefix; ?> <input name="tag_base" id="tag_base" type="text" value="<?php echo esc_attr( $tag_base ); ?>" class="regular-text code" /></td>
+		<th>
+			<label for="tag_base"><?php _e( 'Tag base' ); ?></label>
+		</th>
+		<td>
+			<?php echo $blog_prefix; ?>
+			<input name="tag_base" id="tag_base" type="text"
+				value="<?php echo esc_attr( $tag_base ); ?>" class="regular-text code"
+			/>
+		</td>
 	</tr>
 	<?php do_settings_fields( 'permalink', 'optional' ); ?>
 </table>
@@ -358,30 +452,37 @@
 
 <?php submit_button(); ?>
 </form>
-<?php if ( ! is_multisite() ) { ?>
+
+<?php if ( ! is_multisite() ) : ?>
 	<?php
 	if ( $iis7_permalinks ) :
 		if ( isset( $_POST['submit'] ) && $permalink_structure && ! $using_index_permalinks && ! $writable ) :
 			if ( file_exists( $home_path . 'web.config' ) ) :
 				?>
-<p id="iis-description-a">
+				<p id="iis-description-a">
 				<?php
 				printf(
 					/* translators: 1: web.config, 2: Documentation URL, 3: Ctrl + A, 4: ⌘ + A, 5: Element code. */
 					__( '<strong>Error:</strong> Your %1$s file is not <a href="%2$s">writable</a>, so updating it automatically was not possible. This is the URL rewrite rule you should have in your %1$s file. Click in the field and press %3$s (or %4$s on Mac) to select all. Then insert this rule inside of the %5$s element in %1$s file.' ),
 					'<code>web.config</code>',
-					__( 'https://wordpress.org/support/article/changing-file-permissions/' ),
+					__( 'https://developer.wordpress.org/advanced-administration/server/file-permissions/' ),
 					'<kbd>Ctrl + A</kbd>',
 					'<kbd>⌘ + A</kbd>',
 					'<code>/&lt;configuration&gt;/&lt;system.webServer&gt;/&lt;rewrite&gt;/&lt;rules&gt;</code>'
 				);
 				?>
-</p>
-<form action="options-permalink.php" method="post">
-				<?php wp_nonce_field( 'update-permalink' ); ?>
-	<p><label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br /><textarea rows="9" class="large-text readonly" name="rules" id="rules" readonly="readonly" aria-describedby="iis-description-a"><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules() ); ?></textarea></p>
-</form>
-<p>
+				</p>
+				<form action="options-permalink.php" method="post">
+					<?php wp_nonce_field( 'update-permalink' ); ?>
+					<p>
+						<label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br />
+						<textarea rows="9" class="large-text readonly"
+							name="rules" id="rules" readonly="readonly"
+							aria-describedby="iis-description-a"
+						><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules() ); ?></textarea>
+					</p>
+				</form>
+				<p>
 				<?php
 				printf(
 					/* translators: %s: web.config */
@@ -389,59 +490,69 @@
 					'<code>web.config</code>'
 				);
 				?>
-</p>
-		<?php else : ?>
-<p id="iis-description-b">
+				</p>
+			<?php else : ?>
+				<p id="iis-description-b">
+				<?php
+				printf(
+					/* translators: 1: Documentation URL, 2: web.config, 3: Ctrl + A, 4: ⌘ + A */
+					__( '<strong>Error:</strong> The root directory of your site is not <a href="%1$s">writable</a>, so creating a file automatically was not possible. This is the URL rewrite rule you should have in your %2$s file. Create a new file called %2$s in the root directory of your site. Click in the field and press %3$s (or %4$s on Mac) to select all. Then insert this code into the %2$s file.' ),
+					__( 'https://developer.wordpress.org/advanced-administration/server/file-permissions/' ),
+					'<code>web.config</code>',
+					'<kbd>Ctrl + A</kbd>',
+					'<kbd>⌘ + A</kbd>'
+				);
+				?>
+				</p>
+				<form action="options-permalink.php" method="post">
+					<?php wp_nonce_field( 'update-permalink' ); ?>
+					<p>
+						<label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br />
+						<textarea rows="18" class="large-text readonly"
+							name="rules" id="rules" readonly="readonly"
+							aria-describedby="iis-description-b"
+						><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules( true ) ); ?></textarea>
+					</p>
+				</form>
+				<p>
+				<?php
+				printf(
+					/* translators: %s: web.config */
+					__( 'If you temporarily make your site&#8217;s root directory writable to generate the %s file automatically, do not forget to revert the permissions after the file has been created.' ),
+					'<code>web.config</code>'
+				);
+				?>
+				</p>
+			<?php endif; // End if 'web.config' exists. ?>
+		<?php endif; // End if $_POST['submit'] && ! $writable. ?>
+	<?php else : ?>
+		<?php if ( $permalink_structure && ! $using_index_permalinks && ! $writable && $htaccess_update_required ) : ?>
+			<p id="htaccess-description">
 			<?php
 			printf(
-				/* translators: 1: Documentation URL, 2: web.config, 3: Ctrl + A, 4: ⌘ + A */
-				__( '<strong>Error:</strong> The root directory of your site is not <a href="%1$s">writable</a>, so creating a file automatically was not possible. This is the URL rewrite rule you should have in your %2$s file. Create a new file called %2$s in the root directory of your site. Click in the field and press %3$s (or %4$s on Mac) to select all. Then insert this code into the %2$s file.' ),
-				__( 'https://wordpress.org/support/article/changing-file-permissions/' ),
-				'<code>web.config</code>',
+				/* translators: 1: .htaccess, 2: Documentation URL, 3: Ctrl + A, 4: ⌘ + A */
+				__( '<strong>Error:</strong> Your %1$s file is not <a href="%2$s">writable</a>, so updating it automatically was not possible. These are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s (or %4$s on Mac) to select all.' ),
+				'<code>.htaccess</code>',
+				__( 'https://developer.wordpress.org/advanced-administration/server/file-permissions/' ),
 				'<kbd>Ctrl + A</kbd>',
 				'<kbd>⌘ + A</kbd>'
 			);
 			?>
-</p>
-<form action="options-permalink.php" method="post">
-			<?php wp_nonce_field( 'update-permalink' ); ?>
-	<p><label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br /><textarea rows="18" class="large-text readonly" name="rules" id="rules" readonly="readonly" aria-describedby="iis-description-b"><?php echo esc_textarea( $wp_rewrite->iis7_url_rewrite_rules( true ) ); ?></textarea></p>
-</form>
-<p>
-			<?php
-			printf(
-				/* translators: %s: web.config */
-				__( 'If you temporarily make your site&#8217;s root directory writable to generate the %s file automatically, do not forget to revert the permissions after the file has been created.' ),
-				'<code>web.config</code>'
-			);
-			?>
-</p>
-		<?php endif; ?>
-	<?php endif; ?>
-		<?php
-else :
-	if ( $permalink_structure && ! $using_index_permalinks && ! $writable && $htaccess_update_required ) :
-		?>
-<p id="htaccess-description">
-		<?php
-		printf(
-			/* translators: 1: .htaccess, 2: Documentation URL, 3: Ctrl + A, 4: ⌘ + A */
-			__( '<strong>Error:</strong> Your %1$s file is not <a href="%2$s">writable</a>, so updating it automatically was not possible. These are the mod_rewrite rules you should have in your %1$s file. Click in the field and press %3$s (or %4$s on Mac) to select all.' ),
-			'<code>.htaccess</code>',
-			__( 'https://wordpress.org/support/article/changing-file-permissions/' ),
-			'<kbd>Ctrl + A</kbd>',
-			'<kbd>⌘ + A</kbd>'
-		);
-		?>
-</p>
-<form action="options-permalink.php" method="post">
-		<?php wp_nonce_field( 'update-permalink' ); ?>
-	<p><label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br /><textarea rows="8" class="large-text readonly" name="rules" id="rules" readonly="readonly" aria-describedby="htaccess-description"><?php echo esc_textarea( $wp_rewrite->mod_rewrite_rules() ); ?></textarea></p>
-</form>
-	<?php endif; ?>
-<?php endif; ?>
-<?php } // End if ! is_multisite(). ?>
+			</p>
+			<form action="options-permalink.php" method="post">
+				<?php wp_nonce_field( 'update-permalink' ); ?>
+				<p>
+					<label for="rules"><?php _e( 'Rewrite rules:' ); ?></label><br />
+					<textarea rows="8" class="large-text readonly"
+						name="rules" id="rules" readonly="readonly"
+						aria-describedby="htaccess-description"
+					><?php echo esc_textarea( $wp_rewrite->mod_rewrite_rules() ); ?></textarea>
+				</p>
+			</form>
+		<?php endif; // End if ! $writable && $htaccess_update_required. ?>
+	<?php endif; // End if $iis7_permalinks. ?>
+<?php endif; // End if ! is_multisite(). ?>
 
-</div>
+</div><!-- .wrap -->
 
 <?php require_once ABSPATH . 'wp-admin/admin-footer.php'; ?>