Theme_Upgrader::check_package( string $source ): string|WP_Error

Checks that the package source contains a valid theme.

Description

Hooked to the ‘upgrader_source_selection’ filter by Theme_Upgrader::install().

Parameters

$sourcestringrequired
The path to the downloaded package source.

Return

string|WP_Error The source as passed, or a WP_Error object on failure.

Source

public function check_package( $source ) {	global $wp_filesystem;	$wp_version = wp_get_wp_version();	$this->new_theme_data = array();	if ( is_wp_error( $source ) ) {	return $source;	}	// Check that the folder contains a valid theme.	$working_directory = str_replace( $wp_filesystem->wp_content_dir(), trailingslashit( WP_CONTENT_DIR ), $source );	if ( ! is_dir( $working_directory ) ) { // Confidence check, if the above fails, let's not prevent installation.	return $source;	}	// A proper archive should have a style.css file in the single subdirectory.	if ( ! file_exists( $working_directory . 'style.css' ) ) {	return new WP_Error(	'incompatible_archive_theme_no_style',	$this->strings['incompatible_archive'],	sprintf(	/* translators: %s: style.css */	__( 'The theme is missing the %s stylesheet.' ),	'<code>style.css</code>'	)	);	}	// All these headers are needed on Theme_Installer_Skin::do_overwrite().	$info = get_file_data(	$working_directory . 'style.css',	array(	'Name' => 'Theme Name',	'Version' => 'Version',	'Author' => 'Author',	'Template' => 'Template',	'RequiresWP' => 'Requires at least',	'RequiresPHP' => 'Requires PHP',	)	);	if ( empty( $info['Name'] ) ) {	return new WP_Error(	'incompatible_archive_theme_no_name',	$this->strings['incompatible_archive'],	sprintf(	/* translators: %s: style.css */	__( 'The %s stylesheet does not contain a valid theme header.' ),	'<code>style.css</code>'	)	);	}	/* * Parent themes must contain an index file: * - classic themes require /index.php * - block themes require /templates/index.html or block-templates/index.html (deprecated 5.9.0). */	if (	empty( $info['Template'] ) &&	! file_exists( $working_directory . 'index.php' ) &&	! file_exists( $working_directory . 'templates/index.html' ) &&	! file_exists( $working_directory . 'block-templates/index.html' )	) {	return new WP_Error(	'incompatible_archive_theme_no_index',	$this->strings['incompatible_archive'],	sprintf(	/* translators: 1: templates/index.html, 2: index.php, 3: Documentation URL, 4: Template, 5: style.css */	__( 'Template is missing. Standalone themes need to have a %1$s or %2$s template file. <a href="%3$s">Child themes</a> need to have a %4$s header in the %5$s stylesheet.' ),	'<code>templates/index.html</code>',	'<code>index.php</code>',	__( 'https://developer.wordpress.org/themes/advanced-topics/child-themes/' ),	'<code>Template</code>',	'<code>style.css</code>'	)	);	}	$requires_php = isset( $info['RequiresPHP'] ) ? $info['RequiresPHP'] : null;	$requires_wp = isset( $info['RequiresWP'] ) ? $info['RequiresWP'] : null;	if ( ! is_php_version_compatible( $requires_php ) ) {	$error = sprintf(	/* translators: 1: Current PHP version, 2: Version required by the uploaded theme. */	__( 'The PHP version on your server is %1$s, however the uploaded theme requires %2$s.' ),	PHP_VERSION,	$requires_php	);	return new WP_Error( 'incompatible_php_required_version', $this->strings['incompatible_archive'], $error );	}	if ( ! is_wp_version_compatible( $requires_wp ) ) {	$error = sprintf(	/* translators: 1: Current WordPress version, 2: Version required by the uploaded theme. */	__( 'Your WordPress version is %1$s, however the uploaded theme requires %2$s.' ),	$wp_version,	$requires_wp	);	return new WP_Error( 'incompatible_wp_required_version', $this->strings['incompatible_archive'], $error );	}	$this->new_theme_data = $info;	return $source; } 

Changelog

VersionDescription
3.3.0Introduced.

User Contributed Notes

You must log in before being able to contribute a note or feedback.