WC_Install::background_installer()public staticWC 2.6.0

Install a plugin from .org in the background via a cron job (used by installer - opt in).

Method of the class: WC_Install{}

No Hooks.

Return

null. Nothing (null).

Usage

$result = WC_Install::background_installer( $plugin_to_install_id, $plugin_to_install );
$plugin_to_install_id(string) (required)
Plugin ID.
$plugin_to_install(array) (required)
Plugin information.

Changelog

Since 2.6.0 Introduced.

WC_Install::background_installer() code WC 9.4.2

public static function background_installer( $plugin_to_install_id, $plugin_to_install ) {
	// Explicitly clear the event.
	$args = func_get_args();

	if ( ! empty( $plugin_to_install['repo-slug'] ) ) {
		require_once ABSPATH . 'wp-admin/includes/file.php';
		require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
		require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
		require_once ABSPATH . 'wp-admin/includes/plugin.php';

		WP_Filesystem();

		$skin              = new Automatic_Upgrader_Skin();
		$upgrader          = new WP_Upgrader( $skin );
		$installed_plugins = array_reduce( array_keys( get_plugins() ), array( __CLASS__, 'associate_plugin_file' ) );
		if ( empty( $installed_plugins ) ) {
			$installed_plugins = array();
		}
		$plugin_slug = $plugin_to_install['repo-slug'];
		$plugin_file = isset( $plugin_to_install['file'] ) ? $plugin_to_install['file'] : $plugin_slug . '.php';
		$installed   = false;
		$activate    = false;

		// See if the plugin is installed already.
		if ( isset( $installed_plugins[ $plugin_file ] ) ) {
			$installed = true;
			$activate  = ! is_plugin_active( $installed_plugins[ $plugin_file ] );
		}

		// Install this thing!
		if ( ! $installed ) {
			// Suppress feedback.
			ob_start();

			try {
				$plugin_information = plugins_api(
					'plugin_information',
					array(
						'slug'   => $plugin_slug,
						'fields' => array(
							'short_description' => false,
							'sections'          => false,
							'requires'          => false,
							'rating'            => false,
							'ratings'           => false,
							'downloaded'        => false,
							'last_updated'      => false,
							'added'             => false,
							'tags'              => false,
							'homepage'          => false,
							'donate_link'       => false,
							'author_profile'    => false,
							'author'            => false,
						),
					)
				);

				if ( is_wp_error( $plugin_information ) ) {
					throw new Exception( $plugin_information->get_error_message() );
				}

				$package  = $plugin_information->download_link;
				$download = $upgrader->download_package( $package );

				if ( is_wp_error( $download ) ) {
					throw new Exception( $download->get_error_message() );
				}

				$working_dir = $upgrader->unpack_package( $download, true );

				if ( is_wp_error( $working_dir ) ) {
					throw new Exception( $working_dir->get_error_message() );
				}

				$result = $upgrader->install_package(
					array(
						'source'                      => $working_dir,
						'destination'                 => WP_PLUGIN_DIR,
						'clear_destination'           => false,
						'abort_if_destination_exists' => false,
						'clear_working'               => true,
						'hook_extra'                  => array(
							'type'   => 'plugin',
							'action' => 'install',
						),
					)
				);

				if ( is_wp_error( $result ) ) {
					throw new Exception( $result->get_error_message() );
				}

				$activate = true;

			} catch ( Exception $e ) {
				WC_Admin_Notices::add_custom_notice(
					$plugin_to_install_id . '_install_error',
					sprintf(
						// translators: 1: plugin name, 2: error message, 3: URL to install plugin manually.
						__( '%1$s could not be installed (%2$s). <a href="%3$s">Please install it manually by clicking here.</a>', 'woocommerce' ),
						$plugin_to_install['name'],
						$e->getMessage(),
						esc_url( admin_url( 'index.php?wc-install-plugin-redirect=' . $plugin_slug ) )
					)
				);
			}

			// Discard feedback.
			ob_end_clean();
		}

		wp_clean_plugins_cache();

		// Activate this thing.
		if ( $activate ) {
			try {
				add_action( 'add_option_mailchimp_woocommerce_plugin_do_activation_redirect', array( __CLASS__, 'remove_mailchimps_redirect' ), 10, 2 );
				$result = activate_plugin( $installed ? $installed_plugins[ $plugin_file ] : $plugin_slug . '/' . $plugin_file );

				if ( is_wp_error( $result ) ) {
					throw new Exception( $result->get_error_message() );
				}
			} catch ( Exception $e ) {
				WC_Admin_Notices::add_custom_notice(
					$plugin_to_install_id . '_install_error',
					sprintf(
						// translators: 1: plugin name, 2: URL to WP plugin page.
						__( '%1$s was installed but could not be activated. <a href="%2$s">Please activate it manually by clicking here.</a>', 'woocommerce' ),
						$plugin_to_install['name'],
						admin_url( 'plugins.php' )
					)
				);
			}
		}
	}
}