diff --git src/wp-admin/css/list-tables-rtl.css src/wp-admin/css/list-tables-rtl.css
index 468dcbf8a1..5a1b371c4e 100644
--- src/wp-admin/css/list-tables-rtl.css
+++ src/wp-admin/css/list-tables-rtl.css
@@ -1510,10 +1510,31 @@ 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-incompatible {
+	color: #fff;
+	background-color:#C62D2D;
+	border: 1px solid #B02828;
+	padding: 10px;
+	margin: -12px -20px;
+}
+
+.plugin-card-incompatible a {
+	color: #fff;
+	text-decoration: underline;
+}
+
 .plugin-icon {
 	position: absolute;
 	top: 20px;
diff --git src/wp-admin/css/list-tables.css src/wp-admin/css/list-tables.css
index 8d78983993..55fa10cc06 100644
--- src/wp-admin/css/list-tables.css
+++ src/wp-admin/css/list-tables.css
@@ -1510,10 +1510,31 @@ 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-incompatible {
+	color: #fff;
+	background-color:#C62D2D;
+	border: 1px solid #B02828;
+	padding: 10px;
+	margin: -12px -20px;
+}
+
+.plugin-card-incompatible a {
+	color: #fff;
+	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..cf3b5e781c 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,14 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 				$author = ' <cite>' . sprintf( __( 'By %s' ), $author ) . '</cite>';
 			}
 
+			$wp_version = get_bloginfo( 'version' );
+
+			$tested_php     = ! empty( $plugin['requires_php'] );
+			$compatible_php = ( ! $tested_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'], '>=' ) );
+			$can_install    = ( ! $tested_php || $compatible_php ) && $compatible_wp;
+
 			$action_links = array();
 
 			if ( current_user_can( 'install_plugins' ) || current_user_can( 'update_plugins' ) ) {
@@ -504,15 +512,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 ( $can_install ) {
+								$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;
 
@@ -632,7 +647,37 @@ class WP_Plugin_Install_List_Table extends WP_List_Table {
 				</div>
 			</div>
 			<div class="plugin-card-bottom">
-				<div class="vers column-rating">
+			<?php
+			if ( ! $can_install ) {
+				echo '<div class="plugin-card-incompatible">';
+
+				// Remove this section for commit.
+				echo '<style>.plugin-card-incompatible {
+					color: #fff;
+					background-color:#C62D2D;
+					border: 1px solid #B02828;
+					padding: 10px;
+					margin: -12px -20px;
+				}
+				.plugin-card-incompatible a { color: #fff; text-decoration: underline;}
+				</style>';
+				// End remove for commit.
+
+				echo '<span class="dashicons dashicons-warning"></span>&nbsp;';
+				_e( 'This plugin is incompatible and cannot be installed.' );
+				echo '&nbsp;';
+				printf(
+					'<a href="%s" class="thickbox open-plugin-details-modal" aria-label="%s" data-title="%s">%s</a>',
+					esc_url( $details_link ),
+					/* translators: %s: plugin name and version */
+					esc_attr( sprintf( __( 'More information about %s' ), $name ) ),
+					esc_attr( $name ),
+					__( 'Why?' )
+				);
+				echo '</div></div></div>';
+				continue;
+			} ?>
+			<div class="vers column-rating">
 					<?php
 					wp_star_rating(
 						array(
@@ -641,7 +686,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">
@@ -664,17 +709,6 @@ 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'], '>' ) ) {
-						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'], '<' ) ) {
-						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..da187ed07f 100644
--- src/wp-admin/includes/plugin-install.php
+++ src/wp-admin/includes/plugin-install.php
@@ -753,10 +753,23 @@ 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>';
+	$tested_php     = ! empty( $api->requires_php );
+	$compatible_php = ( ! $tested_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, '>=' ) );
+	$can_install    = ( ! $tested_php || $compatible_php ) && $compatible_wp;
+
+	if ( ! $compatible_php && $tested_php ) {
+		echo '<div class="notice notice-error notice-alt"><p>' . sprintf(
+			/* translators: Upgrading 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">Click here to learn more about upgrading PHP.</a>' ),
+			esc_url( __( 'https://wordpress.org/support/upgrade-php/' ) )
+		) . '</p></div>';
+	}
+	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>has not been marked as compatible</strong> with your version of WordPress.' ) . '</p></div>';
 	}
 
 	foreach ( (array) $api->sections as $section_name => $content ) {
@@ -779,8 +792,13 @@ if ( ! empty( $api->contributors ) ) {
 		$status = install_plugin_install_status( $api );
 		switch ( $status['status'] ) {
 			case 'install':
-				if ( $status['url'] ) {
+				if ( $can_install ) {
 					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':
