ruạṛ
<?php /** * Entry point for the plugin. Checks if Elementor is installed and activated and loads it's own files and actions. * * @package header-footer-elementor */ use HFE\Lib\Astra_Target_Rules_Fields; /** * Class Header_Footer_Elementor */ class Header_Footer_Elementor { /** * Current theme template * * @var string */ public $template; /** * Instance of Elemenntor Frontend class. * * @var object \Elementor\Frontend() */ private static $elementor_instance; /** * Instance of HFE_Admin * * @var Header_Footer_Elementor */ private static $_instance = null; /** * Instance of Header_Footer_Elementor * * @return Header_Footer_Elementor Instance of Header_Footer_Elementor */ public static function instance() { if ( ! isset( self::$_instance ) ) { self::$_instance = new self(); } return self::$_instance; } /** * Constructor */ public function __construct() { $this->template = get_template(); $is_elementor_callable = ( defined( 'ELEMENTOR_VERSION' ) && is_callable( 'Elementor\Plugin::instance' ) ) ? true : false; $required_elementor_version = '3.5.0'; $is_elementor_outdated = ( $is_elementor_callable && ( ! version_compare( ELEMENTOR_VERSION, $required_elementor_version, '>=' ) ) ) ? true : false; if ( ( ! $is_elementor_callable ) || $is_elementor_outdated ) { $this->elementor_not_available( $is_elementor_callable, $is_elementor_outdated ); } if ( $is_elementor_callable ) { self::$elementor_instance = Elementor\Plugin::instance(); $this->includes(); add_action( 'admin_init', [ $this, 'hfe_redirect_to_onboarding' ] ); add_action( 'init', [ $this, 'load_hfe_textdomain' ] ); add_filter( 'elementor/admin-top-bar/is-active', function( $is_active, $current_screen ) { if ( strpos( $current_screen->id, 'elementor-hf' ) !== false ) { return false; } return $is_active; }, 10, 2 ); add_action( 'current_screen', function () { $current_screen = get_current_screen(); if ( $current_screen && ( 'edit-elementor-hf' === $current_screen->id || 'elementor-hf' === $current_screen->id ) ) { add_action( 'in_admin_header', function () { $this->render_admin_top_bar(); } ); } } ); $is_theme_supported = true; if ( 'genesis' == $this->template ) { require HFE_DIR . 'themes/genesis/class-hfe-genesis-compat.php'; } elseif ( 'astra' == $this->template ) { require HFE_DIR . 'themes/astra/class-hfe-astra-compat.php'; } elseif ( 'bb-theme' == $this->template || 'beaver-builder-theme' == $this->template ) { $this->template = 'beaver-builder-theme'; require HFE_DIR . 'themes/bb-theme/class-hfe-bb-theme-compat.php'; } elseif ( 'generatepress' == $this->template ) { require HFE_DIR . 'themes/generatepress/class-hfe-generatepress-compat.php'; } elseif ( 'oceanwp' == $this->template ) { require HFE_DIR . 'themes/oceanwp/class-hfe-oceanwp-compat.php'; } elseif ( 'storefront' == $this->template ) { require HFE_DIR . 'themes/storefront/class-hfe-storefront-compat.php'; } elseif ( 'hello-elementor' == $this->template ) { require HFE_DIR . 'themes/hello-elementor/class-hfe-hello-elementor-compat.php'; } elseif ( 'kadence' == $this->template ) { require HFE_DIR . 'themes/kadence/class-hfe-kadence-compat.php'; } elseif ( 'neve' == $this->template ) { require HFE_DIR . 'themes/neve/class-hfe-neve-compat.php'; } elseif ( 'blocksy' == $this->template ) { require HFE_DIR . 'themes/blocksy/class-hfe-blocksy-compat.php'; } else { $is_theme_supported = false; add_filter( 'hfe_settings_tabs', [ $this, 'setup_unsupported_theme' ] ); add_action( 'init', [ $this, 'setup_fallback_support' ] ); } update_option( 'hfe_is_theme_supported', $is_theme_supported ); add_action( 'init', [ $this, 'setup_settings_page' ] ); if ( 'yes' === get_option( 'uae_lite_is_activated' ) ) { add_action( 'admin_init', [ $this, 'get_plugin_version' ] ); } // Filter to change Astra menu positon. add_filter( 'astra_menu_priority', [ $this, 'update_admin_menu_position' ] ); // Scripts and styles. add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_scripts' ] ); add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_admin_scripts' ] ); add_filter( 'body_class', [ $this, 'body_class' ] ); add_action( 'switch_theme', [ $this, 'reset_unsupported_theme_notice' ] ); add_shortcode( 'hfe_template', [ $this, 'render_template' ] ); // Add Elementor preview notice add_action( 'wp_footer', [ $this, 'elementor_preview_notice' ] ); require_once HFE_DIR . 'inc/class-hfe-analytics.php'; } } /** * 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; } /** * Onboarding redirect function. */ public function hfe_redirect_to_onboarding() { if ( ! get_option( 'hfe_start_onboarding', false ) ) { return; } $is_old_user = ( 'yes' === get_option( 'hfe_plugin_is_activated' ) ) ? true : false; $is_onboarding_triggered = ( 'yes' === get_option( 'hfe_onboarding_triggered' ) ) ? true : false; $is_uaepro_active = ( defined( 'UAEL_PRO' ) && UAEL_PRO ) ? true : false; // IMPORTANT: Comment out this code before release - Show onboarding only for new users only once. if ( $is_old_user || $is_onboarding_triggered || $is_uaepro_active ) { return; } delete_option( 'hfe_start_onboarding' ); if ( ! defined( 'WP_CLI' ) || ! WP_CLI ) { update_option( 'hfe_onboarding_triggered', 'yes' ); wp_safe_redirect( admin_url( 'admin.php?page=hfe#onboarding' ) ); exit(); } } /* * Render admin top bar */ private function render_admin_top_bar() { ?> <div id="hfe-admin-top-bar-root"> </div> <?php } /** * Reset the Unsupported theme nnotice after a theme is switched. * * @since 1.0.16 * * @return void */ public function reset_unsupported_theme_notice() { delete_user_meta( get_current_user_id(), 'unsupported-theme' ); } /** * Display Elementor preview notice in footer when in preview mode. * * @since 2.4.9 * @return void */ public function elementor_preview_notice() { // Show notice only for page post type in preview mode if ( ! $this->should_show_preview_notice() ) { return; } ?> <style> @keyframes slideInFromBottom { 0% { transform: translateY(100%); opacity: 0; } 100% { transform: translateY(0); opacity: 1; } } @keyframes slideOutToBottom { 0% { transform: translateY(0); opacity: 1; } 100% { transform: translateY(100%); opacity: 0; } } .hfe-promo-notice { position: fixed; bottom: 0; left: 0; right: 0; background: #000; color: #ffffff; padding: 10px 20px; box-shadow: 0 -4px 20px rgba(0, 0, 0, 0.15); z-index: 999999; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; font-size: 14px; font-weight: 500; animation: slideInFromBottom 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94); backdrop-filter: blur(10px); border-top: 1px solid rgba(255, 255, 255, 0.2); display: none; } .hfe-promo-notice.show { display: block; } .hfe-promo-notice.hide { animation: slideOutToBottom 0.4s cubic-bezier(0.55, 0.06, 0.68, 0.19) forwards; } .hfe-promo-notice-container { display: flex; align-items: center; justify-content: space-around; } .hfe-promo-notice-content { display: flex; align-items: center; /* flex: 1; */ } .hfe-promo-notice-icon { display: inline-flex; width: 24px; height: 24px; margin-right: 12px; background: rgba(255, 255, 255, 0.2); border-radius: 50%; align-items: center; justify-content: center; font-size: 14px; flex-shrink: 0; } .hfe-promo-notice-text { flex: 1; line-height: 1.4; } .hfe-promo-notice-title { font-weight: 600; margin-bottom: 2px; font-size: 15px; } .hfe-promo-notice-description { opacity: 0.9; font-size: 14px; } .hfe-promo-notice-cta { margin-left: 8px; padding: 5px 16px; background: rgb(96, 5, 255); border: 1px solid rgb(96, 5, 255); color: #ffffff; text-decoration: none; border-radius: 4px; font-size: 12px; font-weight: 600; transition: all 0.2s ease; white-space: nowrap; } .hfe-promo-notice-cta:hover { background:rgb(96, 5, 255); color: #ffffff; text-decoration: none; } .hfe-promo-notice-close { margin-left: 16px; position: absolute; right:5px; background: none; border: none; color: rgba(255, 255, 255, 0.8); font-size: 20px; cursor: pointer; padding: 4px; width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; border-radius: 50%; transition: all 0.2s ease; flex-shrink: 0; } .hfe-promo-notice-close:hover { background: rgba(255, 255, 255, 0.1); color: #ffffff; } @media (max-width: 768px) { .hfe-promo-notice { padding: 12px 16px; font-size: 13px; } .hfe-promo-notice-container { flex-direction: column; align-items: stretch; gap: 12px; } .hfe-promo-notice-content { flex-direction: column; align-items: flex-start; text-align: left; } .hfe-promo-notice-icon { margin-right: 8px; width: 20px; height: 20px; font-size: 12px; } .hfe-promo-notice-cta { margin-left: 0; margin-top: 8px; align-self: flex-start; } .hfe-promo-notice-close { position: absolute; top: 8px; right: 8px; margin-left: 0; } } @media (max-width: 480px) { .hfe-promo-notice-container { padding-right: 40px; } .hfe-promo-notice-title { font-size: 14px; } .hfe-promo-notice-description { font-size: 12px; } } </style> <div id="hfe-promo-notice" class="hfe-promo-notice"> <div class="hfe-promo-notice-container"> <div class="hfe-promo-notice-content"> <!-- <div class="hfe-promo-notice-icon">🚀</div> --> <div class="hfe-promo-notice-text"> <!-- <div class="hfe-promo-notice-title">Unlock More Elementor Widgets!</div> --> <div class="hfe-promo-notice-description">Psst… want to save hours? Get 300+ professionally built templates.</div> </div> <a href="https://ultimateelementor.com/pricing/?utm_source=preview&utm_medium=notice&utm_campaign=uae-lite" target="_blank" class="hfe-promo-notice-cta"> Unlock Now </a> </div> <button class="hfe-promo-notice-close" onclick="hfePromoNotice.dismiss()">×</button> </div> </div> <script>window.hfePromoNotice={storageKey:'hfe_promo_notice_dismissed',oneMonthMs:2592000000,init:function(){this.shouldShow()&&this.show()},shouldShow:function(){try{const a=localStorage.getItem(this.storageKey);if(!a)return!0;const b=parseInt(a),c=Date.now();return c-b>=this.oneMonthMs}catch(a){return!0}},show:function(){const a=document.getElementById('hfe-promo-notice');a&&a.classList.add('show')},dismiss:function(){const a=document.getElementById('hfe-promo-notice');a&&(a.classList.add('hide'),setTimeout(()=>{a.remove()},400));try{localStorage.setItem(this.storageKey,Date.now().toString())}catch(a){console.log('Could not save dismissal state')}}};"loading"===document.readyState?document.addEventListener('DOMContentLoaded',function(){hfePromoNotice.init()}):hfePromoNotice.init();</script> <?php } /** * Check if preview notice should be shown for page post type only. * * @since 2.4.9 * @return bool */ private function should_show_preview_notice() { // Don't show if UAE Pro is already installed/activated if ( is_plugin_active( 'ultimate-elementor/ultimate-elementor.php' ) || file_exists( WP_PLUGIN_DIR . '/ultimate-elementor/ultimate-elementor.php' ) ) { return false; } // Basic preview check if ( ! isset( $_GET['preview'] ) || sanitize_text_field( wp_unslash( $_GET['preview'] ) ) !== 'true' ) { return false; } // Must have preview_id if ( ! isset( $_GET['preview_id'] ) ) { return false; } $preview_id = intval( sanitize_text_field( wp_unslash( $_GET['preview_id'] ) ) ); // Verify preview nonce for security (if available) if ( isset( $_GET['preview_nonce'] ) ) { $preview_nonce = sanitize_text_field( wp_unslash( $_GET['preview_nonce'] ) ); if ( ! wp_verify_nonce( $preview_nonce, 'post_preview_' . $preview_id ) ) { return false; } } // Check if it's a page post type (not header/footer templates) $post_type = get_post_type( $preview_id ); if ( $post_type !== 'page' ) { return false; } // Exclude header/footer templates from UAE $template_type = get_post_meta( $preview_id, 'ehf_template_type', true ); if ( ! empty( $template_type ) ) { return false; // This is a header/footer template, don't show notice } // Optional: Check if page uses Elementor if ( ! $this->is_elementor_page( $preview_id ) ) { return false; } // Optional: Allow filtering for custom conditions return apply_filters( 'hfe_show_preview_notice', true, $preview_id ); } /** * Check if the page is built with Elementor. * * @since 2.4.9 * @param int $post_id Post ID to check. * @return bool */ private function is_elementor_page( $post_id ) { if ( ! class_exists( '\Elementor\Plugin' ) ) { return false; } $elementor_data = get_post_meta( $post_id, '_elementor_data', true ); return ! empty( $elementor_data ); } /** * Prints the admin notics when Elementor is not installed or activated or version outdated. * * @since 1.5.9 * @param boolean $is_elementor_callable specifies if elementor is available. * @param boolean $is_elementor_outdated specifies if elementor version is old. * @return void */ public function elementor_not_available( $is_elementor_callable, $is_elementor_outdated ) { if ( ( ! did_action( 'elementor/loaded' ) ) || ( ! $is_elementor_callable ) ) { add_action( 'admin_notices', [ $this, 'elementor_not_installed_activated' ] ); add_action( 'network_admin_notices', [ $this, 'elementor_not_installed_activated' ] ); return; } if ( $is_elementor_outdated ) { add_action( 'admin_notices', [ $this, 'elementor_outdated' ] ); add_action( 'network_admin_notices', [ $this, 'elementor_outdated' ] ); return; } } /** * Prints the admin notics when Elementor is not installed or activated. * * @return void */ public function elementor_not_installed_activated() { $screen = get_current_screen(); if ( isset( $screen->parent_file ) && 'plugins.php' === $screen->parent_file && 'update' === $screen->id ) { return; } if ( ! did_action( 'elementor/loaded' ) ) { // Check user capability. if ( ! ( current_user_can( 'activate_plugins' ) && current_user_can( 'install_plugins' ) ) ) { return; } /* TO DO */ $class = 'notice notice-error'; /* translators: %s: html tags */ $message = sprintf( __( 'The %1$sUltimate Addons for Elementor%2$s plugin requires %1$sElementor%2$s plugin installed & activated.', 'header-footer-elementor' ), '<strong>', '</strong>' ); $plugin = 'elementor/elementor.php'; if ( _is_elementor_installed() ) { $action_url = wp_nonce_url( 'plugins.php?action=activate&plugin=' . $plugin . '&plugin_status=all&paged=1&s', 'activate-plugin_' . $plugin ); $button_label = __( 'Activate Elementor', 'header-footer-elementor' ); } else { $action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=elementor' ), 'install-plugin_elementor' ); $button_label = __( 'Install Elementor', 'header-footer-elementor' ); } $button = '<p><a href="' . esc_url( $action_url ) . '" class="button-primary">' . esc_html( $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 ) ); } } /** * Prints the admin notics when Elementor version is outdated. * * @return void */ public function elementor_outdated() { // Check user capability. if ( ! ( current_user_can( 'activate_plugins' ) && current_user_can( 'install_plugins' ) ) ) { return; } /* TO DO */ $class = 'notice notice-error'; /* translators: %s: html tags */ $message = sprintf( __( 'The %1$sUltimate Addons for Elementor%2$s plugin has stopped working because you are using an older version of %1$sElementor%2$s plugin.', 'header-footer-elementor' ), '<strong>', '</strong>' ); $plugin = 'elementor/elementor.php'; if ( file_exists( WP_PLUGIN_DIR . '/elementor/elementor.php' ) ) { $action_url = wp_nonce_url( self_admin_url( 'update.php?action=upgrade-plugin&plugin=' ) . $plugin . '&', 'upgrade-plugin_' . $plugin ); $button_label = __( 'Update Elementor', 'header-footer-elementor' ); } else { $action_url = wp_nonce_url( self_admin_url( 'update.php?action=install-plugin&plugin=elementor' ), 'install-plugin_elementor' ); $button_label = __( 'Install Elementor', 'header-footer-elementor' ); } $button = '<p><a href="' . esc_url( $action_url ) . '" class="button-primary">' . esc_html( $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 ) ); } /** * Plugin version tracking. * * @return void */ public function get_plugin_version() { $hfe_old_version = get_option( 'hfe_plugin_version' ); $old_version = $hfe_old_version ? $hfe_old_version : HFE_VER; $new_version = HFE_VER; if ( ! $hfe_old_version || ( $old_version !== $new_version ) ) { // Store previous version. update_option( 'hfe_plugin_previous_version', $old_version ); update_option( 'hfe_plugin_version', $new_version ); } } /** * Loads the globally required files for the plugin. * * @return void */ public function includes() { require_once HFE_DIR . 'admin/class-hfe-admin.php'; require_once HFE_DIR . 'inc/hfe-functions.php'; require_once HFE_DIR . 'inc/class-hfe-rollback.php'; // Load Post Duplicator if enabled if ( function_exists( 'get_option' ) ) { $widgets = get_option( '_hfe_widgets', array() ); if ( isset( $widgets['Post_Duplicator'] ) && 'disabled' !== $widgets['Post_Duplicator'] ) { require_once HFE_DIR . 'inc/class-hfe-post-duplicator.php'; } } // Load Elementor Canvas Compatibility. require_once HFE_DIR . 'inc/class-hfe-elementor-canvas-compat.php'; // Load WPML & Polylang Compatibility if WPML is installed and activated. if ( defined( 'ICL_SITEPRESS_VERSION' ) || defined( 'POLYLANG_BASENAME' ) ) { require_once HFE_DIR . 'inc/compatibility/class-hfe-wpml-compatibility.php'; } // Load the Admin Notice Class. require_once HFE_DIR . 'inc/lib/astra-notices/class-astra-notices.php'; // Load Target rules. require_once HFE_DIR . 'inc/lib/target-rule/class-astra-target-rules-fields.php'; // Setup upgrade routines. require_once HFE_DIR . 'inc/class-hfe-update.php'; // Load the widgets. require HFE_DIR . 'inc/widgets-manager/class-widgets-loader.php'; // Load the extensions. require HFE_DIR . 'inc/widgets-manager/class-extensions-loader.php'; require_once HFE_DIR . 'inc/settings/hfe-settings-api.php'; // Load the NPS Survey library. if ( ! class_exists( 'Uae_Nps_Survey' ) ) { require_once HFE_DIR . 'inc/lib/class-uae-nps-survey.php'; } // Load the Promotion system for Ultimate Elementor if ( ! class_exists( 'HFE_Promotion' ) ) { require_once HFE_DIR . 'inc/class-hfe-promotion.php'; } } /** * Loads textdomain for the plugin. * * @return void */ public function load_hfe_textdomain() { // Default languages directory for "header-footer-elementor". $lang_dir = HFE_DIR . 'languages/'; /** * Filters the languages directory path to use for AffiliateWP. * * @param string $lang_dir The languages directory path. */ $lang_dir = apply_filters( 'hfe_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, 'header-footer-elementor' ); $mofile = sprintf( '%1$s-%2$s.mo', 'header-footer-elementor', $locale ); // Setup paths to current locale file. $mofile_local = $lang_dir . $mofile; $mofile_global = WP_LANG_DIR . '/header-footer-elementor/' . $mofile; if ( file_exists( $mofile_global ) ) { // Look in global /wp-content/languages/header-footer-elementor/ folder. load_textdomain( 'header-footer-elementor', $mofile_global ); } elseif ( file_exists( $mofile_local ) ) { // Look in local /wp-content/plugins/header-footer-elementor/languages/ folder. load_textdomain( 'header-footer-elementor', $mofile_local ); } else { // Load the default language files. load_plugin_textdomain( 'header-footer-elementor', false, $lang_dir ); } } /** * Enqueue styles and scripts. * * @return void */ public function enqueue_scripts() { wp_enqueue_style( 'hfe-style', HFE_URL . 'assets/css/header-footer-elementor.css', [], HFE_VER ); if ( class_exists( '\Elementor\Plugin' ) ) { $elementor = \Elementor\Plugin::instance(); if ( method_exists( $elementor->frontend, 'enqueue_styles' ) ) { $elementor->frontend->enqueue_styles(); } } if ( class_exists( '\ElementorPro\Plugin' ) ) { $elementor_pro = \ElementorPro\Plugin::instance(); if ( method_exists( $elementor_pro, 'enqueue_styles' ) ) { $elementor_pro->enqueue_styles(); } } if ( hfe_header_enabled() ) { if ( class_exists( '\Elementor\Core\Files\CSS\Post' ) ) { $css_file = new \Elementor\Core\Files\CSS\Post( get_hfe_header_id() ); } elseif ( class_exists( '\Elementor\Post_CSS_File' ) ) { $css_file = new \Elementor\Post_CSS_File( get_hfe_header_id() ); } if ( isset( $css_file ) ) { $css_file->enqueue(); } } if ( hfe_footer_enabled() ) { if ( class_exists( '\Elementor\Core\Files\CSS\Post' ) ) { $css_file = new \Elementor\Core\Files\CSS\Post( get_hfe_footer_id() ); } elseif ( class_exists( '\Elementor\Post_CSS_File' ) ) { $css_file = new \Elementor\Post_CSS_File( get_hfe_footer_id() ); } if ( isset( $css_file ) ) { $css_file->enqueue(); } } if ( hfe_is_before_footer_enabled() ) { if ( class_exists( '\Elementor\Core\Files\CSS\Post' ) ) { $css_file = new \Elementor\Core\Files\CSS\Post( hfe_get_before_footer_id() ); } elseif ( class_exists( '\Elementor\Post_CSS_File' ) ) { $css_file = new \Elementor\Post_CSS_File( hfe_get_before_footer_id() ); } if ( isset( $css_file ) ) { $css_file->enqueue(); } } } /** * Load admin styles on header footer elementor edit screen. * * @return void */ public function enqueue_admin_scripts() { global $pagenow; $screen = get_current_screen(); if ( ( 'elementor-hf' == $screen->id && ( 'post.php' == $pagenow || 'post-new.php' == $pagenow ) ) || ( 'edit.php' == $pagenow && 'edit-elementor-hf' == $screen->id ) ) { wp_enqueue_style( 'hfe-admin-style', HFE_URL . 'admin/assets/css/ehf-admin.css', [], HFE_VER ); wp_enqueue_script( 'hfe-admin-script', HFE_URL . 'admin/assets/js/ehf-admin.js', [ 'jquery', 'updates' ], HFE_VER, true ); } } /** * Adds classes to the body tag conditionally. * * @param array $classes array with class names for the body tag. * * @return array array with class names for the body tag. */ public function body_class( $classes ) { if ( hfe_header_enabled() ) { $classes[] = 'ehf-header'; } if ( hfe_footer_enabled() ) { $classes[] = 'ehf-footer'; } $classes[] = 'ehf-template-' . $this->template; $classes[] = 'ehf-stylesheet-' . get_stylesheet(); return $classes; } /** * Display Settings Page options * * @since 1.6.0 * @return void */ public function setup_settings_page() { require_once HFE_DIR . 'inc/class-hfe-settings-page.php'; } /** * Display Unsupported theme notice if the current theme does add support for 'header-footer-elementor' * * @param array $hfe_settings_tabs settings array tabs. * @since 1.0.3 * @return array */ public function setup_unsupported_theme( $hfe_settings_tabs = [] ) { if ( ! current_theme_supports( 'header-footer-elementor' ) ) { $hfe_settings_tabs['hfe_settings'] = [ 'name' => __( 'Theme Support', 'header-footer-elementor' ), 'url' => admin_url( 'themes.php?page=hfe-settings' ), ]; } return $hfe_settings_tabs; } /** * Add support for theme if the current theme does add support for 'header-footer-elementor' * * @since 1.6.1 * @return void */ public function setup_fallback_support() { if ( ! current_theme_supports( 'header-footer-elementor' ) ) { $hfe_compatibility_option = get_option( 'hfe_compatibility_option', '1' ); if ( '1' === $hfe_compatibility_option ) { if ( ! class_exists( 'HFE_Default_Compat' ) ) { require_once HFE_DIR . 'themes/default/class-hfe-default-compat.php'; } } elseif ( '2' === $hfe_compatibility_option ) { require HFE_DIR . 'themes/default/class-global-theme-compatibility.php'; } } } /** * Prints the Header content. * * @return void */ public static function get_header_content() { $header_content = self::$elementor_instance->frontend->get_builder_content_for_display( get_hfe_header_id() ); echo $header_content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- If escaped output is not rendered on frontend. } /** * Prints the Footer content. * * @return void */ public static function get_footer_content() { echo "<div class='footer-width-fixer'>"; echo self::$elementor_instance->frontend->get_builder_content_for_display( get_hfe_footer_id() ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- If escaped output is not rendered on frontend. echo '</div>'; } /** * Prints the Before Footer content. * * @return void */ public static function get_before_footer_content() { echo "<div class='footer-width-fixer'>"; echo self::$elementor_instance->frontend->get_builder_content_for_display( hfe_get_before_footer_id() ); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped -- If escaped output is not rendered on frontend. echo '</div>'; } /** * Get option for the plugin settings * * @param string $setting Option name. * @param string $default Default value to be received if the option value is not stored in the option. * * @return mixed | string */ public static function get_settings( $setting = '', $default = '' ) { if ( 'type_header' == $setting || 'type_footer' == $setting || 'type_before_footer' == $setting ) { $templates = self::get_template_id( $setting ); $template = ! is_array( $templates ) ? $templates : $templates[0]; $template = apply_filters( "hfe_get_settings_{$setting}", $template ); return $template; } } /** * Get header or footer template id based on the meta query. * * @param String $type Type of the template header/footer. * * @return Mixed Returns the header or footer template id if found, else returns string ''. */ public static function get_template_id( $type ) { $option = [ 'location' => 'ehf_target_include_locations', 'exclusion' => 'ehf_target_exclude_locations', 'users' => 'ehf_target_user_roles', ]; $hfe_templates = Astra_Target_Rules_Fields::get_instance()->get_posts_by_conditions( 'elementor-hf', $option ); foreach ( $hfe_templates as $template ) { if ( get_post_meta( absint( $template['id'] ), 'ehf_template_type', true ) === $type ) { if ( function_exists( 'pll_current_language' ) ) { if ( pll_current_language( 'slug' ) == pll_get_post_language( $template['id'], 'slug' ) ) { return $template['id']; } } else { return $template['id']; } } } return ''; } /** * Callback to shortcode. * * @param array $atts attributes for shortcode. * @return string */ public function render_template( $atts ) { $atts = shortcode_atts( [ 'id' => '', ], $atts, 'hfe_template' ); $id = ! empty( $atts['id'] ) ? apply_filters( 'hfe_render_template_id', intval( $atts['id'] ) ) : ''; if ( empty( $id ) ) { return ''; } // Check if the current user has permission to edit posts. if ( ! current_user_can( 'edit_post', $id ) ) { $post_status = get_post_status( $id ); // Prevent access to drafts, private, pending, and password-protected posts for unauthorized users. if ( in_array( $post_status, [ 'draft', 'private', 'pending' ], true ) || post_password_required( $id ) ) { return ''; // Prevent access to restricted posts. } } if ( class_exists( '\Elementor\Core\Files\CSS\Post' ) ) { $css_file = new \Elementor\Core\Files\CSS\Post( $id ); } elseif ( class_exists( '\Elementor\Post_CSS_File' ) ) { // Load elementor styles. $css_file = new \Elementor\Post_CSS_File( $id ); } $css_file->enqueue(); return self::$elementor_instance->frontend->get_builder_content_for_display( $id ); } } /** * Is elementor plugin installed. */ if ( ! function_exists( '_is_elementor_installed' ) ) { /** * Check if Elementor is installed * * @since 1.6.0 * * @access public * @return bool */ function _is_elementor_installed() { return ( file_exists( WP_PLUGIN_DIR . '/elementor/elementor.php' ) ) ? true : false; } }
cải xoăn