diff --git src/wp-admin/css/list-tables.css src/wp-admin/css/list-tables.css
index 8d78983993..dce42a4ea4 100644
--- src/wp-admin/css/list-tables.css
+++ src/wp-admin/css/list-tables.css
@@ -1510,10 +1510,28 @@ div.action-links,
 	content: "\f158";
 }

+.plugin-card .column-compatibility .compatibility-incompatible:before {
+	color: #f00;
+}
+
 .plugin-card .compatibility-compatible:before {
 	content: "\f147";
 }

+.plugin-card .column-compatibility .compatibility-compatible:before {
+	color: #008000;
+}
+
+.plugin-card .notice-error.incompatible {
+	margin: 12px 20px 0 20px;
+	padding: 12px 20px;
+	border-left: 5px solid #dc3232;
+}
+
+.plugin-card .notice-error.incompatible a {
+	text-decoration: underline;
+}
+
 .plugin-icon {
 	position: absolute;
 	top: 20px;
diff --git src/wp-admin/includes/class-wp-plugin-install-list-table.php src/wp-admin/includes/class-wp-plugin-install-list-table.php
index a19729b1d4..bc592729d7 100644
--- src/wp-admin/includes/class-wp-plugin-install-list-table.php
+++ src/wp-admin/includes/class-wp-plugin-install-list-table.php
@@ -496,6 +496,12 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 				$author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '</cite>';
 			}

