PluginProbe
Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits / 3.1.9
Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits v3.1.9
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.9, at inc/admin/popup-builder/class-popup-shortcode.php

176 lines 7.7 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 // Respect the popup activation toggle. An inactive popup must never render,
55 // even when explicitly placed via shortcode. Only display conditions are bypassed.
56 if (get_post_meta($popup_id, '_jltma_popup_activation', true) !== 'yes') {
57 return '';
58 }
59
60 // Queue this popup for footer rendering (bypasses conditions since user explicitly placed it)
61 $this->queued_popups[$popup_id] = true;
62
63 // Enqueue frontend assets
64 Assets_Manager::enqueue('popup-builder-frontend');
65
66 return '';
67 }
68
69 /**
70 * Render queued popups in footer
71 * Reuses the same HTML structure as Popup_Frontend::render_single_popup()
72 */
73 public function render_queued_popups() {
74 if (empty($this->queued_popups)) {
75 return;
76 }
77
78 foreach (array_keys($this->queued_popups) as $popup_id) {
79 // Skip if already rendered by Popup_Frontend
80 if (in_array($popup_id, Popup_Frontend::get_instance()->get_displayed_popups())) {
81 continue;
82 }
83
84 $this->render_single_popup($popup_id);
85 }
86 }
87
88 /**
89 * Render a single popup HTML
90 */
91 private function render_single_popup($popup_id) {
92 if (!defined('ELEMENTOR_VERSION')) {
93 return;
94 }
95
96 $elementor_content = \Elementor\Plugin::instance()->frontend->get_builder_content($popup_id, false);
97
98 if (empty($elementor_content)) {
99 return;
100 }
101
102 // Get popup settings from Elementor page settings
103 $elementor_settings = get_post_meta($popup_id, '_elementor_page_settings', true);
104 if (empty($elementor_settings)) {
105 $elementor_settings = [];
106 }
107
108 $popup_settings = [
109 'popup_trigger' => $elementor_settings['popup_trigger'] ?? 'page-load',
110 'popup_load_delay' => $elementor_settings['popup_load_delay'] ?? 1,
111 'popup_scroll_progress' => $elementor_settings['popup_scroll_progress'] ?? 50,
112 'popup_element_scroll' => $elementor_settings['popup_element_scroll'] ?? '',
113 'popup_specific_date' => $elementor_settings['popup_specific_date'] ?? '',
114 'popup_inactivity_time' => $elementor_settings['popup_inactivity_time'] ?? 15,
115 'popup_custom_trigger' => $elementor_settings['popup_custom_trigger'] ?? '',
116 'popup_click_trigger' => $elementor_settings['popup_click_trigger'] ?? '',
117 'popup_display_as' => $elementor_settings['popup_display_as'] ?? 'modal',
118 'popup_position' => $elementor_settings['popup_position'] ?? 'center-center',
119 'popup_animation' => $elementor_settings['popup_animation'] ?? 'jltma-anim-fade-in',
120 'popup_animation_duration' => $elementor_settings['popup_animation_duration'] ?? 400,
121 'popup_custom_positioning' => $elementor_settings['popup_custom_positioning'] ?? '',
122 'popup_show_close_button' => $elementor_settings['popup_show_close_button'] ?? 'yes',
123 'popup_close_button_position' => $elementor_settings['popup_close_button_position'] ?? 'top-right',
124 'popup_close_button_display_delay' => $elementor_settings['popup_close_button_display_delay'] ?? 0,
125 'popup_automatic_close_switch' => $elementor_settings['popup_automatic_close_switch'] ?? 'no',
126 'popup_automatic_close_delay' => $elementor_settings['popup_automatic_close_delay'] ?? 10,
127 'popup_close_on_overlay' => $elementor_settings['popup_close_on_overlay'] ?? 'yes',
128 'popup_close_esc_key' => $elementor_settings['popup_close_esc_key'] ?? 'yes',
129 'popup_disable_page_scroll' => $elementor_settings['popup_disable_page_scroll'] ?? 'yes',
130 'popup_show_again_delay' => $elementor_settings['popup_show_again_delay'] ?? 'no-delay',
131 'popup_show_on_device' => $elementor_settings['popup_show_on_device'] ?? 'yes',
132 'popup_show_on_device_tablet' => $elementor_settings['popup_show_on_device_tablet'] ?? 'yes',
133 'popup_show_on_device_mobile' => $elementor_settings['popup_show_on_device_mobile'] ?? 'yes',
134 'popup_stop_after_date' => $elementor_settings['popup_stop_after_date'] ?? 'no',
135 'popup_stop_after_date_select' => $elementor_settings['popup_stop_after_date_select'] ?? '',
136 'popup_show_via_referral' => $elementor_settings['popup_show_via_referral'] ?? 'no',
137 'popup_referral_keyword' => $elementor_settings['popup_referral_keyword'] ?? '',
138 'popup_disable_automatic' => $elementor_settings['popup_disable_automatic'] ?? 'no',
139 'popup_disable_after' => $elementor_settings['popup_disable_after'] ?? '',
140 ];
141
142 $position_class = 'jltma-popup-position-' . str_replace('_', '-', $popup_settings['popup_position']);
143
144 if (!empty($elementor_settings['popup_custom_positioning']) && $elementor_settings['popup_custom_positioning'] === 'yes') {
145 $position_class .= ' jltma-popup-custom-position';
146 }
147
148 $encoded_settings = wp_json_encode($popup_settings);
149
150 if (\Elementor\Plugin::instance()->preview->is_preview_mode()) {
151 return;
152 }
153
154 ?>
155 <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); ?>'>
156 <div class="jltma-template-popup-inner">
157 <div class="jltma-popup-overlay"></div>
158 <div class="jltma-popup-container">
159 <?php
160 $show_close_button = !isset($elementor_settings['popup_show_close_button']) || $elementor_settings['popup_show_close_button'] === 'yes';
161 if ($show_close_button) :
162 ?>
163 <div class="jltma-popup-close-btn jltma-popup-close-<?php echo esc_attr($elementor_settings['popup_close_button_position'] ?? 'top-right'); ?>">
164 <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>
165 </div>
166 <?php endif; ?>
167 <div class="jltma-popup-container-inner">
168 <?php echo $elementor_content; // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped ?>
169 </div>
170 </div>
171 </div>
172 </div>
173 <?php
174 }
175 }
176