Automattic\WooCommerce\Internal\Utilities
PluginInstaller::install_plugin_core()
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() 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; }