diff --git a/includes/admin/core/class-admin-upgrade.php b/includes/admin/core/class-admin-upgrade.php index da806aa5..05f0ebc7 100644 --- a/includes/admin/core/class-admin-upgrade.php +++ b/includes/admin/core/class-admin-upgrade.php @@ -77,6 +77,7 @@ if ( ! class_exists( 'um\admin\core\Admin_Upgrade' ) ) { add_action( 'in_plugin_update_message-' . um_plugin, array( $this, 'in_plugin_update_message' ) ); } + /** * Function for major updates * @@ -134,17 +135,31 @@ if ( ! class_exists( 'um\admin\core\Admin_Upgrade' ) ) { } + /** + * @return array + */ + function get_extension_upgrades() { + $extensions = UM()->extensions()->get_list(); + if ( empty( $extensions ) ) { + return array(); + } + + $upgrades = array(); + foreach ( $extensions as $extension ) { + $upgrades[ $extension ] = UM()->extensions()->get_packages( $extension ); + } + + return $upgrades; + } + + /** * Get array of necessary upgrade packages * * @return array */ function need_run_upgrades() { - $um_last_version_upgrade = get_option( 'um_last_version_upgrade' ); - //first install - if ( ! $um_last_version_upgrade ) { - $um_last_version_upgrade = '1.3.88'; - } + $um_last_version_upgrade = get_option( 'um_last_version_upgrade', '1.3.88' ); $diff_packages = array(); diff --git a/includes/class-extensions.php b/includes/class-extensions.php new file mode 100644 index 00000000..145c5db5 --- /dev/null +++ b/includes/class-extensions.php @@ -0,0 +1,230 @@ +get_list(); + + foreach ( $extensions as $slug ) { + $extension = $this->get_info( $slug ); + + list( $run, $slug, $message ) = apply_filters_ref_array( 'um_extension_custom_dependencies', array( true, $slug, '' ) ); + + if ( $run ) { + $compare_version_result = UM()->dependencies()->compare_versions( $extension['min_core_version'], $extension['version'], $slug, $extension['title'] ); + + if ( true !== $compare_version_result ) { + UM()->notices()->add_notice( "{$slug}_dependencies", array( + 'class' => 'error', + 'message' => '

' . $compare_version_result . '

', + ), 1 ); + } + } elseif ( ! $run && ! empty( $message ) ) { + UM()->notices()->add_notice( "{$slug}_dependencies", array( + 'class' => 'error', + 'message' => $message, + ), 1 ); + } + + if ( $run ) { + UM()->call_class( "um_ext\um_{$slug}\Init" ); + } + } + } + + + /** + * @param $settings + * + * @return mixed + */ + function license_options( $settings ) { + + $extensions = $this->get_list(); + + if ( empty( $extensions ) ) { + return $settings; + } + + foreach ( $extensions as $slug ) { + $extension = $this->get_info( $slug ); + + if ( isset( $extension['plan'] ) && $extension['plan'] == 'free' ) { + continue; + } + + $settings['licenses']['fields'][] = array( + 'id' => "um_{$slug}_license_key", + 'label' => sprintf( __( '%s License Key', 'ultimate-member' ), $extension['title'] ), + 'item_name' => $extension['item_name'], + 'author' => 'Ultimate Member', + 'version' => $extension['version'], + ); + } + + return $settings; + } + + + /** + * Loading Extensions localizations + */ + function localization() { + $extensions = $this->get_list(); + + foreach ( $extensions as $slug ) { + $extension = $this->get_info( $slug ); + + $locale = ( get_locale() != '' ) ? get_locale() : 'en_US'; + load_textdomain( $extension['textdomain'], WP_LANG_DIR . '/plugins/' . $extension['textdomain'] . '-' . $locale . '.mo'); + load_plugin_textdomain( $extension['textdomain'], false, dirname( $extension['plugin'] ) . '/languages/' ); + } + } + + + /** + * @param $slug + * + * @return string + */ + function get_version( $slug ) { + + $version = ''; + + return $version; + } + + + /** + * @param $slug + * @param bool $field + * + * @return array|bool + */ + function get_info( $slug, $field = false ) { + if ( ! $field ) { + return ! empty( $this->plugin_data[ $slug ] ) ? $this->plugin_data[ $slug ] : array(); + } else { + return ! empty( $this->plugin_data[ $slug ][ $field ] ) ? $this->plugin_data[ $slug ][ $field ] : false; + } + } + + + /** + * @param string $slug + * @param array $plugin_data + */ + function add( $slug, $plugin_data ) { + $this->list[] = $slug; + $this->plugin_data[ $slug ] = $plugin_data; + } + + + /** + * Activate Extension Process + * Common functions in activation + * + * @param $slug + */ + function activate( $slug ) { + $plugin_data = $this->get_info( $slug ); + + //if extension wasn't inited, init it firstly via "um_{$slug}_add" function + //"um_{$slug}_add" must be in the preset structure of UM extension + if ( empty( $plugin_data ) && function_exists( "um_{$slug}_add" ) ) { + call_user_func( "um_{$slug}_add" ); + $plugin_data = $this->get_info( $slug ); + } + + //first install + $version = get_option( "um_{$slug}_version" ); + if ( ! $version ) { + update_option( "um_{$slug}_last_version_upgrade", $plugin_data['version'] ); + } + + if ( $version != $plugin_data['version'] ) { + update_option( "um_{$slug}_version", $plugin_data['version'] ); + } + + + //start setup + UM()->extension( $slug )->setup()->start(); + } + + + /** + * @return array + */ + function get_list() { + return $this->list; + } + + + function get_packages( $slug ) { + $plugin_info = $this->get_info( $slug ); + $packages_dir = $plugin_info['path'] . DIRECTORY_SEPARATOR . 'includes' . DIRECTORY_SEPARATOR . 'admin' . DIRECTORY_SEPARATOR . 'core' . DIRECTORY_SEPARATOR . 'packages'; + + $update_versions = array(); + $handle = opendir( $packages_dir ); + if ( $handle ) { + while ( false !== ( $filename = readdir( $handle ) ) ) { + if ( $filename != '.' && $filename != '..' ) { + if ( is_dir( $packages_dir . DIRECTORY_SEPARATOR . $filename ) ) { + $update_versions[] = $filename; + } + } + } + closedir( $handle ); + + usort( $update_versions, array( UM()->admin_upgrade(), 'version_compare_sort' ) ); + } + + return $update_versions; + } + + + } +} \ No newline at end of file diff --git a/includes/class-functions.php b/includes/class-functions.php index faf15b6f..70833825 100644 --- a/includes/class-functions.php +++ b/includes/class-functions.php @@ -1,5 +1,6 @@ mobile(); $this->external_integrations(); $this->gdpr(); - //$this->uploader(); - + } + + + /** + * Get extension API + * + * @since 2.0.34 + * + * @param $slug + * + * @return um_ext\um_bbpress\Init + */ + function extension( $slug ) { + if ( empty( $this->classes[ $slug ] ) ) { + $class = "um_ext\um_{$slug}\Init"; + + /** + * @var $class um_ext\um_bbpress\Init + */ + $this->classes[ $slug ] = $class::instance(); + } + + return $this->classes[ $slug ]; + } + + + /** + * @param $class + * + * @return mixed + */ + function call_class( $class ) { + $key = strtolower( $class ); + + if ( empty( $this->classes[ $key ] ) ) { + $this->classes[ $key ] = new $class; + } + + return $this->classes[ $key ]; } @@ -844,6 +891,19 @@ if ( ! class_exists( 'UM' ) ) { } + /** + * @since 2.0.34 + * + * @return um\Extensions + */ + function extensions() { + if ( empty( $this->classes['extensions'] ) ) { + $this->classes['extensions'] = new um\Extensions(); + } + + return $this->classes['extensions']; + } + /** * @since 2.0