PluginProbe
Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits / 3.1.2
Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits v3.1.2
3.2.2 3.2.3 3.2.1 3.2.0 3.1.9 3.1.8 3.1.7 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.9 trunk 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.3 1.1.4 1.1.5 All 174 releases
master-addons / inc / admin / popup-builder / class-popup-shortcode.php

class-popup-shortcode.php in Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits 3.1.2, at inc/admin/popup-builder/class-popup-shortcode.php

170 lines 7.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * Master Addons Popup Shortcode Handler
4 *
5 * @package MasterAddons
6 * @subpackage PopupBuilder
7 */
8
9 namespace MasterAddons\Inc\Admin\PopupBuilder;
10
11 use MasterAddons\Inc\Classes\Assets_Manager;
12
13 if (!defined('ABSPATH')) {
14 exit;
15 }
16
17 class Popup_Shortcode {
18
19 private static $instance = null;
20 private $queued_popups = [];
21
22 public static function get_instance() {
23 if (self::$instance === null) {
24 self::$instance = new self();
25 }
26 return self::$instance;
27 }
28
29 public function __construct() {
30 add_shortcode('jltma_popup', [$this, 'render_popup_shortcode']);
31 add_action('wp_footer', [$this, 'render_queued_popups'], 15);
32 }
33
34 /**
35 * Render popup shortcode
36 * Usage: [jltma_popup id="123"]
37 */
38 public function render_popup_shortcode($atts) {
39 $atts = shortcode_atts([
40 'id' => '',
41 ], $atts, 'jltma_popup');
42
43 if (empty($atts['id'])) {
44 return '';
45 }
46
47 $popup_id = intval($atts['id']);
48 $popup = get_post($popup_id);
49
50 if (!$popup || $popup->post_type !== 'jltma_popup' || $popup->post_status !== 'publish') {
51 return '';
52 }
53
54 // Queue this popup for footer rendering (bypasses conditions since user explicitly placed it)
55 $this->queued_popups[$popup_id] = true;
56
57 // Enqueue frontend assets
58 Assets_Manager::enqueue('popup-builder-frontend');
59
60 return '';
61 }
62
63 /**
64 * Render queued popups in footer
65 * Reuses the same HTML structure as Popup_Frontend::render_single_popup()
66 */
67 public function render_queued_popups() {
68 if (empty($this->queued_popups)) {
69 return;
70 }
71
72 foreach (array_keys($this->queued_popups) as $popup_id) {
73 // Skip if already rendered by Popup_Frontend
74 if (in_array($popup_id, Popup_Frontend::get_instance()->get_displayed_popups())) {
75 continue;
76 }
77
78 $this->render_single_popup($popup_id);
79 }
80 }
81
82 /**
83 * Render a single popup HTML
84 */
85 private function render_single_popup($popup_id) {
86 if (!defined('ELEMENTOR_VERSION')) {
87 return;
88 }
89
90 $elementor_content = \Elementor\Plugin::instance()->frontend->get_builder_content($popup_id, false);
91
92 if (empty($elementor_content)) {
93 return;
94 }
95
96 // Get popup settings from Elementor page settings
97 $elementor_settings = get_post_meta($popup_id, '_elementor_page_settings', true);
98 if (empty($elementor_settings)) {
99 $elementor_settings = [];
100 }
101
102 $popup_settings = [
103 'popup_trigger' => $elementor_settings['popup_trigger'] ?? 'page-load',
104 'popup_load_delay' => $elementor_settings['popup_load_delay'] ?? 1,
105 'popup_scroll_progress' => $elementor_settings['popup_scroll_progress'] ?? 50,
106 'popup_element_scroll' => $elementor_settings['popup_element_scroll'] ?? '',
107 'popup_specific_date' => $elementor_settings['popup_specific_date'] ?? '',
108 'popup_inactivity_time' => $elementor_settings['popup_inactivity_time'] ?? 15,
109 'popup_custom_trigger' => $elementor_settings['popup_custom_trigger'] ?? '',
110 'popup_click_trigger' => $elementor_settings['popup_click_trigger'] ?? '',
111 'popup_display_as' => $elementor_settings['popup_display_as'] ?? 'modal',
112 'popup_position' => $elementor_settings['popup_position'] ?? 'center-center',
113 'popup_animation' => $elementor_settings['popup_animation'] ?? 'jltma-anim-fade-in',
114 'popup_animation_duration' => $elementor_settings['popup_animation_duration'] ?? 400,
115 'popup_custom_positioning' => $elementor_settings['popup_custom_positioning'] ?? '',
116 'popup_show_close_button' => $elementor_settings['popup_show_close_button'] ?? 'yes',
117 'popup_close_button_position' => $elementor_settings['popup_close_button_position'] ?? 'top-right',
118 'popup_close_button_display_delay' => $elementor_settings['popup_close_button_display_delay'] ?? 0,
119 'popup_automatic_close_switch' => $elementor_settings['popup_automatic_close_switch'] ?? 'no',
120 'popup_automatic_close_delay' => $elementor_settings['popup_automatic_close_delay'] ?? 10,
121 'popup_close_on_overlay' => $elementor_settings['popup_close_on_overlay'] ?? 'yes',
122 'popup_close_esc_key' => $elementor_settings['popup_close_esc_key'] ?? 'yes',
123 'popup_disable_page_scroll' => $elementor_settings['popup_disable_page_scroll'] ?? 'yes',
124 'popup_show_again_delay' => $elementor_settings['popup_show_again_delay'] ?? 'no-delay',
125 'popup_show_on_device' => $elementor_settings['popup_show_on_device'] ?? 'yes',
126 'popup_show_on_device_tablet' => $elementor_settings['popup_show_on_device_tablet'] ?? 'yes',
127 'popup_show_on_device_mobile' => $elementor_settings['popup_show_on_device_mobile'] ?? 'yes',
128 'popup_stop_after_date' => $elementor_settings['popup_stop_after_date'] ?? 'no',
129 'popup_stop_after_date_select' => $elementor_settings['popup_stop_after_date_select'] ?? '',
130 'popup_show_via_referral' => $elementor_settings['popup_show_via_referral'] ?? 'no',
131 'popup_referral_keyword' => $elementor_settings['popup_referral_keyword'] ?? '',
132 'popup_disable_automatic' => $elementor_settings['popup_disable_automatic'] ?? 'no',
133 'popup_disable_after' => $elementor_settings['popup_disable_after'] ?? '',
134 ];
135
136 $position_class = 'jltma-popup-position-' . str_replace('_', '-', $popup_settings['popup_position']);
137
138 if (!empty($elementor_settings['popup_custom_positioning']) && $elementor_settings['popup_custom_positioning'] === 'yes') {
139 $position_class .= ' jltma-popup-custom-position';
140 }
141
142 $encoded_settings = wp_json_encode($popup_settings);
143
144 if (\Elementor\Plugin::instance()->preview->is_preview_mode()) {
145 return;
146 }
147
148 ?>
149 <div id="jltma-popup-id-<?php echo esc_attr($popup_id); ?>" class="jltma-template-popup <?php echo esc_attr($position_class); ?>" data-settings='<?php echo esc_attr($encoded_settings); ?>'>
150 <div class="jltma-template-popup-inner">
151 <div class="jltma-popup-overlay"></div>
152 <div class="jltma-popup-container">
153 <?php
154 $show_close_button = !isset($elementor_settings['popup_show_close_button']) || $elementor_settings['popup_show_close_button'] === 'yes';
155 if ($show_close_button) :
156 ?>
157 <div class="jltma-popup-close-btn jltma-popup-close-<?php echo esc_attr($elementor_settings['popup_close_button_position'] ?? 'top-right'); ?>">
158 <svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"/><line x1="6" y1="6" x2="18" y2="18"/></svg>
159 </div>
160 <?php endif; ?>
161 <div class="jltma-popup-container-inner">
162 <?php echo $elementor_content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
163 </div>
164 </div>
165 </div>
166 </div>
167 <?php
168 }
169 }
170