diff --git a/includes/admin/class-wc-admin-setup-wizard.php b/includes/admin/class-wc-admin-setup-wizard.php index d7911967871..acf47aa40e1 100644 --- a/includes/admin/class-wc-admin-setup-wizard.php +++ b/includes/admin/class-wc-admin-setup-wizard.php @@ -692,142 +692,18 @@ class WC_Admin_Setup_Wizard { get_wizard_payment_gateways(); - $installed_plugins = array_map( array( $this, 'format_plugin_slug' ), array_keys( get_plugins() ) ); + $gateways = $this->get_wizard_payment_gateways(); foreach ( $gateways as $gateway_id => $gateway ) { // If repo-slug is defined, download and install plugin from .org. if ( ! empty( $gateway['repo-slug'] ) && ! empty( $_POST[ 'wc-wizard-gateway-' . $gateway_id . '-enabled' ] ) ) { - $plugin_slug = $gateway['repo-slug']; - $plugin = $plugin_slug . '/' . $plugin_slug . '.php'; - $installed = false; - $activate = false; - - // See if the plugin is installed already - if ( in_array( $gateway['repo-slug'], $installed_plugins ) ) { - $installed = true; - $activate = ! is_plugin_active( $plugin ); - } - - // Install this thing! - if ( ! $installed ) { - // Suppress feedback - ob_start(); - - try { - $plugin = plugins_api( 'plugin_information', array( - 'slug' => $gateway['repo-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 ) ) { - throw new Exception( $plugin->get_error_message() ); - } - - $package = $plugin->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( - $gateway_id . '_install_error', - sprintf( - __( '%s could not be installed (%s). %sPlease install it manually by clicking here.%s', 'woocommerce' ), - $gateway['name'], - $e->getMessage(), - '', - '' - ) - ); - } - - // Discard feedback - ob_end_clean(); - } - - // Activate this thing - if ( $activate ) { - try { - $result = activate_plugin( $plugin ); - - if ( is_wp_error( $result ) ) { - throw new Exception( $result->get_error_message() ); - } - } catch ( Exception $e ) { - WC_Admin_Notices::add_custom_notice( - $gateway_id . '_install_error', - sprintf( - __( '%s could not be activated (%s). %sPlease activate it manually via the plugins screen.%s', 'woocommerce' ), - $gateway['name'], - $e->getMessage(), - '', - '' - ) - ); - } - } + wp_schedule_single_event( time() + 10, 'woocommerce_plugin_background_installer', array( $gateway_id, $gateway ) ); } $settings_key = 'woocommerce_' . $gateway_id . '_settings'; diff --git a/includes/class-wc-install.php b/includes/class-wc-install.php index 3ea1676c154..4d8f01ffd2b 100644 --- a/includes/class-wc-install.php +++ b/includes/class-wc-install.php @@ -41,6 +41,7 @@ class WC_Install { add_filter( 'plugin_row_meta', array( __CLASS__, 'plugin_row_meta' ), 10, 2 ); add_filter( 'wpmu_drop_tables', array( __CLASS__, 'wpmu_drop_tables' ) ); add_filter( 'cron_schedules', array( __CLASS__, 'cron_schedules' ) ); + add_action( 'woocommerce_plugin_background_installer', array( __CLASS__, 'background_installer' ), 10, 2 ); } /** @@ -820,6 +821,151 @@ CREATE TABLE {$wpdb->prefix}woocommerce_termmeta ( return $tables; } + + /** + * Get slug from path + * @param string $key + * @return string + */ + private static function format_plugin_slug( $key ) { + $slug = explode( '/', $key ); + $slug = explode( '.', end( $slug ) ); + return $slug[0]; + } + + /** + * Install a plugin from .org in the background via a cron job (used by + * installer - opt in). + * @param string $plugin_to_install_id + * @param array $plugin_to_install + * @since 2.6.0 + */ + public static function background_installer( $plugin_to_install_id, $plugin_to_install ) { + 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_map( array( __CLASS__, 'format_plugin_slug' ), array_keys( get_plugins() ) ); + $plugin_slug = $plugin_to_install['repo-slug']; + $plugin = $plugin_slug . '/' . $plugin_slug . '.php'; + $installed = false; + $activate = false; + + // See if the plugin is installed already + if ( in_array( $plugin_to_install['repo-slug'], $installed_plugins ) ) { + $installed = true; + $activate = ! is_plugin_active( $plugin ); + } + + // Install this thing! + if ( ! $installed ) { + // Suppress feedback + ob_start(); + + try { + $plugin_information = plugins_api( 'plugin_information', array( + 'slug' => $plugin_to_install['repo-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( + __( '%s could not be installed (%s). %sPlease install it manually by clicking here.%s', 'woocommerce' ), + $plugin_to_install['name'], + $e->getMessage(), + '', + '' + ) + ); + } + + // Discard feedback + ob_end_clean(); + } + + wp_clean_plugins_cache(); + + // Activate this thing + if ( $activate ) { + try { + $result = activate_plugin( $plugin ); + + 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( + __( '%s could not be activated (%s). %sPlease activate it manually via the plugins screen.%s', 'woocommerce' ), + $plugin_to_install['name'], + $e->getMessage() . '"' . $plugin . '"', + '', + '' + ) + ); + } + } + } + } } WC_Install::init();