Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/class-plugin-directory.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/class-plugin-directory.php	(revision a2405c5d826e74b9ba5350c3d2d7506c132c476a)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/class-plugin-directory.php	(revision )
@@ -43,6 +43,7 @@
 		add_filter( 'single_term_title', array( $this, 'filter_single_term_title' ) );
 		add_filter( 'the_content', array( $this, 'filter_rel_nofollow' ) );
 		add_action( 'wp_head', array( Template::class, 'json_ld_schema' ), 1 );
+		add_action( 'wp_head', array( Template::class, 'output_meta' ), 1 );
 
 		// Cron tasks.
 		new Jobs\Manager();
@@ -298,7 +299,7 @@
 		) );
 		register_post_status( 'disabled', array(
 			'label'                     => _x( 'Disabled', 'plugin status', 'wporg-plugins' ),
-			'public'                    => false,
+			'public'                    => true,
 			'show_in_admin_status_list' => current_user_can( 'plugin_disable' ),
 			'label_count'               => _n_noop( 'Disabled <span class="count">(%s)</span>', 'Disabled <span class="count">(%s)</span>', 'wporg-plugins' ),
 		) );
@@ -786,6 +787,12 @@
 			}, 10, 2 );
 		}
 
+		// Allow anyone to view a disabled plugin directly from its page. It won't show in search results or lists.
+		if ( !empty( $wp_query->query_vars['name'] ) ) {
+			$wp_query->query_vars['post_status'][] = 'disabled';
+			$wp_query->query_vars['post_status'] = array_unique( $wp_query->query_vars['post_status'] );
+		}
+
 		// By default, all archives are sorted by active installs
 		if ( $wp_query->is_archive() && empty( $wp_query->query_vars['orderby'] ) ) {
 			$wp_query->query_vars['orderby']  = 'meta_value_num';
Index: wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/template-parts/plugin-single.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/template-parts/plugin-single.php	(revision a2405c5d826e74b9ba5350c3d2d7506c132c476a)
+++ wordpress.org/public_html/wp-content/themes/pub/wporg-plugins/template-parts/plugin-single.php	(revision )
@@ -95,7 +95,9 @@
 				</div>
 			<?php endif; ?>
 
+			<?php if ( get_post_status() !== 'disabled' || current_user_can( 'plugin_admin_view', get_post() ) ) : ?>
 			<a class="plugin-download button download-button button-large" href="<?php echo esc_url( Template::download_link() ); ?>"><?php _e( 'Download', 'wporg-plugins' ); ?></a>
+			<?php endif; ?>
 		</div>
 
 		<?php the_title( '<h1 class="plugin-title"><a href="' . esc_url( get_permalink() ) . '">', '</a></h1>' ); ?>
Index: wordpress.org/public_html/wp-content/plugins/plugin-directory/class-template.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- wordpress.org/public_html/wp-content/plugins/plugin-directory/class-template.php	(revision a2405c5d826e74b9ba5350c3d2d7506c132c476a)
+++ wordpress.org/public_html/wp-content/plugins/plugin-directory/class-template.php	(revision )
@@ -45,16 +45,24 @@
 		endif;
 
 		// Schema for plugin pages.
-		if ( is_singular( 'plugin' ) ) :
-			$plugin = get_queried_object();
+		if ( is_singular( 'plugin' ) && get_post_status( get_queried_object_id() ) !== 'disabled' ) {
+			self::plugin_json_jd_schema( get_queried_object() );
+		}
+	}
 
-			$rating      = get_post_meta( $plugin->ID, 'rating', true ) ?: 0;
-			$ratings     = get_post_meta( $plugin->ID, 'ratings', true ) ?: [];
-			$num_ratings = array_sum( $ratings );
+	/**
+	 * Prints JSON LD schema for a specific plugin
+	 *
+	 * @param \WP_Post $plugin Plugin to output JSON LD Schema for.
+	 */
+	protected static function plugin_json_jd_schema( $plugin ) {
+		$rating      = get_post_meta( $plugin->ID, 'rating', true ) ?: 0;
+		$ratings     = get_post_meta( $plugin->ID, 'ratings', true ) ?: [];
+		$num_ratings = array_sum( $ratings );
 
-			echo PHP_EOL;
-			?>
-<script type="application/ld+json">
+		echo PHP_EOL;
+		?>
+		<script type="application/ld+json">
 	[
 		{
 			"@context": "http://schema.org",
@@ -114,8 +122,21 @@
 		}
 	]
 </script>
-			<?php
-		endif;
+		<?php
+	}
+
+	/**
+	 * Prints meta tags on a page.
+	 */
+	public static function output_meta() {
+		$metas = [];
+
+		// Add noindex on disabled plugin page.
+		if ( is_singular( 'plugin' ) && get_post_status( get_queried_object_id() ) === 'disabled' ) {
+			$metas[] = '<meta name="robots" content="noindex" />';
+		}
+
+		echo implode( PHP_EOL, $metas );
 	}
 
 	/**
