Skip to content

Commit

Permalink
Upgrade/Install: Check theme compatibility during bulk upgrades.
Browse files Browse the repository at this point in the history
Previously, bulk upgrades did not verify that a theme package was compatible with the site's WordPress version or the server's PHP version.

This was previusly done for plugins in #59198, but themes were missed.

Follow-up to: [56525].

Props salcode, lakshmananphp.
Fixes #59758.


git-svn-id: https://develop.svn.wordpress.org/trunk@57252 602fd350-edb4-49c9-b593-d223f7449a82
  • Loading branch information
aaronjorbin committed Jan 8, 2024
1 parent 868f2ef commit fa421ca
Showing 1 changed file with 52 additions and 16 deletions.
68 changes: 52 additions & 16 deletions src/wp-admin/includes/class-theme-upgrader.php
Original file line number Diff line number Diff line change
Expand Up @@ -371,6 +371,8 @@ public function upgrade( $theme, $args = array() ) {
* @since 3.0.0
* @since 3.7.0 The `$args` parameter was added, making clearing the update cache optional.
*
* @global string $wp_version The WordPress version string.
*
* @param string[] $themes Array of the theme slugs.
* @param array $args {
* Optional. Other arguments for upgrading several themes at once. Default empty array.
Expand All @@ -381,6 +383,8 @@ public function upgrade( $theme, $args = array() ) {
* @return array[]|false An array of results, or false if unable to connect to the filesystem.
*/
public function bulk_upgrade( $themes, $args = array() ) {
global $wp_version;

$defaults = array(
'clear_update_cache' => true,
);
Expand Down Expand Up @@ -442,23 +446,55 @@ public function bulk_upgrade( $themes, $args = array() ) {
// Get the URL to the zip file.
$r = $current->response[ $theme ];

$result = $this->run(
array(
'package' => $r['package'],
'destination' => get_theme_root( $theme ),
'clear_destination' => true,
'clear_working' => true,
'is_multi' => true,
'hook_extra' => array(
'theme' => $theme,
'temp_backup' => array(
'slug' => $theme,
'src' => get_theme_root( $theme ),
'dir' => 'themes',
if ( isset( $r['requires'] ) && ! is_wp_version_compatible( $r['requires'] ) ) {
$result = new WP_Error(
'incompatible_wp_required_version',
sprintf(
/* translators: 1: Current WordPress version, 2: WordPress version required by the new theme version. */
__( 'Your WordPress version is %1$s, however the new theme version requires %2$s.' ),
$wp_version,
$r['requires']
)
);

$this->skin->before( $result );
$this->skin->error( $result );
$this->skin->after();
} elseif ( isset( $r['requires_php'] ) && ! is_php_version_compatible( $r['requires_php'] ) ) {
$result = new WP_Error(
'incompatible_php_required_version',
sprintf(
/* translators: 1: Current PHP version, 2: PHP version required by the new theme version. */
__( 'The PHP version on your server is %1$s, however the new theme version requires %2$s.' ),
PHP_VERSION,
$r['requires_php']
)
);

$this->skin->before( $result );
$this->skin->error( $result );
$this->skin->after();
} else {
add_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );
$result = $this->run(
array(
'package' => $r['package'],
'destination' => get_theme_root( $theme ),
'clear_destination' => true,
'clear_working' => true,
'is_multi' => true,
'hook_extra' => array(
'theme' => $theme,
'temp_backup' => array(
'slug' => $theme,
'src' => get_theme_root( $theme ),
'dir' => 'themes',
),
),
),
)
);
)
);
remove_filter( 'upgrader_source_selection', array( $this, 'check_package' ) );
}

$results[ $theme ] = $result;

Expand Down

0 comments on commit fa421ca

Please sign in to comment.