+			$wp_version = get_bloginfo( 'version' );
+
+			$compatible_php = ( empty( $plugin['requires_php'] ) || version_compare( substr( PHP_VERSION, 0, strlen( $plugin['requires_php'] ) ), $plugin['requires_php'], '>=' ) );
+			$tested_wp      = ( empty( $plugin['tested'] ) || version_compare( substr( $wp_version, 0, strlen( $plugin['tested'] ) ), $plugin['tested'], '<=' ) );
+			$compatible_wp  = ( empty( $plugin['requires'] ) || version_compare( substr( $wp_version, 0, strlen( $plugin['requires'] ) ), $plugin['requires'], '>=' ) );
+
 			$action_links = array();

 			if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {
@@ -504,15 +510,22 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 				switch ( $status['status'] ) {
 					case 'install':
 						if ( $status['url'] ) {
-							$action_links[] = sprintf(
-								'<a class="install-now button" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
-								esc_attr( $plugin['slug'] ),
-								esc_url( $status['url'] ),
-								/* translators: %s: plugin name and version */
-								esc_attr( sprintf( __( 'Install %s now' ), $name ) ),
-								esc_attr( $name ),
-								__( 'Install Now' )
-							);
+							if ( $compatible_php && $compatible_wp ) {
+								$action_links[] = sprintf(
+									'<a class="install-now button" data-slug="%s" href="%s" aria-label="%s" data-name="%s">%s</a>',
+									esc_attr( $plugin['slug'] ),
+									esc_url( $status['url'] ),
+									/* translators: %s: plugin name and version */
+									esc_attr( sprintf( __( 'Install %s now' ), $name ) ),
+									esc_attr( $name ),
+									__( 'Install Now' )
+								);
+							} else {
+								$action_links[] = sprintf(
+									'<button type="button" class="button button-disabled" disabled="disabled">%s</button>',
+									_x( 'Cannot Install', 'plugin' )
+								);
+							}
 						}
 						break;

@@ -610,6 +623,47 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 			$last_updated_timestamp = strtotime( $plugin['last_updated'] );
 		?>
 		<div class="plugin-card plugin-card-<?php echo sanitize_html_class( $plugin['slug'] ); ?>">
+			<?php
+			if ( ! $compatible_php || ! $compatible_wp ) {
+				// Remove style section for commit.
+				echo '<style>
+				.plugin-card .notice-error.incompatible {
+					margin: 12px 20px 0 20px;
+					padding: 12px 20px;
+					border-left: 5px solid #dc3232;
+				}
+				.plugin-card .notice-error.incompatible a { text-decoration: underline; }
+				.plugin-card .column-compatibility .compatibility-incompatible:before { color: #f00; }
+				.plugin-card .column-compatibility .compatibility-compatible:before { color: #008000; }
+				</style>';
+				// End remove for commit.
+
+				echo '<div class="notice-error notice-alt incompatible">';
+				if ( ! $compatible_php && ! $compatible_wp ) {
+					echo __( 'This plugin doesn&#8217;t work with your versions of WordPress and PHP. ' );
+					printf(
+						/* translators: 1: link to update-core.php 2: Updating PHP page URL */
+						__( '<a href="%1$s">Please update WordPress</a>, and then <a href="%2$s">learn more about updating PHP.</a>' ),
+						self_admin_url( 'update-core.php' ),
+						esc_url( __( 'https://wordpress.org/support/upgrade-php/' ) )
+					);
+				} elseif ( ! $compatible_wp ) {
+					echo __( 'This plugin doesn&#8217;t work with your version of WordPress. ' );
+					printf(
+						/* translators: %s: Link to update-core.php */
+						__( '<a href="%s" >Please update WordPress.</a>' ),
+						self_admin_url( 'update-core.php' )
+					);
+				} elseif ( ! $compatible_php  ) {
+					echo __( 'This plugin doesn&#8217;t work with your version of PHP. ' );
+					printf(
+						/* translators: %s: Updating PHP page URL */
+						__( '<a href="%s">Learn more about updating PHP.</a>' ),
+						esc_url( __( 'https://wordpress.org/support/upgrade-php/' ) )
+					);
+				}
+				echo '</div>';
+			} ?>
 			<div class="plugin-card-top">
 				<div class="name column-name">
 					<h3>
@@ -623,8 +677,7 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 					<?php
 					if ( $action_links ) {
 						echo '<ul class="plugin-action-buttons"><li>' . implode( '</li><li>', $action_links ) . '</li></ul>';
-					}
-					?>
+					} ?>
 				</div>
 				<div class="desc column-description">
 					<p><?php echo $description; ?></p>
@@ -641,7 +694,7 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 							'number' => $plugin['num_ratings'],
 						)
 					);
-?>
+					?>
 					<span class="num-ratings" aria-hidden="true">(<?php echo number_format_i18n( $plugin['num_ratings'] ); ?>)</span>
 				</div>
 				<div class="column-updated">
@@ -665,16 +718,13 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 				</div>
 				<div class="column-compatibility">
 					<?php
-					$wp_version = get_bloginfo( 'version' );
-
-					if ( ! empty( $plugin['tested'] ) && version_compare( substr( $wp_version, 0, strlen( $plugin['tested'] ) ), $plugin['tested'], '>' ) ) {
+					if ( ! $tested_wp ) {
 						echo '<span class="compatibility-untested">' . __( 'Untested with your version of WordPress' ) . '</span>';
-					} elseif ( ! empty( $plugin['requires'] ) && version_compare( substr( $wp_version, 0, strlen( $plugin['requires'] ) ), $plugin['requires'], '<' ) ) {
+					} elseif ( ! $compatible_wp ) {
 						echo '<span class="compatibility-incompatible">' . __( '<strong>Incompatible</strong> with your version of WordPress' ) . '</span>';
 					} else {
 						echo '<span class="compatibility-compatible">' . __( '<strong>Compatible</strong> with your version of WordPress' ) . '</span>';
-					}
-					?>
+					} ?>
 				</div>
 			</div>
 		</div>
diff --git src/wp-admin/includes/plugin-install.php src/wp-admin/includes/plugin-install.php
index f765fb286e..8dc21f5a9b 100644
--- src/wp-admin/includes/plugin-install.php
+++ src/wp-admin/includes/plugin-install.php
@@ -753,10 +753,21 @@ if ( ! empty( $api->contributors ) ) {
 	<?php
 	$wp_version = get_bloginfo( 'version' );

-	if ( ! empty( $api->tested ) && version_compare( substr( $wp_version, 0, strlen( $api->tested ) ), $api->tested, '>' ) ) {
-		echo '<div class="notice notice-warning notice-alt"><p>' . __( '<strong>Warning:</strong> This plugin has <strong>not been tested</strong> with your current version of WordPress.' ) . '</p></div>';
-	} elseif ( ! empty( $api->requires ) && version_compare( substr( $wp_version, 0, strlen( $api->requires ) ), $api->requires, '<' ) ) {
-		echo '<div class="notice notice-warning notice-alt"><p>' . __( '<strong>Warning:</strong> This plugin has <strong>not been marked as compatible</strong> with your version of WordPress.' ) . '</p></div>';
+	$compatible_php = ( empty( $api->requires_php ) || version_compare( substr( PHP_VERSION, 0, strlen( $api->requires_php ) ), $api->requires_php, '>=' ) );
+	$tested_wp      = ( empty( $api->tested ) || version_compare( substr( $wp_version, 0, strlen( $api->tested ) ), $api->tested, '<=' ) );
+	$compatible_wp  = ( empty( $api->requires ) || version_compare( substr( $wp_version, 0, strlen( $api->requires ) ), $api->requires, '>=' ) );
+
+	if ( ! $tested_wp ) {
+		echo '<div class="notice notice-warning notice-alt"><p>' . __( '<strong>Warning:</strong> This plugin <strong>has not been tested</strong> with your current version of WordPress.' ) . '</p></div>';
+	} elseif ( ! $compatible_wp ) {
+		echo '<div class="notice notice-error notice-alt"><p>' . __( '<strong>Error:</strong> This plugin <strong>doesn&#8217;t work</strong> with your version of WordPress.' ) . '</p></div>';
+	}
+	if ( ! $compatible_php ) {
+		echo '<div class="notice notice-error notice-alt"><p>' . sprintf(
+			/* translators: %s: Updating PHP page URL */
+			__( '<strong>Error:</strong> This plugin <strong>requires a newer version of PHP</strong>, so unfortunately you cannot install it. <a href="%s">Learn more about updating PHP.</a>' ),
+			esc_url( __( 'https://wordpress.org/support/upgrade-php/' ) )
+		) . '</p></div>';
 	}

 	foreach ( (array) $api->sections as $section_name => $content ) {
@@ -780,7 +791,14 @@ if ( ! empty( $api->contributors ) ) {
 		switch ( $status['status'] ) {
 			case 'install':
 				if ( $status['url'] ) {
-					echo '<a data-slug="' . esc_attr( $api->slug ) . '" id="plugin_install_from_iframe" class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __( 'Install Now' ) . '</a>';
+					if ( $compatible_php && $compatible_wp ) {
+						echo '<a data-slug="' . esc_attr( $api->slug ) . '" id="plugin_install_from_iframe" class="button button-primary right" href="' . $status['url'] . '" target="_parent">' . __( 'Install Now' ) . '</a>';
+					} else {
+						printf(
+							'<button type="button" class="button button-primary button-disabled right" disabled="disabled">%s</button>',
+							_x( 'Cannot Install', 'plugin' )
+						);
+					}
 				}
 				break;
 			case 'update_available':
