Файловый менеджер - Редактировать - /var/www/xthruster/html/wp-content/uploads/flags/license.tar
Назад
notices/trial-expired-notice.php 0000644 00000002064 14720402322 0012747 0 ustar 00 <?php namespace ElementorPro\License\Notices; use Elementor\Core\Admin\Notices\Base_Notice; use ElementorPro\License\API as License_API; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } class Trial_Expired_Notice extends Base_Notice { /** * Notice ID. */ const ID = 'elementor_trial_expired_promote'; /** * @inheritDoc */ public function should_print() { return License_API::is_license_expired() && License_API::is_licence_pro_trial(); } /** * @inheritDoc */ public function get_config() { return [ 'id' => static::ID, 'title' => esc_html__( 'Your trial has expired', 'elementor-pro' ), 'description' => __( 'Want to continue using Pro to build your website? Choose the plan that\'s right for you!', 'elementor-pro' ), 'button' => [ 'text' => esc_html__( 'Go Pro', 'elementor-pro' ), 'url' => 'https://my.elementor.com/upgrade-subscription/?utm_source=wp-notification-banner&utm_medium=wp-dash&utm_campaign=pro-trial&utm_content=trial-expired', 'new_tab' => true, 'type' => 'cta', ], ]; } } notices/trial-period-notice.php 0000644 00000002525 14720402322 0012573 0 ustar 00 <?php namespace ElementorPro\License\Notices; use Elementor\Core\Admin\Notices\Base_Notice; use ElementorPro\License\API; use ElementorPro\License\API as License_API; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } class Trial_Period_Notice extends Base_Notice { /** * Notice ID. */ const ID = 'elementor_trial_period_promote'; /** * @inheritDoc */ public function should_print() { return License_API::is_license_active() && License_API::is_licence_pro_trial(); } /** * @inheritDoc */ public function get_config() { $license_data = API::get_license_data(); $title = sprintf( /* translators: %s: Days left to trial expiration. */ esc_html__( 'Your trial expires in %s', 'elementor-pro' ), human_time_diff( current_time( 'timestamp' ), strtotime( $license_data['expires'] ) ) ); return [ 'id' => static::ID, 'title' => $title, 'description' => __( 'Find the plan that matches your needs and enjoy Pro widgets, templates, and support for a whole year.', 'elementor-pro' ), 'button' => [ 'text' => esc_html__( 'Choose your plan', 'elementor-pro' ), 'url' => 'https://my.elementor.com/upgrade-subscription/?utm_source=wp-notification-banner&utm_medium=wp-dash&utm_campaign=pro-trial&utm_content=trial-period', 'new_tab' => true, 'type' => 'cta', ], ]; } } api.php 0000644 00000043056 14720402322 0006032 0 ustar 00 <?php namespace ElementorPro\License; use Elementor\Core\Common\Modules\Connect\Module as ConnectModule; use ElementorPro\Plugin; use ElementorPro\Modules\Tiers\Module as Tiers; use Elementor\Api as Core_API; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly } class API { const PRODUCT_NAME = 'Elementor Pro'; /** * @deprecated 3.8.0 */ const STORE_URL = 'https://my.elementor.com/api/v1/licenses/'; const BASE_URL = 'https://my.elementor.com/api/v2/'; const RENEW_URL = 'https://go.elementor.com/renew/'; // License Statuses const STATUS_EXPIRED = 'expired'; const STATUS_SITE_INACTIVE = 'site_inactive'; const STATUS_CANCELLED = 'cancelled'; const STATUS_REQUEST_LOCKED = 'request_locked'; const STATUS_MISSING = 'missing'; const STATUS_HTTP_ERROR = 'http_error'; /** * @deprecated 3.8.0 */ const STATUS_VALID = 'valid'; /** * @deprecated 3.8.0 */ const STATUS_INVALID = 'invalid'; /** * @deprecated 3.8.0 */ const STATUS_DISABLED = 'disabled'; /** * @deprecated 3.8.0 */ const STATUS_REVOKED = 'revoked'; // Features const FEATURE_PRO_TRIAL = 'pro_trial'; // Requests lock config. const REQUEST_LOCK_TTL = MINUTE_IN_SECONDS; const REQUEST_LOCK_OPTION_NAME = '_elementor_pro_api_requests_lock'; const TRANSIENT_KEY_PREFIX = 'elementor_pro_remote_info_api_data_'; const LICENCE_TIER_KEY = 'tier'; const LICENCE_GENERATION_KEY = 'generation'; // Tiers. const TIER_ESSENENTIAL = 'essential'; const TIER_ADVANCED = 'advanced'; const TIER_EXPERT = 'expert'; const TIER_AGENCY = 'agency'; // Generations. const GENERATION_ESSENTIAL_OCT2023 = 'essential-oct2023'; const GENERATION_EMPTY = 'empty'; const BC_VALIDATION_CALLBACK = 'should_allow_all_features'; protected static $transient_data = []; private static function remote_post( $endpoint, $body_args = [] ) { $use_home_url = true; /** * The license API uses `home_url()` function to retrieve the URL. This hook allows * developers to use `get_site_url()` instead of `home_url()` to set the URL. * * When set to `true` (default) it uses `home_url()`. * When set to `false` it uses `get_site_url()`. * * @param boolean $use_home_url Whether to use `home_url()` or `get_site_url()`. */ $use_home_url = apply_filters( 'elementor_pro/license/api/use_home_url', $use_home_url ); $body_args = wp_parse_args( $body_args, [ 'api_version' => ELEMENTOR_PRO_VERSION, 'item_name' => self::PRODUCT_NAME, 'site_lang' => get_bloginfo( 'language' ), 'url' => $use_home_url ? home_url() : get_site_url(), ] ); $response = wp_remote_post( self::BASE_URL . $endpoint, [ 'timeout' => 40, 'body' => $body_args, ] ); if ( is_wp_error( $response ) ) { return $response; } $data = json_decode( wp_remote_retrieve_body( $response ), true ); if ( empty( $data ) || ! is_array( $data ) ) { return new \WP_Error( 'no_json', esc_html__( 'An error occurred, please try again', 'elementor-pro' ) ); } return $data; } public static function activate_license( $license_key ) { $body_args = [ 'license' => $license_key, ]; $license_data = self::remote_post( 'license/activate', $body_args ); return $license_data; } public static function deactivate_license() { $body_args = [ 'license' => Admin::get_license_key(), ]; $license_data = self::remote_post( 'license/deactivate', $body_args ); return $license_data; } public static function set_transient( $cache_key, $value, $expiration = '+12 hours' ) { $data = [ 'timeout' => strtotime( $expiration, current_time( 'timestamp' ) ), 'value' => json_encode( $value ), ]; $updated = update_option( $cache_key, $data, false ); if ( false === $updated ) { self::$transient_data[ $cache_key ] = $data; } } private static function get_transient( $cache_key ) { $cache = self::$transient_data[ $cache_key ] ?? get_option( $cache_key ); if ( empty( $cache['timeout'] ) ) { return false; } if ( current_time( 'timestamp' ) > $cache['timeout'] && is_user_logged_in() ) { return false; } return json_decode( $cache['value'], true ); } public static function set_license_data( $license_data, $expiration = null ) { if ( null === $expiration ) { $expiration = '+12 hours'; self::set_transient( Admin::LICENSE_DATA_FALLBACK_OPTION_NAME, $license_data, '+24 hours' ); } self::set_transient( Admin::LICENSE_DATA_OPTION_NAME, $license_data, $expiration ); } /** * Check if another request is in progress. * * @param string $name Request name * * @return bool */ public static function is_request_running( $name ) { $requests_lock = get_option( self::REQUEST_LOCK_OPTION_NAME, [] ); if ( isset( $requests_lock[ $name ] ) ) { if ( $requests_lock[ $name ] > time() - self::REQUEST_LOCK_TTL ) { return true; } } $requests_lock[ $name ] = time(); update_option( self::REQUEST_LOCK_OPTION_NAME, $requests_lock ); return false; } public static function get_license_data( $force_request = false ) { $license_data_error = [ 'success' => false, 'error' => static::STATUS_HTTP_ERROR, 'payment_id' => '0', 'license_limit' => '0', 'site_count' => '0', 'activations_left' => '0', ]; $license_key = Admin::get_license_key(); if ( empty( $license_key ) ) { $license_data_error['error'] = static::STATUS_MISSING; return $license_data_error; } $license_data = self::get_transient( Admin::LICENSE_DATA_OPTION_NAME ); if ( false === $license_data || $force_request ) { $body_args = [ 'license' => $license_key, ]; if ( self::is_request_running( 'get_license_data' ) ) { if ( false !== $license_data ) { return $license_data; } $license_data_error['error'] = static::STATUS_REQUEST_LOCKED; return $license_data_error; } $license_data = self::remote_post( 'license/validate', $body_args ); if ( is_wp_error( $license_data ) || ! isset( $license_data['success'] ) ) { $license_data = self::get_transient( Admin::LICENSE_DATA_FALLBACK_OPTION_NAME ); if ( false === $license_data ) { $license_data = $license_data_error; } self::set_license_data( $license_data, '+30 minutes' ); } else { self::set_license_data( $license_data ); } } return $license_data; } public static function get_version( $force_update = true ) { $cache_key = self::TRANSIENT_KEY_PREFIX . ELEMENTOR_PRO_VERSION; $info_data = self::get_transient( $cache_key ); if ( $force_update || false === $info_data ) { if ( self::is_request_running( 'get_version' ) ) { if ( false !== $info_data ) { return $info_data; } return new \WP_Error( esc_html__( 'Another check is in progress.', 'elementor-pro' ) ); } $updater = Plugin::instance()->updater; $translations = wp_get_installed_translations( 'plugins' ); $plugin_translations = []; if ( isset( $translations[ $updater->plugin_slug ] ) ) { $plugin_translations = $translations[ $updater->plugin_slug ]; } $locales = array_values( get_available_languages() ); $body_args = [ 'name' => $updater->plugin_name, 'slug' => $updater->plugin_slug, 'version' => $updater->plugin_version, 'license' => Admin::get_license_key(), 'translations' => wp_json_encode( $plugin_translations ), 'locales' => wp_json_encode( $locales ), 'beta' => 'yes' === get_option( 'elementor_beta', 'no' ), ]; $info_data = self::remote_post( 'pro/info', $body_args ); if ( is_wp_error( $info_data ) || empty( $info_data['new_version'] ) ) { return new \WP_Error( esc_html__( 'HTTP Error', 'elementor-pro' ) ); } self::set_transient( $cache_key, $info_data ); } return $info_data; } public static function get_plugin_package_url( $version ) { $url = 'https://my.elementor.com/api/v1/pro-downloads/'; $body_args = [ 'item_name' => self::PRODUCT_NAME, 'version' => $version, 'license' => Admin::get_license_key(), 'url' => home_url(), ]; $response = wp_remote_post( $url, [ 'timeout' => 40, 'body' => $body_args, ] ); if ( is_wp_error( $response ) ) { return $response; } $response_code = (int) wp_remote_retrieve_response_code( $response ); $data = json_decode( wp_remote_retrieve_body( $response ), true ); if ( 401 === $response_code ) { return new \WP_Error( $response_code, $data['message'] ); } if ( 200 !== $response_code ) { return new \WP_Error( $response_code, esc_html__( 'HTTP Error', 'elementor-pro' ) ); } $data = json_decode( wp_remote_retrieve_body( $response ), true ); if ( empty( $data ) || ! is_array( $data ) ) { return new \WP_Error( 'no_json', esc_html__( 'An error occurred, please try again', 'elementor-pro' ) ); } return $data['package_url']; } public static function get_previous_versions() { $url = 'https://my.elementor.com/api/v1/pro-downloads/'; $body_args = [ 'version' => ELEMENTOR_PRO_VERSION, 'license' => Admin::get_license_key(), 'url' => home_url(), ]; $response = wp_remote_get( $url, [ 'timeout' => 40, 'body' => $body_args, ] ); if ( is_wp_error( $response ) ) { return $response; } $response_code = (int) wp_remote_retrieve_response_code( $response ); $data = json_decode( wp_remote_retrieve_body( $response ), true ); if ( 401 === $response_code ) { return new \WP_Error( $response_code, $data['message'] ); } if ( 200 !== $response_code ) { return new \WP_Error( $response_code, esc_html__( 'HTTP Error', 'elementor-pro' ) ); } $data = json_decode( wp_remote_retrieve_body( $response ), true ); if ( empty( $data ) || ! is_array( $data ) ) { return new \WP_Error( 'no_json', esc_html__( 'An error occurred, please try again', 'elementor-pro' ) ); } return $data['versions']; } public static function get_errors() { return [ 'no_activations_left' => sprintf( /* translators: 1: Bold text opening tag, 2: Bold text closing tag, 3: Link opening tag, 4: Link closing tag. */ esc_html__( '%1$sYou have no more activations left.%2$s %3$sPlease upgrade to a more advanced license%4$s (you\'ll only need to cover the difference).', 'elementor-pro' ), '<strong>', '</strong>', '<a href="https://go.elementor.com/upgrade/" target="_blank">', '</a>' ), 'expired' => sprintf( /* translators: 1: Bold text opening tag, 2: Bold text closing tag, 3: Link opening tag, 4: Link closing tag. */ esc_html__( '%1$sYour Elementor Pro license has expired.%2$s Want to keep creating secure and high-performing websites? Renew your subscription to regain access to all of the Elementor Pro widgets, templates, updates & more. %3$sRenew now%4$s', 'elementor-pro' ), '<strong>', '</strong>', '<a href="https://go.elementor.com/renew/" target="_blank">', '</a>' ), 'missing' => esc_html__( 'Your license is missing. Please check your key again.', 'elementor-pro' ), 'cancelled' => sprintf( /* translators: 1: Bold text opening tag, 2: Bold text closing tag. */ esc_html__( '%1$sYour license key has been cancelled%2$s (most likely due to a refund request). Please consider acquiring a new license.', 'elementor-pro' ), '<strong>', '</strong>' ), 'key_mismatch' => esc_html__( 'Your license is invalid for this domain. Please check your key again.', 'elementor-pro' ), ]; } public static function get_error_message( $error ) { $errors = self::get_errors(); if ( isset( $errors[ $error ] ) ) { $error_msg = $errors[ $error ]; } else { $error_msg = esc_html__( 'An error occurred. Please check your internet connection and try again. If the problem persists, contact our support.', 'elementor-pro' ) . ' (' . $error . ')'; } return $error_msg; } public static function is_license_active() { $license_data = self::get_license_data(); return (bool) $license_data['success']; } public static function is_license_expired() { $license_data = self::get_license_data(); return ! empty( $license_data['error'] ) && self::STATUS_EXPIRED === $license_data['error']; } public static function is_licence_pro_trial() { return self::is_licence_has_feature( self::FEATURE_PRO_TRIAL ); } public static function is_licence_has_feature( $feature_name, $license_check_validator = null ) { $license_data = self::get_license_data(); if ( self::custom_licence_validator_passed( $license_check_validator ) ) { return true; } return ! empty( $license_data['features'] ) && in_array( $feature_name, $license_data['features'], true ); } private static function custom_licence_validator_passed( $license_check_validator ) { return null !== $license_check_validator && is_callable( [ __CLASS__, $license_check_validator ] ) && self::$license_check_validator(); } private static function should_allow_all_features() { return ! self::licence_supports_tiers() || self::is_frontend(); } private static function is_frontend() { return ! is_admin() && ! Plugin::elementor()->preview->is_preview_mode(); } /* * We can consider removing this function and it's usages at a future point if * we feel confident that all user's Licence Caches has been refreshed * and should definitely contain a tier and generation. */ private static function licence_supports_tiers() { $license_data = self::get_license_data(); return ! empty( $license_data[ static::LICENCE_TIER_KEY ] ) && ! empty( $license_data[ static::LICENCE_GENERATION_KEY ] ); } public static function is_need_to_show_upgrade_promotion() { if ( ! self::licence_supports_tiers() ) { return false; } return self::is_licence_tier( static::TIER_ESSENENTIAL ) && self::is_licence_generation( static::GENERATION_EMPTY ); } private static function is_licence_tier( $tier ) { if ( ! self::licence_supports_tiers() ) { return false; } return self::get_license_data()[ static::LICENCE_TIER_KEY ] === $tier; } private static function is_licence_generation( $generation ) { if ( ! self::licence_supports_tiers() ) { return false; } return self::get_license_data()[ static::LICENCE_GENERATION_KEY ] === $generation; } public static function filter_active_features( $features ) { if ( self::should_allow_all_features() ) { return array_values( $features ); } $license_data = self::get_license_data(); $filtered_values = []; if ( ! is_array( $license_data['features'] ) ) { $license_data['features'] = []; } foreach ( $license_data['features'] as $key ) { if ( ! array_key_exists( $key, $features ) ) { continue; } $filtered_values[] = $features[ $key ]; } return $filtered_values; } public static function get_promotion_widgets() { $promotions = Core_API::get_promotion_widgets(); $license_data = self::get_license_data(); if ( ! self::licence_supports_tiers() ) { return []; } if ( ! is_array( $license_data['features'] ) ) { $license_data['features'] = []; } foreach ( $promotions as $key => $promotion ) { if ( ! in_array( $promotion['name'], $license_data['features'] ) ) { continue; } unset( $promotions[ $key ] ); } return array_values( $promotions ); } /* * Check if the Licence is not Expired and also has a Feature. * Needed because even Expired Licences keep the features array for BC. */ public static function active_licence_has_feature( $feature_name ) { return ! self::is_license_expired() && self::is_licence_has_feature( $feature_name, static::BC_VALIDATION_CALLBACK ); } public static function is_license_about_to_expire() { $license_data = self::get_license_data(); if ( ! empty( $license_data['recurring'] ) ) { return false; } if ( 'lifetime' === $license_data['expires'] ) { return false; } return time() > strtotime( '-28 days', strtotime( $license_data['expires'] ) ); } /** * @param string $library_type * * @return int */ public static function get_library_access_level( $library_type = 'template' ) { $license_data = static::get_license_data(); $access_level = ConnectModule::ACCESS_LEVEL_CORE; if ( static::is_license_active() ) { $access_level = ConnectModule::ACCESS_LEVEL_PRO; } // For BC: making sure that it returns the correct access_level even if "features" is not defined in the license data. if ( ! isset( $license_data['features'] ) || ! is_array( $license_data['features'] ) ) { return $access_level; } $library_access_level_prefix = "{$library_type}_access_level_"; foreach ( $license_data['features'] as $feature ) { if ( strpos( $feature, $library_access_level_prefix ) !== 0 ) { continue; } $access_level = (int) str_replace( $library_access_level_prefix, '', $feature ); } return $access_level; } /** * The license API uses "tiers" and "generations". * Because we don't use the same logic, and have a flat list of prioritized tiers & generations, * we take the generation if exists and fallback to the tier otherwise. * * For example: * [ 'tier' => 'essential', 'generation' => 'essential-oct2023' ] => 'essential-oct2023' * [ 'tier' => 'essential', 'generation' => 'empty' ] => 'essential' * [ 'tier' => '', 'generation' => '' ] => 'essential-oct2023' * [] => 'essential-oct2023' * * @return string */ public static function get_access_tier() { if ( ! static::is_license_active() ) { return 'free'; } $license_data = static::get_license_data(); $tier = $license_data['tier'] ?? null; $generation = $license_data['generation'] ?? null; // Fallback to legacy license when the API returns empty values. $is_legacy_api = empty( $tier ) || empty( $generation ); if ( $is_legacy_api ) { return 'essential-oct2023'; } // The license API returns "empty" instead of empty string. $has_generation = 'empty' !== $generation; if ( $has_generation ) { return $generation; } return $tier; } } updater.php 0000644 00000016203 14720402322 0006717 0 ustar 00 <?php namespace ElementorPro\License; use ElementorPro\Core\Utils as ProUtils; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } class Updater { public $plugin_version; public $plugin_name; public $plugin_slug; private $response_transient_key; public function __construct() { $this->plugin_version = ELEMENTOR_PRO_VERSION; $this->plugin_name = ELEMENTOR_PRO_PLUGIN_BASE; $this->plugin_slug = basename( ELEMENTOR_PRO__FILE__, '.php' ); $this->response_transient_key = md5( sanitize_key( $this->plugin_name ) . 'response_transient' ); $this->setup_hooks(); $this->maybe_delete_transients(); } private function setup_hooks() { if ( ! $this->is_elementor_pro_rollback() ) { add_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_update' ], 50 ); } add_action( 'delete_site_transient_update_plugins', [ $this, 'delete_transients' ] ); add_filter( 'plugins_api', [ $this, 'plugins_api_filter' ], 10, 3 ); remove_action( 'after_plugin_row_' . $this->plugin_name, 'wp_plugin_update_row' ); add_action( 'after_plugin_row_' . $this->plugin_name, [ $this, 'show_update_notification' ], 10, 2 ); add_action( 'update_option_WPLANG', function () { $this->clean_get_version_cache(); } ); add_action( 'upgrader_process_complete', function () { $this->clean_get_version_cache(); } ); } public function delete_transients() { $this->delete_transient( $this->response_transient_key ); } private function maybe_delete_transients() { global $pagenow; if ( 'update-core.php' === $pagenow && isset( $_GET['force-check'] ) ) { $this->delete_transients(); } } private function check_transient_data( $_transient_data ) { if ( ! is_object( $_transient_data ) ) { $_transient_data = new \stdClass(); } $version_info = API::get_version( false /* Use Cache */ ); if ( is_wp_error( $version_info ) ) { return $_transient_data; } // include an unmodified $wp_version include( ABSPATH . WPINC . '/version.php' ); if ( version_compare( $wp_version, $version_info['requires'], '<' ) ) { return $_transient_data; } if ( ! empty( $version_info['elementor_requires'] ) ) { if ( version_compare( ELEMENTOR_VERSION, $version_info['elementor_requires'], '<' ) ) { return $_transient_data; } } $plugin_info = (object) $version_info; unset( $plugin_info->sections ); $plugin_info->plugin = $this->plugin_name; if ( version_compare( $this->plugin_version, $version_info['new_version'], '<' ) ) { $_transient_data->response[ $this->plugin_name ] = $plugin_info; $_transient_data->checked[ $this->plugin_name ] = $version_info['new_version']; } else { $_transient_data->no_update[ $this->plugin_name ] = $plugin_info; $_transient_data->checked[ $this->plugin_name ] = $this->plugin_version; } $_transient_data->last_checked = current_time( 'timestamp' ); if ( ! isset( $_transient_data->translations ) ) { $_transient_data->translations = []; } $_transient_data->translations = array_filter( $_transient_data->translations, function( $translation ) { return ( $translation['slug'] !== $this->plugin_slug ); } ); if ( ! empty( $version_info['translations'] ) ) { foreach ( $version_info['translations'] as $translation ) { $_transient_data->translations[] = [ 'type' => 'plugin', 'slug' => $this->plugin_slug, 'language' => $translation['language'], 'version' => $version_info['new_version'], 'updated' => $translation['updated'], 'package' => $translation['package'], 'autoupdate' => true, ]; } } return $_transient_data; } public function check_update( $_transient_data ) { global $pagenow; if ( ! is_object( $_transient_data ) ) { $_transient_data = new \stdClass(); } return $this->check_transient_data( $_transient_data ); } public function plugins_api_filter( $_data, $_action = '', $_args = null ) { if ( 'plugin_information' !== $_action ) { return $_data; } if ( ! isset( $_args->slug ) || ( $_args->slug !== $this->plugin_slug ) ) { return $_data; } $cache_key = 'elementor_pro_api_request_' . substr( md5( serialize( $this->plugin_slug ) ), 0, 15 ); $api_request_transient = get_site_transient( $cache_key ); if ( empty( $api_request_transient ) ) { $api_response = API::get_version(); if ( is_wp_error( $api_response ) ) { return $_data; } $api_request_transient = new \stdClass(); $api_request_transient->name = 'Elementor Pro'; $api_request_transient->slug = $this->plugin_slug; $api_request_transient->author = '<a href="https://elementor.com/">Elementor.com</a>'; $api_request_transient->homepage = 'https://elementor.com/'; $api_request_transient->requires = $api_response['requires']; $api_request_transient->tested = $api_response['tested']; $api_request_transient->version = $api_response['new_version']; $api_request_transient->last_updated = $api_response['last_updated']; $api_request_transient->download_link = $api_response['download_link']; $api_request_transient->banners = [ 'high' => 'https://ps.w.org/elementor/assets/banner-1544x500.png?rev=1494133', 'low' => 'https://ps.w.org/elementor/assets/banner-1544x500.png?rev=1494133', ]; $api_request_transient->autoupdate = true; $api_request_transient->sections = unserialize( $api_response['sections'] ); // Expires in 1 day set_site_transient( $cache_key, $api_request_transient, DAY_IN_SECONDS ); } $_data = $api_request_transient; return $_data; } public function show_update_notification( $file, $plugin ) { if ( is_network_admin() ) { return; } if ( ! current_user_can( 'update_plugins' ) ) { return; } if ( ! is_multisite() ) { return; } if ( $this->plugin_name !== $file ) { return; } // Remove our filter on the site transient remove_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_update' ] ); $update_cache = get_site_transient( 'update_plugins' ); $update_cache = $this->check_transient_data( $update_cache ); set_site_transient( 'update_plugins', $update_cache ); // Restore our filter add_filter( 'pre_set_site_transient_update_plugins', [ $this, 'check_update' ] ); } protected function get_transient( $cache_key ) { $cache_data = get_option( $cache_key ); if ( empty( $cache_data['timeout'] ) || current_time( 'timestamp' ) > $cache_data['timeout'] ) { // Cache is expired. return false; } return $cache_data['value']; } protected function set_transient( $cache_key, $value, $expiration = 0 ) { if ( empty( $expiration ) ) { $expiration = strtotime( '+12 hours', current_time( 'timestamp' ) ); } $data = [ 'timeout' => $expiration, 'value' => $value, ]; update_option( $cache_key, $data, 'no' ); } protected function delete_transient( $cache_key ) { delete_option( $cache_key ); } private function clean_get_version_cache() { // Since `API::get_version` holds the old language. $cache_key = API::TRANSIENT_KEY_PREFIX . ELEMENTOR_PRO_VERSION; delete_option( $cache_key ); } protected function is_elementor_pro_rollback(): bool { return 'elementor_pro_rollback' === ProUtils::_unstable_get_super_global_value( $_GET, 'action' ); } } admin.php 0000644 00000061764 14720402322 0006357 0 ustar 00 <?php namespace ElementorPro\License; use Elementor\Core\Admin\Admin_Notices; use Elementor\Settings; use Elementor\Utils; use ElementorPro\Core\Utils as Pro_Utils; use ElementorPro\Core\Connect\Apps\Activate; use ElementorPro\License\Notices\Trial_Expired_Notice; use ElementorPro\License\Notices\Trial_Period_Notice; use ElementorPro\Plugin; if ( ! defined( 'ABSPATH' ) ) { exit; // Exit if accessed directly. } class Admin { const PAGE_ID = 'elementor-license'; const LICENSE_KEY_OPTION_NAME = 'elementor_pro_license_key'; const LICENSE_DATA_OPTION_NAME = '_elementor_pro_license_v2_data'; const LICENSE_DATA_FALLBACK_OPTION_NAME = self::LICENSE_DATA_OPTION_NAME . '_fallback'; /** * @deprecated 3.6.0 Use `Plugin::instance()->updater` instead. */ public static $updater = null; public static function get_errors_details() { $license_page_link = self::get_url(); return [ API::STATUS_EXPIRED => [ 'title' => esc_html__( 'Your Elementor Pro license has expired.', 'elementor-pro' ), 'description' => esc_html__( 'Want to keep creating secure and high-performing websites? Renew your subscription to regain access to all of the Elementor Pro widgets, templates, updates & more', 'elementor-pro' ), 'button_text' => esc_html__( 'Renew Now', 'elementor-pro' ), 'button_url' => API::RENEW_URL, 'button_type' => 'cta', ], API::STATUS_CANCELLED => [ 'title' => esc_html__( 'Your License Is Inactive', 'elementor-pro' ), 'description' => sprintf( /* translators: 1: Bold text opening tag, 2: Bold text closing tag. */ esc_html__( '%1$sYour license key has been cancelled%2$s (most likely due to a refund request). Please consider acquiring a new license.', 'elementor-pro' ), '<strong>', '</strong>' ), 'button_text' => esc_html__( 'Activate License', 'elementor-pro' ), 'button_url' => $license_page_link, ], API::STATUS_SITE_INACTIVE => [ 'title' => esc_html__( 'License Mismatch', 'elementor-pro' ), 'description' => sprintf( /* translators: 1: Bold text opening tag, 2: Bold text closing tag. */ esc_html__( '%1$sYour license key doesn\'t match your current domain%2$s. This is most likely due to a change in the domain URL. Please deactivate the license and then reactivate it again.', 'elementor-pro' ), '<strong>', '</strong>' ), 'button_text' => esc_html__( 'Reactivate License', 'elementor-pro' ), 'button_url' => $license_page_link, ], ]; } public static function deactivate() { API::deactivate_license(); delete_option( self::LICENSE_KEY_OPTION_NAME ); delete_option( self::LICENSE_DATA_OPTION_NAME ); delete_option( self::LICENSE_DATA_FALLBACK_OPTION_NAME ); } private static function get_hidden_license_key() { $input_string = self::get_license_key(); $start = 5; $length = mb_strlen( $input_string ) - $start - 5; $mask_string = preg_replace( '/\S/', 'X', $input_string ); $mask_string = mb_substr( $mask_string, $start, $length ); $input_string = substr_replace( $input_string, $mask_string, $start, $length ); return $input_string; } /** * @deprecated 3.6.0 Use `Plugin::instance()->updater` instead. * * @return \ElementorPro\License\Updater */ public static function get_updater_instance() { static::$updater = Plugin::instance()->updater; return static::$updater; } public static function get_license_key() { return trim( get_option( self::LICENSE_KEY_OPTION_NAME ) ); } public static function set_license_key( $license_key ) { return update_option( self::LICENSE_KEY_OPTION_NAME, $license_key ); } public function action_activate_license() { check_admin_referer( 'elementor-pro-license' ); $license_key = Pro_Utils::_unstable_get_super_global_value( $_POST, 'elementor_pro_license_key' ); if ( ! $license_key ) { wp_die( esc_html__( 'Please enter your license key.', 'elementor-pro' ), esc_html__( 'Elementor Pro', 'elementor-pro' ), [ 'back_link' => true, ] ); } $data = API::activate_license( $license_key ); if ( is_wp_error( $data ) ) { wp_die( sprintf( '%s (%s) ', wp_kses_post( $data->get_error_message() ), wp_kses_post( $data->get_error_code() ) ), esc_html__( 'Elementor Pro', 'elementor-pro' ), [ 'back_link' => true, ] ); } if ( empty( $data['success'] ) ) { $error_msg = API::get_error_message( $data['error'] ); wp_die( wp_kses_post( $error_msg ), esc_html__( 'Elementor Pro', 'elementor-pro' ), [ 'back_link' => true, ] ); } self::set_license_key( $license_key ); API::set_license_data( $data ); $this->safe_redirect( Pro_Utils::_unstable_get_super_global_value( $_POST, '_wp_http_referer' ) ); } protected function safe_redirect( $url ) { wp_safe_redirect( $url ); die; } public function action_deactivate_license() { check_admin_referer( 'elementor-pro-license' ); $this->deactivate(); $this->safe_redirect( Pro_Utils::_unstable_get_super_global_value( $_POST, '_wp_http_referer' ) ); } public function register_page() { $menu_text = esc_html__( 'License', 'elementor-pro' ); add_submenu_page( Settings::PAGE_ID, $menu_text, $menu_text, 'manage_options', self::PAGE_ID, [ $this, 'display_page' ] ); if ( API::is_license_expired() ) { add_submenu_page( Settings::PAGE_ID, '', sprintf( '<strong style="color: #DD132F; display: flex; align-items: center; gap: 8px;"> <span class="eicon-pro-icon" style="background: white; border-radius: 3px;"></span> %s </strong>', esc_html__( 'Renew Now', 'elementor-pro' ) ), 'manage_options', 'elementor_pro_renew_license_menu_link' ); } if ( ! API::is_license_expired() && API::is_need_to_show_upgrade_promotion() ) { add_submenu_page( Settings::PAGE_ID, '', esc_html__( 'Upgrade', 'elementor-pro' ), 'manage_options', 'elementor_pro_upgrade_license_menu_link' ); } } public static function get_url() { return admin_url( 'admin.php?page=' . self::PAGE_ID ); } public function display_page() { $license_key = self::get_license_key(); $is_manual_mode = ( isset( $_GET['mode'] ) && 'manually' === $_GET['mode'] ); if ( $is_manual_mode ) { $this->render_manually_activation_widget( $license_key ); return; } ?> <div class="wrap elementor-admin-page-license"> <h2 class="wp-heading-inline"><?php echo esc_html__( 'License Settings', 'elementor-pro' ); ?></h2> <form class="elementor-license-box" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>"> <?php wp_nonce_field( 'elementor-pro-license' ); ?> <?php if ( empty( $license_key ) ) : ?> <h3><?php echo esc_html__( 'Activate License', 'elementor-pro' ); ?></h3> <p><?php // PHPCS - It's already escaped. echo wp_kses_post( $this->get_activate_message() ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?></p> <?php $connect_url = $this->get_connect_url( [ 'utm_source' => 'license-page', 'utm_medium' => 'wp-dash', 'utm_campaign' => 'connect-and-activate-license', 'utm_term' => 'connect-and-activate', ] ); ?> <div class="elementor-box-action"> <a class="button button-primary" href="<?php echo esc_url( $connect_url ); ?>"> <?php echo esc_html__( 'Connect & Activate', 'elementor-pro' ); ?> </a> </div> <?php else : $license_data = API::get_license_data( true ); ?> <h3> <?php $this->render_part_license_status_header( $license_data ); ?> <small> <?php // Fake link to make the user think something is going on. In fact, every refresh of this page will re-check the license status. ?> <a class="button" href="<?php echo esc_url( static::get_url() . '&check-license=1' ); ?>"> <i class="eicon-sync" aria-hidden="true"></i> <?php echo esc_html__( 'Check license status', 'elementor-pro' ); ?> </a> </small> <small> <a class="button" href="https://go.elementor.com/my-account/"> <?php echo esc_html__( 'My Account', 'elementor-pro' ); ?> </a> </small> </h3> <?php $this->render_part_error_notification( $license_data ); ?> <p class="e-row-stretch e-row-divider-bottom"> <span> <?php $connected_user = $this->get_connected_account(); if ( $connected_user ) : echo sprintf( /* translators: %s: Connected user. */ esc_html__( 'You\'re connected as %s.', 'elementor-pro' ), '<strong>' . esc_attr( $this->get_connected_account() ) . '</strong>' ); endif; ?> <?php echo esc_html__( 'Want to activate this website by a different license?', 'elementor-pro' ); ?> </span> <?php $switch_license_url = $this->get_switch_license_url( [ 'utm_source' => 'license-page', 'utm_medium' => 'wp-dash', 'utm_campaign' => 'connect-and-activate-license', 'utm_term' => 'switch-license', ] ); ?> <a class="button button-primary" href="<?php echo esc_url( $switch_license_url ); ?>"> <?php echo esc_html__( 'Switch Account', 'elementor-pro' ); ?> </a> </p> <p class="e-row-stretch"> <span><?php echo esc_html__( 'Want to deactivate the license for any reason?', 'elementor-pro' ); ?></span> <a class="button" href="<?php echo esc_url( $this->get_deactivate_url() ); ?>"> <?php echo esc_html__( 'Disconnect', 'elementor-pro' ); ?> </a> </p> <?php endif; ?> </form> </div> <?php } private function render_part_license_status_header( $license_data ) { $license_errors = [ API::STATUS_EXPIRED => esc_html__( 'Expired', 'elementor-pro' ), API::STATUS_SITE_INACTIVE => esc_html__( 'Mismatch', 'elementor-pro' ), API::STATUS_CANCELLED => esc_html__( 'Cancelled', 'elementor-pro' ), API::STATUS_HTTP_ERROR => esc_html__( 'HTTP Error', 'elementor-pro' ), API::STATUS_MISSING => esc_html__( 'Missing', 'elementor-pro' ), API::STATUS_REQUEST_LOCKED => esc_html__( 'Request Locked', 'elementor-pro' ), ]; echo esc_html__( 'Status', 'elementor-pro' ); ?>: <?php if ( $license_data['success'] ) : ?> <span style="color: #008000; font-style: italic;"><?php echo esc_html__( 'Active', 'elementor-pro' ); ?></span> <?php $redirect_to_document = Pro_Utils::_unstable_get_super_global_value( $_GET, 'redirect-to-document' ); // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( ! empty( $redirect_to_document ) ) : $this->redirect_to_document( $redirect_to_document ); endif; ?> <?php else : ?> <span style="color: #ff0000; font-style: italic;"> <?php echo isset( $license_data['error'], $license_errors[ $license_data['error'] ] ) ? esc_html( $license_errors[ $license_data['error'] ] ) : esc_html__( 'Unknown', 'elementor-pro' ) . ' (' . esc_html( $license_data['error'] ) . ')'; ?> </span> <?php endif; } private function render_part_error_notification( $license_data ) { if ( $license_data['success'] || ! isset( $license_data['error'] ) ) { return; } if ( API::STATUS_EXPIRED === $license_data['error'] ) : ?> <p class="e-row-divider-bottom elementor-admin-alert elementor-alert-danger"> <?php printf( /* translators: 1: Bold text opening tag, 2: Bold text closing tag, 3: Link opening tag, 4: Link closing tag. */ esc_html__( '%1$sYour Elementor Pro license has expired.%2$s Want to keep creating secure and high-performing websites? Renew your subscription to regain access to all of the Elementor Pro widgets, templates, updates & more. %3$sRenew now%4$s', 'elementor-pro' ), '<strong>', '</strong>', '<a href="https://go.elementor.com/renew/" target="_blank"><strong>', '</strong></a>' ); ?> </p> <?php endif; ?> <?php if ( API::STATUS_SITE_INACTIVE === $license_data['error'] ) : ?> <p class="e-row-divider-bottom elementor-admin-alert elementor-alert-danger"> <?php printf( /* translators: 1: Bold text opening tag, 2: Bold text closing tag. */ esc_html__( '%1$sYour license key doesn\'t match your current domain%2$s. This is most likely due to a change in the domain URL of your site (including HTTPS/SSL migration). Please deactivate the license and then reactivate it again.', 'elementor-pro' ), '<strong>', '</strong>' ); ?> </p> <?php endif; } private function is_block_editor_page() { $current_screen = get_current_screen(); if ( method_exists( $current_screen, 'is_block_editor' ) && $current_screen->is_block_editor() ) { return true; } if ( function_exists( 'is_gutenberg_page' ) && is_gutenberg_page() ) { return true; } return false; } public function admin_license_details() { if ( ! current_user_can( 'manage_options' ) ) { return; } if ( $this->is_block_editor_page() ) { return; } $renew_url = API::RENEW_URL; $license_key = self::get_license_key(); /** * @var Admin_Notices $admin_notices */ $admin_notices = Plugin::elementor()->admin->get_component( 'admin-notices' ); if ( empty( $license_key ) ) { $admin_notices->print_admin_notice( [ 'title' => esc_html__( 'Welcome to Elementor Pro!', 'elementor-pro' ), 'description' => $this->get_activate_message(), 'button' => [ 'text' => '<i class="dashicons dashicons-update" aria-hidden="true"></i>' . esc_html__( 'Connect & Activate', 'elementor-pro' ), 'url' => $this->get_connect_url( [ 'utm_source' => 'wp-notification-banner', 'utm_medium' => 'wp-dash', 'utm_campaign' => 'connect-and-activate-license', ] ), ], ] ); return; } $license_data = API::get_license_data(); // When the license with pro trial, the messages here are not relevant, pro trial messages will be shown instead. if ( API::is_licence_pro_trial() ) { return; } $errors = self::get_errors_details(); if ( ! $license_data['success'] && isset( $license_data['error'], $errors[ $license_data['error'] ] ) ) { $error_data = $errors[ $license_data['error'] ]; $admin_notices->print_admin_notice( [ 'title' => $error_data['title'], 'description' => $error_data['description'], 'button' => [ 'text' => $error_data['button_text'], 'url' => $error_data['button_url'], 'type' => isset( $error_data['button_type'] ) ? $error_data['button_type'] : '', ], ] ); return; } if ( API::is_license_active() && API::is_license_about_to_expire() ) { $title = sprintf( /* translators: %s: Days to expire. */ esc_html__( 'Your License Will Expire in %s.', 'elementor-pro' ), human_time_diff( current_time( 'timestamp' ), strtotime( $license_data['expires'] ) ) ); if ( isset( $license_data['renewal_discount'] ) && 0 < $license_data['renewal_discount'] ) { $description = sprintf( /* translators: %s: Discount percent. */ esc_html__( 'Renew your license today, and get an exclusive, time-limited %s discount.', 'elementor-pro' ), $license_data['renewal_discount'] . '%' ); } else { $description = esc_html__( 'Renew your license today, to keep getting feature updates, premium support, Pro widgets & unlimited access to the template library.', 'elementor-pro' ); } $admin_notices->print_admin_notice( [ 'title' => $title, 'description' => $description, 'type' => 'warning', 'button' => [ 'text' => esc_html__( 'Renew now', 'elementor-pro' ), 'url' => $renew_url, 'type' => 'warning', ], ] ); } } public function filter_library_get_templates_args( $body_args ) { $license_key = self::get_license_key(); if ( ! empty( $license_key ) ) { $body_args['license'] = $license_key; $body_args['url'] = home_url(); } return $body_args; } public function handle_tracker_actions() { // Show tracker notice after 24 hours from Pro installed time. $is_need_to_show = ( $this->get_installed_time() < strtotime( '-24 hours' ) ); $is_dismiss_notice = ( '1' === get_option( 'elementor_tracker_notice' ) ); $is_dismiss_pro_notice = ( '1' === get_option( 'elementor_pro_tracker_notice' ) ); if ( $is_need_to_show && $is_dismiss_notice && ! $is_dismiss_pro_notice ) { delete_option( 'elementor_tracker_notice' ); } if ( ! isset( $_GET['elementor_tracker'] ) ) { return; } if ( 'opt_out' === $_GET['elementor_tracker'] ) { update_option( 'elementor_pro_tracker_notice', '1' ); } } public function get_installed_time() { $installed_time = get_option( '_elementor_pro_installed_time' ); if ( ! $installed_time ) { $installed_time = time(); update_option( '_elementor_pro_installed_time', $installed_time ); } return $installed_time; } public function plugin_action_links( $links ) { $license_key = self::get_license_key(); if ( empty( $license_key ) ) { $links['active_license'] = sprintf( '<a href="%s" class="elementor-plugins-gopro">%s</a>', self::get_connect_url([ 'utm_source' => 'wp-plugins', 'utm_medium' => 'wp-dash', 'utm_campaign' => 'connect-and-activate-license', ]), __( 'Connect & Activate', 'elementor-pro' ) ); } if ( API::is_license_expired() ) { $links['renew_license'] = sprintf( '<a href="%s" class="elementor-plugins-gopro" target="_blank">%s</a>', 'https://go.elementor.com/wp-plugins-renew/', __( 'Renew Now', 'elementor-pro' ) ); } return $links; } public function plugin_auto_update_setting_html( $html, $plugin_file ) { $license_data = API::get_license_data(); if ( ELEMENTOR_PRO_PLUGIN_BASE === $plugin_file && ! $license_data['success'] ) { return '<span class="label">' . esc_html__( '(unavailable)', 'elementor-pro' ) . '</span>'; } return $html; } private function handle_dashboard_admin_widget() { add_action( 'elementor/admin/dashboard_overview_widget/after_version', function() { /* translators: %s: Elementor Pro version. */ $label = sprintf( esc_html__( 'Elementor Pro v%s', 'elementor-pro' ), ELEMENTOR_PRO_VERSION ); echo '<span class="e-overview__version">'; Utils::print_unescaped_internal_string( $label ); echo '</span>'; } ); add_filter( 'elementor/admin/dashboard_overview_widget/footer_actions', function( $additions_actions ) { unset( $additions_actions['go-pro'] ); if ( current_user_can( 'manage_options' ) ) { // Using 'go-pro' key to style the 'renew' button as the 'go-pro' button if ( API::is_license_expired() ) { $additions_actions['go-pro'] = [ 'title' => esc_html__( 'Renew Now', 'elementor-pro' ), 'link' => 'https://go.elementor.com/overview-widget-renew/', ]; } elseif ( API::is_need_to_show_upgrade_promotion() ) { $additions_actions['go-pro'] = [ 'title' => esc_html__( 'Upgrade', 'elementor-pro' ), 'link' => 'https://go.elementor.com/go-pro-advanced-wordpress-elementor-overview/', ]; } } return $additions_actions; }, 550 ); } public function add_finder_item( array $categories ) { $categories['settings']['items']['license'] = [ 'title' => esc_html__( 'License', 'elementor-pro' ), 'url' => self::get_url(), ]; return $categories; } private function render_manually_activation_widget( $license_key ) { ?> <div class="wrap elementor-admin-page-license"> <h2><?php echo esc_html__( 'License Settings', 'elementor-pro' ); ?></h2> <form class="elementor-license-box" method="post" action="<?php echo esc_url( admin_url( 'admin-post.php' ) ); ?>"> <?php wp_nonce_field( 'elementor-pro-license' ); ?> <h3> <?php echo esc_html__( 'Activate Manually', 'elementor-pro' ); ?> <?php if ( empty( $license_key ) ) : ?> <small> <a href="<?php echo esc_url( $this->get_connect_url() ); ?>" class="elementor-connect-link"> <?php echo esc_html__( 'Connect & Activate', 'elementor-pro' ); ?> </a> </small> <?php endif; ?> </h3> <?php if ( empty( $license_key ) ) : ?> <p><?php echo esc_html__( 'Enter your license key here, to activate Elementor Pro, and get feature updates, premium support and unlimited access to the template library.', 'elementor-pro' ); ?></p> <ol> <li> <?php printf( /* translators: 1: Link opening tag, 2: Link closing tag. */ esc_html__( 'Log in to %1$syour account%2$s to get your license key.', 'elementor-pro' ), '<a href="https://go.elementor.com/my-license/" target="_blank">', '</a>' ); ?> </li> <li> <?php printf( /* translators: 1: Link opening tag, 2: Link closing tag. */ esc_html__( 'If you don\'t yet have a license key, %1$sget Elementor Pro now%2$s.', 'elementor-pro' ), '<a href="https://go.elementor.com/pro-license/" target="_blank">', '</a>' ); ?> </li> <li> <?php echo esc_html__( 'Copy the license key from your account and paste it below.', 'elementor-pro' ); ?> </li> </ol> <input type="hidden" name="action" value="elementor_pro_activate_license"/> <label for="elementor-pro-license-key"><?php echo esc_html__( 'Your License Key', 'elementor-pro' ); ?></label> <input id="elementor-pro-license-key" class="regular-text code" name="elementor_pro_license_key" type="text" value="" placeholder="<?php esc_attr_e( 'Please enter your license key here', 'elementor-pro' ); ?>"/> <input type="submit" class="button button-primary" value="<?php esc_attr_e( 'Activate', 'elementor-pro' ); ?>"/> <p class="description"> <?php printf( /* translators: %s: Example license key. */ esc_html__( 'Your license key should look something like this: %s', 'elementor-pro' ), '<code>fb351f05958872E193feb37a505a84be</code>' ); ?> </p> <?php else : $license_data = API::get_license_data( true ); ?> <input type="hidden" name="action" value="elementor_pro_deactivate_license"/> <label for="elementor-pro-license-key"><?php echo esc_html__( 'Your License Key', 'elementor-pro' ); ?>:</label> <input id="elementor-pro-license-key" class="regular-text code" type="text" value="<?php echo esc_attr( self::get_hidden_license_key() ); ?>" disabled/> <input type="submit" class="button" value="<?php esc_attr_e( 'Deactivate', 'elementor-pro' ); ?>"/> <p><?php $this->render_part_license_status_header( $license_data ); ?></p> <?php $this->render_part_error_notification( $license_data ); ?> <?php endif; ?> </form> </div> <?php } public function on_deactivate_plugin( $plugin ) { if ( ELEMENTOR_PRO_PLUGIN_BASE !== $plugin ) { return; } wp_remote_post( 'https://my.elementor.com/api/v1/feedback-pro/', [ 'timeout' => 30, 'body' => [ 'api_version' => ELEMENTOR_PRO_VERSION, 'site_lang' => get_bloginfo( 'language' ), ], ] ); } private function is_connected() { return $this->get_app()->is_connected(); } public function get_connect_url( $params = [] ) { $action = $this->is_connected() ? 'activate_pro' : 'authorize'; return $this->get_app()->get_admin_url( $action, $params ); } private function get_switch_license_url( $params = [] ) { return $this->get_app()->get_admin_url( 'switch_license', $params ); } private function get_connected_account() { $user = $this->get_app()->get( 'user' ); $email = ''; if ( $user ) { $email = $user->email; } return $email; } private function get_deactivate_url() { return $this->get_app()->get_admin_url( 'deactivate' ); } private function get_activate_message() { return esc_html__( 'Please activate your license to get feature updates, premium support and unlimited access to the template library.', 'elementor-pro' ); } /** * @return Activate */ private function get_app() { return Plugin::elementor()->common->get_component( 'connect' )->get_app( 'activate' ); } private function redirect_to_document( $document_id ) { $document = Plugin::elementor()->documents->get( (int) $document_id ); if ( $document ) { // Triggers after the headers were sent, so a regular redirect won't work. ?> <meta http-equiv="refresh" content="0;url=<?php echo esc_url( $document->get_edit_url() ); ?>" /> <?php } } public function register_actions() { add_action( 'admin_menu', [ $this, 'register_page' ], 800 ); add_action( 'admin_init', [ $this, 'handle_tracker_actions' ], 9 ); add_action( 'admin_post_elementor_pro_activate_license', [ $this, 'action_activate_license' ] ); add_action( 'admin_post_elementor_pro_deactivate_license', [ $this, 'action_deactivate_license' ] ); add_action( 'admin_notices', [ $this, 'admin_license_details' ], 20 ); add_filter( 'elementor/core/admin/notices', function( $notices ) { $notices[] = new Trial_Period_Notice(); $notices[] = new Trial_Expired_Notice(); return $notices; } ); add_action( 'deactivate_plugin', [ $this, 'on_deactivate_plugin' ] ); // Add the license key to Templates Library requests add_filter( 'elementor/api/get_templates/body_args', [ $this, 'filter_library_get_templates_args' ] ); add_filter( 'elementor/finder/categories', [ $this, 'add_finder_item' ] ); add_filter( 'plugin_action_links_' . ELEMENTOR_PRO_PLUGIN_BASE, [ $this, 'plugin_action_links' ], 50 ); add_filter( 'plugin_auto_update_setting_html', [ $this, 'plugin_auto_update_setting_html' ], 10, 2 ); $this->handle_dashboard_admin_widget(); } } assets/js/admin.js 0000644 00000001412 14720402322 0010102 0 ustar 00 export default class Module extends elementorModules.Module { #actionLinks = [ { href: 'elementor_pro_renew_license_menu_link', external_url: 'https://go.elementor.com/wp-menu-renew/', }, { href: 'elementor_pro_upgrade_license_menu_link', external_url: 'https://go.elementor.com/go-pro-advanced-elementor-menu/', }, ]; onInit() { this.assignMenuItemActions(); } assignMenuItemActions() { window.addEventListener( 'DOMContentLoaded', () => { this.#actionLinks.forEach( ( item ) => { const link = document.querySelector( `a[href="${ item.href }"]` ); if ( ! link ) { return; } link.addEventListener( 'click', ( e ) => { e.preventDefault(); window.open( item.external_url, '_blank' ); } ); } ); } ); } }
| ver. 1.4 |
Github
|
.
| PHP 7.4.3-4ubuntu2.24 | Генерация страницы: 0.11 |
proxy
|
phpinfo
|
Настройка