From db175a9868b404210bb7ec5bd3a579ee08ede1fd Mon Sep 17 00:00:00 2001
From: Sergey Biryukov <sergeybiryukov.ru@gmail.com>
Date: Tue, 28 Jul 2020 01:02:04 +0000
Subject: [PATCH] Themes: Display a message in theme updates list if an update
 requires a higher version of PHP or WordPress.

This applies to the WordPress Updates screen.

Props afragen, SergeyBiryukov.
Fixes #48491.
Built from https://develop.svn.wordpress.org/trunk@48654


git-svn-id: http://core.svn.wordpress.org/trunk@48416 1a063a9b-81f0-0310-95a4-ce76da25c4cd
---
 wp-admin/update-core.php | 110 ++++++++++++++++++++++++++++++++-------
 wp-includes/version.php  |   2 +-
 2 files changed, 93 insertions(+), 19 deletions(-)

diff --git a/wp-admin/update-core.php b/wp-admin/update-core.php
index dc4b9b40a2..a876d0e384 100644
--- a/wp-admin/update-core.php
+++ b/wp-admin/update-core.php
@@ -409,15 +409,15 @@ function list_plugin_updates() {
 		?>
 	<tr>
 		<td class="check-column">
-		<?php if ( $compatible_php ) : ?>
-			<input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $plugin_file ); ?>" />
-			<label for="<?php echo $checkbox_id; ?>" class="screen-reader-text">
-				<?php
-				/* translators: %s: Plugin name. */
-				printf( __( 'Select %s' ), $plugin_data->Name );
-				?>
-			</label>
-		<?php endif; ?>
+			<?php if ( $compatible_php ) : ?>
+				<input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $plugin_file ); ?>" />
+				<label for="<?php echo $checkbox_id; ?>" class="screen-reader-text">
+					<?php
+					/* translators: %s: Plugin name. */
+					printf( __( 'Select %s' ), $plugin_data->Name );
+					?>
+				</label>
+			<?php endif; ?>
 		</td>
 		<td class="plugin-title"><p>
 			<?php echo $icon; ?>
@@ -429,14 +429,16 @@ function list_plugin_updates() {
 				$plugin_data->Version,
 				$plugin_data->update->new_version
 			);
+
 			echo ' ' . $details . $compat . $upgrade_notice;
+
 			if ( in_array( $plugin_file, $auto_updates, true ) ) {
 				echo $auto_update_notice;
 			}
 			?>
 		</p></td>
 	</tr>
-		<?php
+			<?php
 	}
 	?>
 	</tbody>
@@ -499,18 +501,87 @@ function list_theme_updates() {
 	}
 
 	foreach ( $themes as $stylesheet => $theme ) {
-		$checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) );
+		$requires_wp  = isset( $theme->update['requires'] ) ? $theme->update['requires'] : null;
+		$requires_php = isset( $theme->update['requires_php'] ) ? $theme->update['requires_php'] : null;
 
+		$compatible_wp  = is_wp_version_compatible( $requires_wp );
+		$compatible_php = is_php_version_compatible( $requires_php );
+
+		$compat = '';
+
+		if ( ! $compatible_wp && ! $compatible_php ) {
+			$compat .= '<br>' . __( 'This update doesn&#8217;t work with your versions of WordPress and PHP.' ) . '&nbsp;';
+			if ( current_user_can( 'update_core' ) && current_user_can( 'update_php' ) ) {
+				$compat .= sprintf(
+					/* translators: 1: URL to WordPress Updates screen, 2: URL to Update PHP page. */
+					__( '<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( wp_get_update_php_url() )
+				);
+
+				$annotation = wp_get_update_php_annotation();
+
+				if ( $annotation ) {
+					$compat .= '</p><p><em>' . $annotation . '</em>';
+				}
+			} elseif ( current_user_can( 'update_core' ) ) {
+				$compat .= sprintf(
+					/* translators: %s: URL to WordPress Updates screen. */
+					__( '<a href="%s">Please update WordPress</a>.' ),
+					self_admin_url( 'update-core.php' )
+				);
+			} elseif ( current_user_can( 'update_php' ) ) {
+				$compat .= sprintf(
+					/* translators: %s: URL to Update PHP page. */
+					__( '<a href="%s">Learn more about updating PHP</a>.' ),
+					esc_url( wp_get_update_php_url() )
+				);
+
+				$annotation = wp_get_update_php_annotation();
+
+				if ( $annotation ) {
+					$compat .= '</p><p><em>' . $annotation . '</em>';
+				}
+			}
+		} elseif ( ! $compatible_wp ) {
+			$compat .= '<br>' . __( 'This update doesn&#8217;t work with your version of WordPress.' ) . '&nbsp;';
+			if ( current_user_can( 'update_core' ) ) {
+				$compat .= sprintf(
+					/* translators: %s: URL to WordPress Updates screen. */
+					__( '<a href="%s">Please update WordPress</a>.' ),
+					self_admin_url( 'update-core.php' )
+				);
+			}
+		} elseif ( ! $compatible_php ) {
+			$compat .= '<br>' . __( 'This update doesn&#8217;t work with your version of PHP.' ) . '&nbsp;';
+			if ( current_user_can( 'update_php' ) ) {
+				$compat .= sprintf(
+					/* translators: %s: URL to Update PHP page. */
+					__( '<a href="%s">Learn more about updating PHP</a>.' ),
+					esc_url( wp_get_update_php_url() )
+				);
+
+				$annotation = wp_get_update_php_annotation();
+
+				if ( $annotation ) {
+					$compat .= '</p><p><em>' . $annotation . '</em>';
+				}
+			}
+		}
+
+		$checkbox_id = 'checkbox_' . md5( $theme->get( 'Name' ) );
 		?>
 	<tr>
 		<td class="check-column">
-			<input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $stylesheet ); ?>" />
-			<label for="<?php echo $checkbox_id; ?>" class="screen-reader-text">
-				<?php
-				/* translators: %s: Theme name. */
-				printf( __( 'Select %s' ), $theme->display( 'Name' ) );
-				?>
-			</label>
+			<?php if ( $compatible_wp && $compatible_php ) : ?>
+				<input type="checkbox" name="checked[]" id="<?php echo $checkbox_id; ?>" value="<?php echo esc_attr( $stylesheet ); ?>" />
+				<label for="<?php echo $checkbox_id; ?>" class="screen-reader-text">
+					<?php
+					/* translators: %s: Theme name. */
+					printf( __( 'Select %s' ), $theme->display( 'Name' ) );
+					?>
+				</label>
+			<?php endif; ?>
 		</td>
 		<td class="plugin-title"><p>
 			<img src="<?php echo esc_url( $theme->get_screenshot() ); ?>" width="85" height="64" class="updates-table-screenshot" alt="" />
@@ -522,6 +593,9 @@ function list_theme_updates() {
 				$theme->display( 'Version' ),
 				$theme->update['new_version']
 			);
+
+			echo ' ' . $compat;
+
 			if ( in_array( $stylesheet, $auto_updates, true ) ) {
 				echo $auto_update_notice;
 			}
diff --git a/wp-includes/version.php b/wp-includes/version.php
index b9c4bcb034..f0f858a45d 100644
--- a/wp-includes/version.php
+++ b/wp-includes/version.php
@@ -13,7 +13,7 @@
  *
  * @global string $wp_version
  */
-$wp_version = '5.5-beta4-48653';
+$wp_version = '5.5-beta4-48654';
 
 /**
  * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.