WP_Automatic_Updater::update()publicWP 3.7.0

Updates an item, if appropriate.

Метод класса: WP_Automatic_Updater{}

Хуки из метода

Возвращает

null|WP_Error.

Использование

$WP_Automatic_Updater = new WP_Automatic_Updater();
$WP_Automatic_Updater->update( $type, $item );
$type(строка) (обязательный)
The type of update being checked: 'core', 'theme', 'plugin', 'translation'.
$item(объект) (обязательный)
The update offer.

Список изменений

С версии 3.7.0 Введена.

Код WP_Automatic_Updater::update() WP 6.4.3

public function update( $type, $item ) {
	$skin = new Automatic_Upgrader_Skin();

	switch ( $type ) {
		case 'core':
			// The Core upgrader doesn't use the Upgrader's skin during the actual main part of the upgrade, instead, firing a filter.
			add_filter( 'update_feedback', array( $skin, 'feedback' ) );
			$upgrader = new Core_Upgrader( $skin );
			$context  = ABSPATH;
			break;
		case 'plugin':
			$upgrader = new Plugin_Upgrader( $skin );
			$context  = WP_PLUGIN_DIR; // We don't support custom Plugin directories, or updates for WPMU_PLUGIN_DIR.
			break;
		case 'theme':
			$upgrader = new Theme_Upgrader( $skin );
			$context  = get_theme_root( $item->theme );
			break;
		case 'translation':
			$upgrader = new Language_Pack_Upgrader( $skin );
			$context  = WP_CONTENT_DIR; // WP_LANG_DIR;
			break;
	}

	// Determine whether we can and should perform this update.
	if ( ! $this->should_update( $type, $item, $context ) ) {
		return false;
	}

	/**
	 * Fires immediately prior to an auto-update.
	 *
	 * @since 4.4.0
	 *
	 * @param string $type    The type of update being checked: 'core', 'theme', 'plugin', or 'translation'.
	 * @param object $item    The update offer.
	 * @param string $context The filesystem context (a path) against which filesystem access and status
	 *                        should be checked.
	 */
	do_action( 'pre_auto_update', $type, $item, $context );

	$upgrader_item = $item;
	switch ( $type ) {
		case 'core':
			/* translators: %s: WordPress version. */
			$skin->feedback( __( 'Updating to WordPress %s' ), $item->version );
			/* translators: %s: WordPress version. */
			$item_name = sprintf( __( 'WordPress %s' ), $item->version );
			break;
		case 'theme':
			$upgrader_item = $item->theme;
			$theme         = wp_get_theme( $upgrader_item );
			$item_name     = $theme->Get( 'Name' );
			// Add the current version so that it can be reported in the notification email.
			$item->current_version = $theme->get( 'Version' );
			if ( empty( $item->current_version ) ) {
				$item->current_version = false;
			}
			/* translators: %s: Theme name. */
			$skin->feedback( __( 'Updating theme: %s' ), $item_name );
			break;
		case 'plugin':
			$upgrader_item = $item->plugin;
			$plugin_data   = get_plugin_data( $context . '/' . $upgrader_item );
			$item_name     = $plugin_data['Name'];
			// Add the current version so that it can be reported in the notification email.
			$item->current_version = $plugin_data['Version'];
			if ( empty( $item->current_version ) ) {
				$item->current_version = false;
			}
			/* translators: %s: Plugin name. */
			$skin->feedback( __( 'Updating plugin: %s' ), $item_name );
			break;
		case 'translation':
			$language_item_name = $upgrader->get_name_for_update( $item );
			/* translators: %s: Project name (plugin, theme, or WordPress). */
			$item_name = sprintf( __( 'Translations for %s' ), $language_item_name );
			/* translators: 1: Project name (plugin, theme, or WordPress), 2: Language. */
			$skin->feedback( sprintf( __( 'Updating translations for %1$s (%2$s)…' ), $language_item_name, $item->language ) );
			break;
	}

	$allow_relaxed_file_ownership = false;
	if ( 'core' === $type && isset( $item->new_files ) && ! $item->new_files ) {
		$allow_relaxed_file_ownership = true;
	}

	// Boom, this site's about to get a whole new splash of paint!
	$upgrade_result = $upgrader->upgrade(
		$upgrader_item,
		array(
			'clear_update_cache'           => false,
			// Always use partial builds if possible for core updates.
			'pre_check_md5'                => false,
			// Only available for core updates.
			'attempt_rollback'             => true,
			// Allow relaxed file ownership in some scenarios.
			'allow_relaxed_file_ownership' => $allow_relaxed_file_ownership,
		)
	);

	// If the filesystem is unavailable, false is returned.
	if ( false === $upgrade_result ) {
		$upgrade_result = new WP_Error( 'fs_unavailable', __( 'Could not access filesystem.' ) );
	}

	if ( 'core' === $type ) {
		if ( is_wp_error( $upgrade_result )
			&& ( 'up_to_date' === $upgrade_result->get_error_code()
				|| 'locked' === $upgrade_result->get_error_code() )
		) {
			/*
			 * These aren't actual errors, treat it as a skipped-update instead
			 * to avoid triggering the post-core update failure routines.
			 */
			return false;
		}

		// Core doesn't output this, so let's append it, so we don't get confused.
		if ( is_wp_error( $upgrade_result ) ) {
			$upgrade_result->add( 'installation_failed', __( 'Installation failed.' ) );
			$skin->error( $upgrade_result );
		} else {
			$skin->feedback( __( 'WordPress updated successfully.' ) );
		}
	}

	$this->update_results[ $type ][] = (object) array(
		'item'     => $item,
		'result'   => $upgrade_result,
		'name'     => $item_name,
		'messages' => $skin->get_upgrade_messages(),
	);

	return $upgrade_result;
}