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/FB/BoxBlocksParser.php +99 -86 1.1.0 → 3.1.14 View file →
@@ -1,12 +1,12 @@
1 1 <?php
2 2 /**
3 3 * @package FireBox
4 - * @version 1.1.0 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 © 2022 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\FB;
@@ -19,70 +19,63 @@
19 19 class BoxBlocksParser
20 20 {
21 21 public function __construct()
22 22 {
23 - // filter the post content by setting supported block attributes
24 - add_filter('render_block', [$this, 'modify_block_output'], 10, 2);
23 + add_filter('render_block', [$this, 'parse_block'], 10, 2);
25 24 }
26 25
27 26 /**
28 - * Filters the block output by appending out custom data attributes
29 - * on our supported blocks
30 - *
27 + * Single entry point for all render_block work on this class. Bails immediately
28 + * when the block carries none of our FireBox attributes, before any preg_ /
29 + * get_post_type() work runs for every block on the page.
30 + *
31 31 * @param string $block_content
32 32 * @param array $block
33 - *
33 + *
34 34 * @return string
35 35 */
36 - public function modify_block_output($block_content, $block)
36 + public function parse_block($block_content, $block)
37 37 {
38 - if (!isset($block['blockName']))
38 + if (empty($block['attrs']) || !$this->hasFireBoxAttrs($block['attrs']))
39 39 {
40 40 return $block_content;
41 41 }
42 42
43 - $blockName = $block['blockName'];
43 + $block_content = $this->maybe_load_block_extension_script($block_content, $block);
44 + $block_content = $this->modify_block_output($block_content, $block);
44 45
45 - $parsable_blocks = [
46 - 'firebox/buttons',
47 - 'core/buttons',
48 - 'core/image'
49 - ];
50 -
51 - if (!in_array($blockName, $parsable_blocks))
52 - {
53 - return $block_content;
54 - }
46 + return $block_content;
47 + }
55 48
56 - /**
57 - * Handle Core Buttons Block
58 - */
59 - if (in_array($blockName, ['core/buttons', 'firebox/buttons']))
60 - {
61 - $buttons = isset($block['innerBlocks']) ? $block['innerBlocks'] : [];
62 - if (!$buttons)
63 - {
64 - return $block_content;
65 - }
49 + /**
50 + * Whether the block's attributes contain any FireBox-specific key.
51 + *
52 + * @param array $attrs
53 + *
54 + * @return bool
55 + */
56 + private function hasFireBoxAttrs($attrs)
57 + {
58 + return isset($attrs['dataFBoxOnClick']) || isset($attrs['dataFBoxOnClickURLAddParameters']);
59 + }
66 60
67 - foreach ($buttons as $button)
68 - {
69 - $block_content = $this->replaceBlockAttributes('a', $button, $block_content);
70 - }
71 - }
72 - /**
73 - * Handle Core Image Block
74 - */
75 - else if ($blockName == 'core/image')
61 + public function maybe_load_block_extension_script($block_content, $block)
62 + {
63 + if (isset($block['attrs']['dataFBoxOnClick']) && in_array($block['attrs']['dataFBoxOnClick'], ['copy_clipboard', 'download_file']))
76 64 {
77 - $new_block_html = $block['innerHTML'];
78 -
79 - // check if we have an anchor element and add attributes to this elem.
80 - $anchorExists = substr_count($new_block_html, '<a ');
81 -
82 - $element = $anchorExists ? 'a' : 'figure';
83 -
84 - $block_content = $this->replaceBlockAttributes($element, $block, $block_content);
65 + wp_enqueue_style(
66 + 'firebox-block-extensions',
67 + FBOX_MEDIA_PUBLIC_URL . 'css/block_extensions.css',
68 + [],
69 + FBOX_VERSION
70 + );
71 + wp_enqueue_script(
72 + 'firebox-block-extensions',
73 + FBOX_MEDIA_PUBLIC_URL . 'js/block_extensions.js',
74 + [],
75 + FBOX_VERSION,
76 + true
77 + );
85 78 }
86 79
87 80 return $block_content;
88 81 }
@@ -87,56 +80,75 @@
87 80 return $block_content;
88 81 }
89 82
90 83 /**
91 - * Adds the data attributes and class($atts) to the given element($element) within the block content($block_content)
92 - *
93 - * @param string $element
84 + * Filters the block output by appending out custom data attributes
85 + * on our supported blocks
86 + *
87 + * @param string $block_content
94 88 * @param array $block
95 - * @param string $block_element
96 - *
89 + *
97 90 * @return string
98 91 */
99 - private function replaceBlockAttributes($element, $block, $block_content)
92 + public function modify_block_output($block_content, $block)
100 93 {
101 94 $atts = $this->getBlockAttributes($block);
102 - if (!$atts['enabled'])
95 + if (!$atts['utmParamsEnabled'])
103 96 {
104 97 return $block_content;
105 98 }
106 99
107 - $new_block_html = $block['innerHTML'];
108 -
109 - // box
110 - if (!is_null($atts['box']) && $atts['box'] !== 'none')
100 + if (!isset($block['blockName']))
111 101 {
112 - if ($atts['box'] !== 'current')
113 - {
114 - $new_block_html = str_replace('<' . $element . ' ', '<' . $element . ' data-fbox="' . esc_attr($atts['box']) . '" ', $new_block_html);
115 - }
102 + return $block_content;
103 + }
116 104
117 - // cmd
118 - if ($atts['cmd'])
119 - {
120 - $new_block_html = str_replace('<' . $element . ' ', '<' . $element . ' data-fbox-cmd="' . esc_attr($atts['cmd']) . '" ', $new_block_html);
121 - }
122 -
123 - // prevent default
124 - if ($atts['preventDefault'])
125 - {
126 - $new_block_html = str_replace('<' . $element . ' ', '<' . $element . ' data-fbox-prevent="' . esc_attr((int) $atts['preventDefault']) . '" ', $new_block_html);
127 - }
105 + $blockName = $block['blockName'];
106 +
107 + $parsable_blocks = [
108 + 'firebox/button',
109 + 'firebox/image',
110 + 'core/button',
111 + 'core/image'
112 + ];
113 +
114 + if (!in_array($blockName, $parsable_blocks))
115 + {
116 + return $block_content;
128 117 }
129 118
130 - // class
131 - if ($atts['class'])
119 + // Check if href attribute contains ? then prefix is & else prefix is ?, use regex
120 + $utmPrefix = preg_match('/href="([^"]*)\?/', $block_content) ? '&' : '?';
121 +
122 + // Find utm_content
123 + $utmContent = '';
124 + if ($blockName === 'core/button')
132 125 {
133 - $new_block_html = preg_replace('/<' . $element . '(.*)class="/', "<" . $element . "$1class=\"" . esc_attr($atts['class']) . ' ', $new_block_html);
126 + $utmContent = trim(wp_strip_all_tags($block['innerHTML']));
134 127 }
128 + else if ($blockName === 'firebox/button')
129 + {
130 + $utmContent = isset($block['attrs']['text']) ? trim(wp_strip_all_tags($block['attrs']['text'])) : '';
131 + }
132 + else if ($blockName === 'core/image')
133 + {
134 + // Get the src attribute value from $block['innerHTML'] using regex
135 + $utmContent = preg_match('/src="([^"]*)"/', $block['innerHTML'], $matches) ? $matches[1] : '';
136 + }
137 + else if ($blockName === 'firebox/image')
138 + {
139 + $utmContent = isset($block['attrs']['image']['desktop']['url']) ? $block['attrs']['image']['desktop']['url'] : '';
140 + }
141 +
142 + // Get the UTM Parameters
143 + $utmParams = $utmPrefix . 'utm_source=' . get_post_type() . '&utm_medium=' . $blockName . '&utm_campaign=' . get_the_title() . '&utm_content=' . $utmContent;
135 144
136 - return str_replace($block['innerHTML'], $new_block_html, $block_content);
145 + // Find the href attribute and append to it the utm params
146 + $block_content = preg_replace('/href="([^"]*)"/', 'href="$1' . $utmParams . '"', $block_content);
147 +
148 + return $block_content;
137 149 }
138 -
150 +
139 151 /**
140 152 * Retrieves the block attributes
141 153 *
142 154 * @param array $block
@@ -144,15 +156,16 @@
144 156 * @return array
145 157 */
146 158 private function getBlockAttributes($block)
147 159 {
148 - $atts = [];
149 -
150 - $atts['enabled'] = isset($block['attrs']['dataFBoxEnabled']) ?: false;
151 - $atts['box'] = isset($block['attrs']['dataFBox']) ? $block['attrs']['dataFBox'] : null;
152 - $atts['cmd'] = isset($block['attrs']['dataFBoxCmd']) ? $block['attrs']['dataFBoxCmd'] : 'close';
153 - $atts['class'] = isset($block['attrs']['dataFBoxClass']) ? $block['attrs']['dataFBoxClass'] : '';
154 - $atts['preventDefault'] = isset($block['attrs']['dataFBoxPreventDefault']) ? $block['attrs']['dataFBoxPreventDefault'] : 1;
160 + $atts = [
161 + 'utmParamsEnabled' => false
162 + ];
163 +
164 + if (isset($block['attrs']['dataFBoxOnClickURLAddParameters']) && $block['attrs']['dataFBoxOnClickURLAddParameters'])
165 + {
166 + $atts['utmParamsEnabled'] = true;
167 + }
155 168
156 169 return $atts;
157 170 }
158 171 }