PluginProbe
FireBox – WooCommerce Popup Builder, Exit Intent Popup, Email Optin & Cart Abandonment / 3.1.14
FireBox – WooCommerce Popup Builder, Exit Intent Popup, Email Optin & Cart Abandonment v3.1.14
3.1.14 3.1.13 3.1.12 3.1.11 3.1.10 3.1.9 3.1.8 3.1.7 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 All 123 releases
← All changes | Inc/Core/Frontend.php +117 -95 1.0.1 → 3.1.14 View file →
@@ -1,12 +1,12 @@
1 1 <?php
2 2 /**
3 3 * @package FireBox
4 - * @version 1.0.1 Free
4 + * @version 3.1.14 Free
5 5 *
6 6 * @author FirePlugins <[email protected]>
7 7 * @link https://www.fireplugins.com
8 - * @copyright Copyright © 2021 FirePlugins All Rights Reserved
8 + * @copyright Copyright © 2026 FirePlugins All Rights Reserved
9 9 * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
10 10 */
11 11
12 12 namespace FireBox\Core;
@@ -15,10 +15,8 @@
15 15 {
16 16 exit; // Exit if accessed directly.
17 17 }
18 18
19 -use FPFramework\Libs\Registry;
20 -
21 19 class Frontend
22 20 {
23 21 public function __construct()
24 22 {
@@ -27,43 +25,102 @@
27 25 {
28 26 return;
29 27 }
30 28
31 - $this->init_dependencies();
29 + // Keep FireBox assets out of WP Rocket's JS delay/defer/minify and CSS optimizations
30 + new \FireBox\Core\Libs\WPRocket();
32 31
33 - $this->render();
32 + wp_register_script(
33 + 'firebox-main',
34 + FBOX_MEDIA_PUBLIC_URL . 'js/firebox.js',
35 + [],
36 + FBOX_VERSION,
37 + ['in_footer' => true, 'strategy' => 'defer']
38 + );
39 +
40 + // The session stamper on its own, for pages where no campaign renders but a
41 + // campaign elsewhere depends on the session cookies staying accurate.
42 + wp_register_script(
43 + 'firebox-session-stamp',
44 + FBOX_MEDIA_PUBLIC_URL . 'js/session-stamp.js',
45 + [],
46 + FBOX_VERSION,
47 + ['in_footer' => true, 'strategy' => 'defer']
48 + );
49 +
50 + /**
51 + * The session stamper writes the cookies PHP reads back
52 + * (FPFramework\Base\Factory\Session), so it has to name and scope them
53 + * the same way. Attached to both handles because either one can carry
54 + * the stamper: it is bundled into the runtime and also ships alone.
55 + */
56 + $scope = wp_json_encode([
57 + 'name_prefix' => \FPFramework\Helpers\CookieScope::name(''),
58 + 'path' => \FPFramework\Helpers\CookieScope::path(),
59 + 'domain' => \FPFramework\Helpers\CookieScope::domain()
60 + ]);
61 +
62 + foreach (['firebox-main', 'firebox-session-stamp'] as $handle)
63 + {
64 + wp_add_inline_script($handle, 'window.fpfCookieScope = ' . $scope . ';', 'before');
65 + }
66 +
67 + // Prepare Gutenberg Blocks that contain attributes by FireBox
68 + new \FireBox\Core\FB\BoxBlocksParser();
69 +
70 + /**
71 + * Event that runs before any rendering of popups.
72 + */
73 + do_action('firebox/boxes/before_render');
74 +
75 + // Run Actions
76 + \FireBox\Core\Helpers\Actions::run();
77 +
78 + add_action('template_redirect', [$this, 'render']);
79 +
80 + add_action('wp_enqueue_scripts', [$this, 'enqueueEmbedStylesEarly']);
81 +
82 + /**
83 + * Event that runs after popups have been rendered.
84 + */
85 + do_action('firebox/boxes/after_render');
34 86 }
35 -
87 +
36 88 /**
37 - * Initializes the dependencies
38 - *
89 + * Enqueues the embed-mode campaign CSS early (wp_enqueue_scripts, before wp_head closes)
90 + * when the currently queried post/page contains an Embed Campaign block. This avoids a
91 + * flash of unstyled content, since renderEmbed() otherwise only enqueues this CSS later,
92 + * during content rendering.
93 + *
39 94 * @return void
40 95 */
41 - private function init_dependencies()
96 + public function enqueueEmbedStylesEarly()
42 97 {
43 - // load dashicons on front-end
44 - wp_enqueue_style('dashicons');
98 + $post = get_queried_object();
45 99
46 - /**
47 - * Event that runs before any rendering of popups.
48 - */
49 - do_action('firebox/boxes/before_render');
50 -
51 - $actions = [];
100 + if (!($post instanceof \WP_Post))
101 + {
102 + return;
103 + }
52 104
53 -
105 + if (!has_block('firebox/embed', $post))
106 + {
107 + return;
108 + }
54 109
55 - // Initialize Sounds
56 - $actions[] = new \FireBox\Core\FB\Actions\Sounds();
57 -
58 - // Make actions filterable
59 - $actions = apply_filters('firebox/actions/box/edit', $actions);
60 -
61 - // Run actions
62 - new \FireBox\Core\FB\Actions\ActionsBase($actions);
110 + wp_enqueue_style(
111 + 'firebox',
112 + FBOX_MEDIA_PUBLIC_URL . 'css/firebox.css',
113 + [],
114 + FBOX_VERSION
115 + );
63 116
64 - // Prepare Gutenberg Blocks that contain attributes by FireBox
65 - new \FireBox\Core\FB\BoxBlocksParser();
117 + wp_enqueue_style(
118 + 'fb-block-embed-campaign',
119 + FBOX_MEDIA_PUBLIC_URL . 'css/blocks/embed-campaign.css',
120 + [],
121 + FBOX_VERSION
122 + );
66 123 }
67 124
68 125 /**
69 126 * Renders all boxes on front-end
@@ -69,9 +126,9 @@
69 126 * Renders all boxes on front-end
70 127 *
71 128 * @return void
72 129 */
73 - private function render()
130 + public function render()
74 131 {
75 132 if ($this->checkForBoxPreview())
76 133 {
77 134 return;
@@ -76,94 +133,59 @@
76 133 {
77 134 return;
78 135 }
79 136
80 - if ($this->checkForBoxTemplatePreview())
137 + // Don't render the popup if previewing with third party page builders
138 + if (!$this->canRenderInEditors())
81 139 {
82 140 return;
83 141 }
84 142
85 - // increment session counter
86 - \FPFramework\Libs\Functions::incrementSession();
87 -
88 143 /**
89 144 * Adds all boxes at the end of page.
90 145 */
91 - add_action('wp', function() {
92 - firebox()->boxes->render();
93 - });
94 -
95 - /**
96 - * Event that runs after popups have been rendered.
97 - */
98 - do_action('firebox/boxes/after_render');
146 + firebox()->boxes->render();
99 147 }
100 148
101 149 /**
102 - * Check if we are previewing a box and do not show other boxes.
150 + * Don't render when previewing with third party page builders.
103 151 *
104 152 * @return boolean
105 153 */
106 - private function checkForBoxPreview()
154 + private function canRenderInEditors()
107 155 {
108 - $previewer = new Previewer();
109 - return $previewer->init();
110 - }
111 -
112 - /**
113 - * Check if we are previewing a box template and do not show other boxes.
114 - *
115 - * @return boolean
116 - */
117 - private function checkForBoxTemplatePreview()
118 - {
119 - // Preview a box template
120 - if (!isset($_GET['firebox_preview_template']))
156 + // Don't render the popup if previewing with Elementor
157 + if (class_exists('\Elementor\Plugin') &&
158 + property_exists(\Elementor\Plugin::$instance, 'preview') &&
159 + method_exists(\Elementor\Plugin::$instance->preview, 'is_preview_mode') &&
160 + \Elementor\Plugin::$instance->preview->is_preview_mode()
161 + )
121 162 {
122 - return false;
163 + return;
123 164 }
124 165
125 - $preview_box = sanitize_text_field($_GET['firebox_preview_template']);
126 - $this->render_template(base64_decode($preview_box));
127 - return true;
128 - }
129 -
130 - /**
131 - * Render template content
132 - *
133 - * @param string $template_alias
134 - *
135 - * @return void
136 - */
137 - private function render_template($template_alias)
138 - {
139 - $templates = firebox()->library;
140 -
141 - if (!$box = $templates->find($template_alias))
166 + // Don't render the popup if previewing with Beaver Builder
167 + if (class_exists('\FLBuilderModel') && method_exists('\FLBuilderModel', 'is_builder_active') && \FLBuilderModel::is_builder_active())
142 168 {
143 169 return;
144 170 }
145 171
146 - $box->params = new Registry($box->params);
147 -
148 - // Remove Publishing Assignments
149 - foreach ($box->params as $key => $value)
172 + // Don't render the popup if previewing with Bricks Builder
173 + if (function_exists('bricks_is_builder') && bricks_is_builder())
150 174 {
151 - if (strpos($key, 'assign') !== false)
152 - {
153 - $box->params->remove($key);
154 - }
175 + return;
155 176 }
156 - $box->params->remove('assignments');
177 +
178 + return true;
179 + }
157 180
158 - // Set id to 999999 for making front-end script happy
159 - $box->ID = 999999;
160 -
161 - // Enable Test Mode to prevent cookies
162 - $box->params->set('testmode', true);
163 -
164 - // Disable Statistics to prevent impressions from being tracked into the database
165 - $box->stats = 0;
166 -
167 - return firebox()->boxes->getBox()->render($box);
181 + /**
182 + * Check if we are previewing a box and do not show other boxes.
183 + *
184 + * @return boolean
185 + */
186 + private function checkForBoxPreview()
187 + {
188 + $previewer = new Previewer();
189 + return $previewer->init();
168 190 }
169 -}
191 +}