File: /home/deshuvsd/www/wp-content/plugins/ultimate-elementor/classes/class-uael-loader.php
<?php
/**
* UAEL Loader.
*
* @package UAEL
*/
use UltimateElementor\Classes\UAEL_Helper;
if ( ! class_exists( 'UAEL_Loader' ) ) {
/**
* Class UAEL_Loader.
*/
final class UAEL_Loader {
/**
* Member Variable
*
* @var instance
*/
private static $instance;
/**
* Initiator
*/
public static function get_instance() {
if ( ! isset( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Constructor
*/
public function __construct() {
// Activation hook.
register_activation_hook( UAEL_FILE, array( $this, 'activation_reset' ) );
// deActivation hook.
register_deactivation_hook( UAEL_FILE, array( $this, 'deactivation_reset' ) );
$this->define_constants();
add_action( 'plugins_loaded', array( $this, 'load_plugin' ) );
// Filter to change Astra menu positon.
add_filter( 'astra_menu_priority', array( $this, 'update_admin_menu_position' ) );
// Hook the load_textdomain function to the init action.
add_action( 'init', array( $this, 'load_textdomain' ) );
}
/**
* Update Astra's menu priority to show after Dashboard menu.
*
* @param int $menu_priority top level menu priority.
*/
public function update_admin_menu_position( $menu_priority ) {
return 2.1;
}
/**
* Defines all constants
*
* @since 0.0.1
*/
public function define_constants() {
define( 'UAEL_BASE', plugin_basename( UAEL_FILE ) );
define( 'UAEL_DIR', plugin_dir_path( UAEL_FILE ) );
define( 'UAEL_URL', plugins_url( '/', UAEL_FILE ) );
define( 'UAEL_VER', '1.40.1' );
define( 'UAEL_MODULES_DIR', UAEL_DIR . 'modules/' );
define( 'UAEL_MODULES_URL', UAEL_URL . 'modules/' );
define( 'UAEL_SLUG', 'uae' );
define( 'UAEL_CATEGORY', 'Ultimate Addons Pro' );
define( 'UAEL_DOMAIN', trailingslashit( 'https://ultimateelementor.com' ) );
define( 'UAEL_FACEBOOK_GRAPH_API_ENDPOINT', trailingslashit( 'https://graph.facebook.com/v2.12' ) );
define( 'UAEL_BSF_PACKAGE', file_exists( UAEL_DIR . 'class-brainstorm-update-uael.php' ) );
define( 'UAEL_PRO', true );
}
/**
* Loads plugin files.
*
* @since 0.0.1
*
* @return void
*/
public function load_plugin() {
if ( ! did_action( 'elementor/loaded' ) ) {
/* TO DO */
add_action( 'admin_notices', array( $this, 'uael_fails_to_load' ) );
add_action( 'network_admin_notices', array( $this, 'uael_fails_to_load' ) );
return;
}
$required_elementor_version = '3.5.0';
if ( defined( 'ELEMENTOR_VERSION' ) && ( ! version_compare( ELEMENTOR_VERSION, $required_elementor_version, '>=' ) ) ) {
add_action( 'admin_notices', array( $this, 'elementor_outdated' ) );
add_action( 'network_admin_notices', array( $this, 'elementor_outdated' ) );
return;
}
if ( ! defined( 'FS_CHMOD_FILE' ) ) {
define( 'FS_CHMOD_FILE', ( fileperms( ABSPATH . 'index.php' ) & 0777 | 0644 ) );
}
if ( ! function_exists( 'get_plugins' ) ) {
require_once ABSPATH . 'wp-admin/includes/plugin.php';
}
if ( is_admin() ) {
require_once UAEL_DIR . 'class-brainstorm-update-uael.php';
require_once UAEL_DIR . 'classes/class-uael-update.php';
}
// Hook the onboarding redirect function to admin_init action.
add_action( 'admin_init', __CLASS__ . '::uael_redirect_to_onboarding' );
add_action( 'admin_notices', __CLASS__ . '::hide_admin_notices', 1 );
add_action( 'all_admin_notices', __CLASS__ . '::hide_admin_notices', 1 );
// Load the NPS Survey library.
if ( ! class_exists( 'Uae_Pro_Nps_Survey' ) ) {
require_once UAEL_DIR . 'lib/class-uae-pro-nps-survey.php';
}
require_once UAEL_DIR . 'lib/astra-notices/class-astra-notices.php';
if ( ! class_exists( 'BSF_Analytics_Loader' ) ) {
require_once UAEL_DIR . 'admin/bsf-analytics/class-bsf-analytics-loader.php';
}
require_once UAEL_DIR . 'classes/class-uael-analytics.php';
if ( 'yes' === get_option( 'uae_analytics_optin', false ) ) {
add_action( 'shutdown', array( $this, 'maybe_run_uae_widgets_usage_check' ) );
}
require_once UAEL_DIR . 'classes/class-uael-core-plugin.php';
require_once UAEL_DIR . 'includes/admin/settings-api.php';
// Register hooks for modal popup tracking.
add_action( 'wp_footer', array( $this, 'uael_global_page_view_tracking' ) );
add_action( 'elementor/widget/before_render_content', array( $this, 'uael_check_for_modal_popups' ) );
}
/**
* Check the page on which Widget check need to be run.
*/
public function maybe_run_uae_widgets_usage_check() {
// Run only on admin.php?page=hfe and uae page.
// phpcs:ignore WordPress.Security.NonceVerification.Recommended -- Nonce verfication can't be done as just checking the value.
if ( is_admin() && isset( $_GET['page'] ) && 'uaepro' === $_GET['page'] ) {
$this->uae_check_widgets_data_usage();
}
}
/**
* Handle AJAX request to get widgets usage data.
*
* @since 1.39.3
*/
public function uae_check_widgets_data_usage() {
// Check user permissions.
if ( ! current_user_can( 'manage_options' ) ) {
return;
}
$transient_key = 'uaepro_widgets_usage_data';
$widgets_usage = get_transient( $transient_key );
if ( false === $widgets_usage || false === get_option( 'uaepro_widgets_usage_data_option' ) ) {
$filtered_widgets_usage = UAEL_Helper::uaepro_get_used_widget();
set_transient( $transient_key, $filtered_widgets_usage, MONTH_IN_SECONDS ); // Store for a month.
update_option( 'uaepro_widgets_usage_data_option', $filtered_widgets_usage );
}
}
/**
* Onboarding redirect function.
*/
public static function uael_redirect_to_onboarding() {
if ( ! get_option( 'uaepro_start_onboarding', false ) ) {
return;
}
$is_onboarding_triggered = ( 'yes' === get_option( 'uaepro_onboarding_triggered' ) ) ? true : false;
$is_lite_triggered = ( 'yes' === get_option( 'hfe_onboarding_triggered' ) ) ? true : false; // Check if onboarding is already triggered for lite version.
$show_onboarding = ( 'yes' === get_option( 'uaepro_show_onboarding' ) ) ? true : false; // Check if old user.
// IMPORTANT: Comment out this code before release - Show onboarding only for new users only once.
if ( $is_onboarding_triggered || $is_lite_triggered || ! $show_onboarding ) {
return;
}
delete_option( 'uaepro_start_onboarding' );
if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) {
update_option( 'uaepro_onboarding_triggered', 'yes' );
wp_safe_redirect( admin_url( 'admin.php?page=uaepro#onboarding' ) );
exit();
}
}
/**
* Hide admin notices on the custom settings page.
*
* @since 1.37.0
* @return void
*/
public static function hide_admin_notices() {
$screen = get_current_screen();
if ( 'toplevel_page_uaepro' === $screen->id || 'edit-elementor-hf' === $screen->id ) {
remove_all_actions( 'admin_notices' );
remove_all_actions( 'all_admin_notices' );
}
}
/**
* Load Ultimate Elementor Text Domain.
* This will load the translation textdomain depending on the file priorities.
* 1. Global Languages /wp-content/languages/ultimate-elementor/ folder
* 2. Local directory /wp-content/plugins/ultimate-elementor/languages/ folder
*
* @since 1.0.0
* @return void
*/
public function load_textdomain() {
// Default languages directory for "ultimate-elementor".
$lang_dir = UAEL_DIR . 'languages/';
/**
* Filters the languages directory path to use for AffiliateWP.
*
* @param string $lang_dir The languages directory path.
*/
$lang_dir = apply_filters( 'uael_languages_directory', $lang_dir );
// Traditional WordPress plugin locale filter.
global $wp_version;
$get_locale = get_locale();
if ( $wp_version >= 4.7 ) {
$get_locale = get_user_locale();
}
/**
* Language Locale for Ultimate Elementor
*
* @var $get_locale The locale to use. Uses get_user_locale()` in WordPress 4.7 or greater,
* otherwise uses `get_locale()`.
*/
$locale = apply_filters( 'plugin_locale', $get_locale, 'uael' );
$mofile = sprintf( '%1$s-%2$s.mo', 'uael', $locale );
// Setup paths to current locale file.
$mofile_local = $lang_dir . $mofile;
$mofile_global = WP_LANG_DIR . '/ultimate-elementor/' . $mofile;
if ( file_exists( $mofile_global ) ) {
// Look in global /wp-content/languages/ultimate-elementor/ folder.
load_textdomain( 'uael', $mofile_global );
} elseif ( file_exists( $mofile_local ) ) {
// Look in local /wp-content/plugins/ultimate-elementor/languages/ folder.
load_textdomain( 'uael', $mofile_local );
} else {
// Load the default language files.
load_plugin_textdomain( 'uael', false, $lang_dir );
}
}
/**
* Fires admin notice when Elementor is not installed and activated.
*
* @since 0.0.1
*
* @return void
*/
public function uael_fails_to_load() {
$screen = get_current_screen();
if ( isset( $screen->parent_file ) && 'plugins.php' === $screen->parent_file && 'update' === $screen->id ) {
return;
}
$class = 'notice notice-error';
/* translators: %s: html tags */
$message = sprintf( __( 'The %1$sUltimate Addons for Elementor Pro%2$s plugin requires %1$sElementor%2$s plugin installed & activated.', 'uael' ), '<strong>', '</strong>' );
$plugin = 'elementor/elementor.php';
if ( _is_elementor_installed() ) {
if ( ! current_user_can( 'activate_plugins' ) ) {
return;
}
$action_url = wp_nonce_url( 'plugins.php?action=activate&plugin=' . $plugin . '&plugin_status=all&paged=1&s', 'activate-plugin_' . $plugin );
$button_label = __( 'Activate Elementor', 'uael' );
} else {
if ( ! current_user_can( 'install_plugins' ) ) {
return;
}
$action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=elementor' ), 'install-plugin_elementor' );
$button_label = __( 'Install Elementor', 'uael' );
}
$button = '<a href="' . $action_url . '" class="button-primary" style="margin-left: 10px; margin-left: 10px;">' . $button_label . '</a>';
printf( '<div class="%1$s" style="display: flex; align-items: center; padding: 15px 0;"><p style="margin: 0; padding-left: 10px; padding-right: 10px;">%2$s</p>%3$s</div>', esc_attr( $class ), wp_kses_post( $message ), wp_kses_post( $button ) );
}
/**
* Fires admin notice when Elementor version is outdated.
*
* @since 1.30.1
*
* @return void
*/
public function elementor_outdated() {
$class = 'notice notice-error';
/* translators: %s: html tags */
$message = sprintf( __( 'The %1$sUltimate Addons for Elementor Pro%2$s plugin has stopped working because you are using an older version of %1$sElementor%2$s plugin.', 'uael' ), '<strong>', '</strong>' );
$plugin = 'elementor/elementor.php';
if ( _is_elementor_installed() ) {
if ( ! current_user_can( 'install_plugins' ) ) {
return;
}
$action_url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $plugin . '&', 'upgrade-plugin_' . $plugin );
$button_label = __( 'Update Elementor', 'uael' );
} else {
if ( ! current_user_can( 'install_plugins' ) ) {
return;
}
$action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=elementor' ), 'install-plugin_elementor' );
$button_label = __( 'Install Elementor', 'uael' );
}
$button = '<p><a href="' . $action_url . '" class="button-primary">' . $button_label . '</a></p><p></p>';
printf( '<div class="%1$s"><p>%2$s</p>%3$s</div>', esc_attr( $class ), wp_kses_post( $message ), wp_kses_post( $button ) );
}
/**
* Activation Reset
*/
public function activation_reset() {
update_option( 'uaepro_start_onboarding', true );
// Force check graupi bundled products.
update_site_option( 'bsf_force_check_extensions', true );
if ( is_network_admin() ) {
$branding = get_site_option( '_uael_white_label' );
} else {
$branding = get_option( '_uael_white_label' );
}
if ( isset( $branding['agency']['hide_branding'] ) && false !== $branding['agency']['hide_branding'] ) {
$branding['agency']['hide_branding'] = false;
if ( is_network_admin() ) {
update_site_option( '_uael_white_label', $branding );
} else {
update_option( '_uael_white_label', $branding );
}
}
}
/**
* Deactivation Reset
*/
public function deactivation_reset() {
}
/**
* Global Page View Tracking for Modal Popup Feature
* This function tracks page views globally and per page for modal popups.
*
* It uses localStorage to store the view counts and logs debug information if enabled.
*/
public function uael_global_page_view_tracking() {
// Only run on frontend, not in admin or during AJAX requests.
if ( is_admin() || wp_doing_ajax() || wp_doing_cron() ) {
return;
}
// Check if any modal popup widgets exist on the site (to avoid unnecessary tracking).
$has_modal_popups = get_option( 'uael_has_modal_popups', false );
// If we haven't checked yet or if there are modal popups, add the tracking script.
if ( false === $has_modal_popups || $has_modal_popups ) {
// Check if any popup on the site uses global tracking.
$has_global_tracking = get_option( 'uael_has_global_tracking', false );
$has_session_tracking = get_option( 'uael_has_session_tracking', false );
?>
<script type="text/javascript">
(function() {
// Global page view and session tracking for UAEL Modal Popup feature
try {
// Session tracking: increment if this is a new session
<?php if ( $has_session_tracking ) : ?>
var activeSessionKey = 'uael_active_session';
var isActiveSession = sessionStorage.getItem(activeSessionKey);
if (null === isActiveSession) {
// This is a new session, increment the counter
var currentSessions = parseInt(localStorage.getItem('uael_sessions') || '0');
currentSessions++;
localStorage.setItem('uael_sessions', currentSessions.toString());
// Mark this session as active
sessionStorage.setItem(activeSessionKey, 'true');
}
<?php endif; ?>
// Check if any popup on this page uses current page tracking
var hasCurrentPageTracking = false;
var currentPagePopups = [];
// Check all modal popups on this page for current page tracking
if (typeof jQuery !== 'undefined') {
jQuery('.uael-modal-parent-wrapper').each(function() {
var scope = jQuery(this).data('page-views-scope');
var enabled = jQuery(this).data('page-views-enabled');
var popupId = jQuery(this).attr('id').replace('-overlay', '');
if (enabled === 'yes' && scope === 'current') {
hasCurrentPageTracking = true;
currentPagePopups.push(popupId);
}
});
}
// Global tracking: ALWAYS increment if ANY popup on the site uses global tracking
<?php if ( $has_global_tracking ) : ?>
var currentViews = parseInt(localStorage.getItem('uael_page_views') || '0');
currentViews++;
localStorage.setItem('uael_page_views', currentViews.toString());
<?php endif; ?>
// Current page tracking: increment per-page counters
if (hasCurrentPageTracking && currentPagePopups.length > 0) {
var currentUrl = window.location.href;
var urlKey = 'uael_page_views_' + btoa(currentUrl).replace(/[^a-zA-Z0-9]/g, '').substring(0, 50);
var currentPageViews = parseInt(localStorage.getItem(urlKey) || '0');
currentPageViews++;
localStorage.setItem(urlKey, currentPageViews.toString());
// Store URL mapping for each popup
for (var i = 0; i < currentPagePopups.length; i++) {
var popupUrlKey = 'uael_popup_' + currentPagePopups[i] + '_url_key';
localStorage.setItem(popupUrlKey, urlKey);
}
}
} catch (e) {
// Silently fail if localStorage is not available
}
})();
</script>
<?php
}
}
/**
* Optimize by checking if site has modal popup widgets (optimization)
*
* @param object $widget The widget object.
*/
public function uael_check_for_modal_popups( $widget ) {
if ( 'uael-modal-popup' === $widget->get_name() ) {
update_option( 'uael_has_modal_popups', true );
// Check if this popup uses global tracking.
$settings = $widget->get_settings_for_display();
$page_views_enabled = isset( $settings['enable_page_views'] ) ? $settings['enable_page_views'] : 'no';
$tracking_scope = isset( $settings['page_views_scope'] ) ? $settings['page_views_scope'] : 'global';
$sessions_enabled = isset( $settings['enable_sessions'] ) ? $settings['enable_sessions'] : 'no';
if ( 'yes' === $page_views_enabled && 'global' === $tracking_scope ) {
update_option( 'uael_has_global_tracking', true );
}
if ( 'yes' === $sessions_enabled ) {
update_option( 'uael_has_session_tracking', true );
}
}
}
}
/**
* Prepare if class 'UAEL_Loader' exist.
* Kicking this off by calling 'get_instance()' method
*/
UAEL_Loader::get_instance();
}
/**
* Is elementor plugin installed.
*/
if ( ! function_exists( '_is_elementor_installed' ) ) {
/**
* Check if Elementor Pro is installed
*
* @since 1.0.0
*
* @access public
*/
function _is_elementor_installed() {
$path = 'elementor/elementor.php';
$plugins = get_plugins();
return isset( $plugins[ $path ] );
}
}
/**
* Is WPML String Translation is active.
*/
if ( ! function_exists( 'is_wpml_string_translation_active' ) ) {
/**
* Check if WPML String Translation plugin is active.
*
* @since 1.2.0
*/
function is_wpml_string_translation_active() {
include_once ABSPATH . 'wp-admin/includes/plugin.php';
return is_plugin_active( 'wpml-string-translation/plugin.php' );
}
}