Automattic\WooCommerce\Internal\Utilities

PluginInstaller::install_plugin_core()privateWC 1.0

Core version of 'install_plugin' (it doesn't handle the $installing_plugin flag).

Method of the class: PluginInstaller{}

No Hooks.

Return

Array. Information about the installation result.

Usage

// private - for code of main (parent) class only
$result = $this->install_plugin_core( $plugin_url, $metadata ): array;
$plugin_url(string) (required)
URL or file path of the plugin to install.
$metadata(array) (required)
Metadata to store if the installation succeeds.

PluginInstaller::install_plugin_core() code WC 9.3.3

private function install_plugin_core( string $plugin_url, array $metadata ): array {
	if ( ! StringUtil::starts_with( $plugin_url, 'https://downloads.wordpress.org/', false ) ) {
		throw new \InvalidArgumentException( "Only installs from the WordPress.org plugins directory (plugin URL starting with 'https://downloads.wordpress.org/') are allowed." );
	}

	$installed_by = $metadata['installed_by'] ?? 'WooCommerce';
	if ( 0 === strcasecmp( 'WooCommerce', $installed_by ) ) {
		// phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace
		$calling_file = StringUtil::normalize_local_path_slashes( debug_backtrace()[1]['file'] ?? '' ); // [1], not [0], because the immediate caller is the install_plugin method.
		if ( ! StringUtil::starts_with( $calling_file, StringUtil::normalize_local_path_slashes( WC_ABSPATH . 'includes/' ) ) && ! StringUtil::starts_with( $calling_file, StringUtil::normalize_local_path_slashes( WC_ABSPATH . 'src/' ) ) ) {
			throw new \InvalidArgumentException( "If the value of 'installed_by' is 'WooCommerce', the caller of the method must be a WooCommerce core class or function." );
		}
	}

	if ( ! class_exists( \Automatic_Upgrader_Skin::class ) ) {
		include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader-skin.php';
		include_once ABSPATH . 'wp-admin/includes/class-automatic-upgrader-skin.php';
	}
	$skin = new \Automatic_Upgrader_Skin();

	if ( ! class_exists( \Plugin_Upgrader::class ) ) {
		include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
	}
	$upgrader = new \Plugin_Upgrader( $skin );

	$install_ok = $upgrader->install( $plugin_url );

	$result = array( 'messages' => $skin->get_upgrade_messages() );

	if ( $install_ok ) {
		if ( ! function_exists( 'get_plugins' ) ) {
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
		}
		$plugin_name    = $upgrader->plugin_info();
		$plugin_version = get_plugins()[ $plugin_name ]['Version'];

		$result['plugin_name'] = $plugin_name;
		$plugin_data           = array(
			'version' => $plugin_version,
			'date'    => current_time( 'mysql' ),
		);
		if ( ! empty( $metadata ) ) {
			$plugin_data['metadata'] = $metadata;
		}

		$auto_installed_plugins                 = get_site_option( 'woocommerce_autoinstalled_plugins', array() );
		$auto_installed_plugins[ $plugin_name ] = $plugin_data;
		update_site_option( 'woocommerce_autoinstalled_plugins', $auto_installed_plugins );

		$auto_installed_plugins_history = get_site_option( 'woocommerce_history_of_autoinstalled_plugins', array() );
		if ( ! isset( $auto_installed_plugins_history[ $plugin_name ] ) ) {
			$auto_installed_plugins_history[ $plugin_name ] = $plugin_data;
			update_site_option( 'woocommerce_history_of_autoinstalled_plugins', $auto_installed_plugins_history );
		}

		$post_install = function () use ( $plugin_name, $plugin_version, $installed_by, $plugin_url, $plugin_data ) {
			$log_context = array(
				'source'        => 'plugin_auto_installs',
				'recorded_data' => $plugin_data,
			);

			wc_get_logger()->info( "Plugin $plugin_name v{$plugin_version} installed by $installed_by, source: $plugin_url", $log_context );
		};
	} else {
		$messages     = $skin->get_upgrade_messages();
		$post_install = function () use ( $plugin_url, $installed_by, $messages ) {
			$log_context = array(
				'source'             => 'plugin_auto_installs',
				'installer_messages' => $messages,
			);
			wc_get_logger()->error( "$installed_by failed to install plugin from source: $plugin_url", $log_context );
		};
	}

	if ( is_multisite() ) {
		// We log the install in the main site, unless the main site doesn't have WooCommerce installed;
		// in that case we fallback to logging in the current site.
		switch_to_blog( get_main_site_id() );
		if ( self::woocommerce_is_active_in_current_site() ) {
			$post_install();
			restore_current_blog();
		} else {
			restore_current_blog();
			$post_install();
		}
	} else {
		$post_install();
	}

	$result['install_ok'] = $install_ok ?? false;
	return $result;
}