Automattic\WooCommerce\Internal\Utilities
PluginInstaller::install_plugin_core
Core version of 'install_plugin' (it doesn't handle the $installing_plugin flag).
Метод класса: PluginInstaller{}
Хуков нет.
Возвращает
Массив. Information about the installation result.
Использование
// private - только в коде основоного (родительского) класса $result = $this->install_plugin_core( $plugin_url, $metadata ): array;
- $plugin_url(строка) (обязательный)
- URL or file path of the plugin to install.
- $metadata(массив) (обязательный)
- Metadata to store if the installation succeeds.
Код PluginInstaller::install_plugin_core() PluginInstaller::install plugin core WC 10.4.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;
}