PluginProbe
Boxzilla – WordPress Popup Builder / 3.2.21
Boxzilla – WordPress Popup Builder v3.2.21
3.4.11 3.4.10 3.4.9 3.4.3 3.4.4 3.4.5 3.4.6 3.4.7 3.4.8 trunk 3.0 3.0.1 3.0.2 3.0.3 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 All 72 releases
← All changes | src/class-loader.php +276 -294 3.4.113.2.21 View file →
@@ -1,351 +1,333 @@
1 1 <?php
2 2
3 3 namespace Boxzilla;
4 4
5 -if (! defined('ABSPATH')) {
6 - exit;
7 -}
5 +class BoxLoader {
8 6
9 -class BoxLoader
10 -{
11 - /**
12 - * @var Plugin
13 - */
14 - private $plugin;
15 7
16 - /**
17 - * @var array
18 - */
19 - private $box_ids_to_load = [];
8 + /**
9 + * @var Plugin
10 + */
11 + private $plugin;
20 12
21 - /**
22 - * @var array
23 - */
24 - protected $options;
13 + /**
14 + * @var array
15 + */
16 + private $box_ids_to_load = array();
25 17
26 - /**
27 - * Constructor
28 - *
29 - * @param Plugin $plugin
30 - * @param array $options
31 - */
32 - public function __construct(Plugin $plugin, array $options)
33 - {
34 - $this->plugin = $plugin;
35 - $this->options = $options;
36 - }
18 + /**
19 + * @var array
20 + */
21 + protected $options;
37 22
38 - /**
39 - * Initializes the plugin, runs on `wp` hook.
40 - */
41 - public function init()
42 - {
43 - $this->box_ids_to_load = $this->filter_boxes();
23 + /**
24 + * Constructor
25 + *
26 + * @param Plugin $plugin
27 + * @param array $options
28 + */
29 + public function __construct( Plugin $plugin, array $options ) {
30 + $this->plugin = $plugin;
31 + $this->options = $options;
32 + }
44 33
45 - // Only add other hooks if necessary
46 - add_action('wp_head', [$this, 'print_preload_js'], 10, 0);
47 - if (count($this->box_ids_to_load) > 0) {
48 - add_action('wp_footer', [ $this, 'print_boxes_content' ], 1);
49 - add_action('wp_enqueue_scripts', [ $this, 'load_assets' ], 90);
50 - }
51 - }
34 + /**
35 + * Initializes the plugin, runs on `wp` hook.
36 + */
37 + public function init() {
38 + $this->box_ids_to_load = $this->filter_boxes();
52 39
53 - /**
54 - * Prints the preload API so that the Boxzilla JS API can be used before Boxzilla itself is loaded
55 - * This allows us to defer the Boxzilla script itself.
56 - */
57 - public function print_preload_js(): void
58 - {
59 - echo '<script>';
60 - include BOXZILLA_DIR . '/assets/js/preload.js';
61 - echo '</script>';
62 - }
40 + // Only add other hooks if necessary
41 + if ( count( $this->box_ids_to_load ) > 0 ) {
42 + add_action( 'wp_footer', array( $this, 'print_boxes_content' ), 1 );
43 + add_action( 'wp_enqueue_scripts', array( $this, 'load_assets' ), 90 );
44 + }
45 + }
63 46
64 - /**
65 - * Get global rules for all boxes
66 - *
67 - * @return array
68 - */
69 - protected function get_filter_rules(): array
70 - {
71 - $rules = get_option('boxzilla_rules', []);
72 - return is_array($rules) ? $rules : [];
73 - }
47 + /**
48 + * Get global rules for all boxes
49 + *
50 + * @return array
51 + */
52 + protected function get_filter_rules() {
53 + $rules = get_option( 'boxzilla_rules', array() );
74 54
55 + if ( ! is_array( $rules ) ) {
56 + return array();
57 + }
75 58
76 - /**
77 - * Match a string against an array of patterns, glob-style.
78 - *
79 - * @param string $string
80 - * @param array $patterns
81 - * @param bool $contains
82 - * @return bool
83 - */
84 - protected function match_patterns($string, array $patterns, $contains = false)
85 - {
86 - $string = strtolower($string);
59 + return $rules;
60 + }
87 61
88 - foreach ($patterns as $pattern) {
89 - $pattern = rtrim($pattern, '/');
90 - $pattern = strtolower($pattern);
91 62
92 - if ($contains) {
93 - // contains means we should do a simple occurrence check
94 - // does not support wildcards
95 - $match = strpos($string, $pattern) !== false;
96 - } elseif (function_exists('fnmatch')) {
97 - $match = fnmatch($pattern, $string);
98 - } else {
99 - $match = ( $pattern === $string );
100 - }
63 + /**
64 + * Match a string against an array of patterns, glob-style.
65 + *
66 + * @param string $string
67 + * @param array $patterns
68 + * @param boolean $contains
69 + * @return boolean
70 + */
71 + protected function match_patterns( $string, array $patterns, $contains = false ) {
72 + $string = strtolower( $string );
101 73
102 - if ($match) {
103 - return true;
104 - }
105 - }
74 + foreach ( $patterns as $pattern ) {
75 + $pattern = rtrim( $pattern, '/' );
76 + $pattern = strtolower( $pattern );
106 77
107 - return false;
108 - }
78 + if ( $contains ) {
79 + // contains means we should do a simple occurrence check
80 + // does not support wildcards
81 + $match = strpos( $string, $pattern ) !== false;
82 + } else if ( function_exists( 'fnmatch' ) ) {
83 + $match = fnmatch( $pattern, $string );
84 + } else {
85 + $match = ( $pattern === $string );
86 + }
109 87
110 - /**
111 - * @return string
112 - */
113 - protected function get_request_url()
114 - {
115 - return rtrim(wp_unslash($_SERVER['REQUEST_URI'] ?? ''), '/');
116 - }
88 + if ( $match ) {
89 + return true;
90 + }
91 + }
117 92
118 - /**
119 - * Check if this rule passes (conditional matches expected value)
120 - *
121 - * @param string $condition
122 - * @param string $value
123 - * @param boolean $qualifier
124 - *
125 - * @return bool
126 - */
127 - protected function match_rule($condition, $value, $qualifier = true)
128 - {
129 - $matched = false;
93 + return false;
94 + }
130 95
131 - // cast value to array & trim whitespace or excess comma's
132 - $values = array_map('trim', explode(',', rtrim(trim($value), ',')));
96 + /**
97 + * @return string
98 + */
99 + protected function get_request_url() {
100 + return rtrim( $_SERVER['REQUEST_URI'], '/' );
101 + }
133 102
134 - switch ($condition) {
135 - case 'everywhere':
136 - $matched = true;
137 - break;
103 + /**
104 + * Check if this rule passes (conditional matches expected value)
105 + *
106 + * @param string $condition
107 + * @param string $value
108 + * @param boolean $qualifier
109 + *
110 + * @return bool
111 + */
112 + protected function match_rule( $condition, $value, $qualifier = true ) {
113 + $matched = false;
138 114
139 - case 'is_url':
140 - $url = $this->get_request_url();
141 - $matched = $this->match_patterns($url, $values, $qualifier === 'contains' || $qualifier === 'not_contains');
142 - break;
115 + // cast value to array & trim whitespace or excess comma's
116 + $values = array_map( 'trim', explode( ',', rtrim( trim( $value ), ',' ) ) );
143 117
144 - case 'is_referer':
145 - if (! empty($_SERVER['HTTP_REFERER'])) {
146 - $referer = wp_unslash($_SERVER['HTTP_REFERER']);
147 - $matched = $this->match_patterns($referer, $values, $qualifier === 'contains' || $qualifier === 'not_contains');
148 - }
149 - break;
118 + switch ( $condition ) {
119 + case 'everywhere':
120 + $matched = true;
121 + break;
150 122
151 - case 'is_post_type':
152 - $post_type = (string) get_post_type();
153 - $matched = in_array($post_type, $values, true);
154 - break;
123 + case 'is_url':
124 + $url = $this->get_request_url();
125 + $matched = $this->match_patterns( $url, $values, $qualifier === 'contains' || $qualifier === 'not_contains' );
126 + break;
155 127
156 - case 'is_single':
157 - case 'is_post':
158 - // convert to empty string if array with just empty string in it
159 - $value = ( $values === [ '' ] ) ? '' : $values;
160 - $matched = is_single($value);
161 - break;
128 + case 'is_referer':
129 + if ( ! empty( $_SERVER['HTTP_REFERER'] ) ) {
130 + $referer = $_SERVER['HTTP_REFERER'];
131 + $matched = $this->match_patterns( $referer, $values, $qualifier === 'contains' || $qualifier === 'not_contains' );
132 + }
133 + break;
162 134
163 - case 'is_post_in_category':
164 - $matched = is_singular() && has_category($values);
165 - break;
135 + case 'is_post_type':
136 + $post_type = (string) get_post_type();
137 + $matched = in_array( $post_type, $values, true );
138 + break;
166 139
167 - case 'is_page':
168 - $matched = is_page($values);
169 - break;
140 + case 'is_single':
141 + case 'is_post':
142 + // convert to empty string if array with just empty string in it
143 + $value = ( $values === array( '' ) ) ? '' : $values;
144 + $matched = is_single( $value );
145 + break;
170 146
171 - case 'is_post_with_tag':
172 - $matched = is_singular() && has_tag($values);
173 - break;
147 + case 'is_post_in_category':
148 + $matched = is_singular() && has_category( $values );
149 + break;
174 150
175 - case 'is_user_logged_in':
176 - $matched = is_user_logged_in();
177 - break;
178 - }
151 + case 'is_page':
152 + $matched = is_page( $values );
153 + break;
179 154
180 - /**
181 - * Filters whether a given box rule matches the condition and expected value.
182 - *
183 - * The dynamic portion of the hook, `$condition`, refers to the condition being matched.
184 - *
185 - * @param boolean $matched
186 - * @param array $values
187 - */
188 - $matched = apply_filters('boxzilla_box_rule_matches_' . $condition, $matched, $values);
155 + case 'is_post_with_tag':
156 + $matched = is_singular() && has_tag( $values );
157 + break;
189 158
190 - // if qualifier is set to false, we need to reverse this value here.
191 - if (! $qualifier || $qualifier === 'not_contains') {
192 - $matched = ! $matched;
193 - }
159 + case 'is_user_logged_in':
160 + $matched = is_user_logged_in();
161 + break;
162 + }
194 163
195 - return $matched;
196 - }
164 + /**
165 + * Filters whether a given box rule matches the condition and expected value.
166 + *
167 + * The dynamic portion of the hook, `$condition`, refers to the condition being matched.
168 + *
169 + * @param boolean $matched
170 + * @param array $values
171 + */
172 + $matched = apply_filters( 'boxzilla_box_rule_matches_' . $condition, $matched, $values );
197 173
198 - /**
199 - * Checks which boxes should be loaded for this request.
200 - *
201 - * @return array
202 - */
203 - private function filter_boxes()
204 - {
205 - $box_ids_to_load = [];
206 - $rules = $this->get_filter_rules();
174 + // if qualifier is set to false, we need to reverse this value here.
175 + if ( ! $qualifier || $qualifier === 'not_contains' ) {
176 + $matched = ! $matched;
177 + }
207 178
208 - foreach ($rules as $box_id => $box_rules) {
209 - $matched = false;
210 - $comparision = isset($box_rules['comparision']) ? $box_rules['comparision'] : 'any';
179 + return $matched;
180 + }
211 181
212 - // loop through all rules for all boxes
213 - foreach ($box_rules as $rule) {
214 - // skip faulty values (and comparision rule)
215 - if (! is_array($rule) || empty($rule['condition'])) {
216 - continue;
217 - }
182 + /**
183 + * Checks which boxes should be loaded for this request.
184 + *
185 + * @return array
186 + */
187 + private function filter_boxes() {
188 + $box_ids_to_load = array();
189 + $rules = $this->get_filter_rules();
218 190
219 - $qualifier = isset($rule['qualifier']) ? $rule['qualifier'] : true;
220 - $matched = $this->match_rule($rule['condition'], $rule['value'], $qualifier);
191 + foreach ( $rules as $box_id => $box_rules ) {
192 + $matched = false;
193 + $comparision = isset( $box_rules['comparision'] ) ? $box_rules['comparision'] : 'any';
221 194
222 - // break out of loop if we've already matched
223 - if ($comparision === 'any' && $matched) {
224 - break;
225 - }
195 + // loop through all rules for all boxes
196 + foreach ( $box_rules as $rule ) {
226 197
227 - // no need to continue if this rule didn't match
228 - if ($comparision === 'all' && ! $matched) {
229 - break;
230 - }
231 - }
198 + // skip faulty values (and comparision rule)
199 + if ( empty( $rule['condition'] ) ) {
200 + continue;
201 + }
232 202
233 - // value of $matched at this point determines whether box should be loaded
234 - $load_box = $matched;
203 + $qualifier = isset( $rule['qualifier'] ) ? $rule['qualifier'] : true;
204 + $matched = $this->match_rule( $rule['condition'], $rule['value'], $qualifier );
235 205
236 - /**
237 - * Filters whether a box should be loaded into the page HTML.
238 - *
239 - * The dynamic portion of the hook, `$box_id`, refers to the ID of the box. Return true if you want to output the box.
240 - *
241 - * @param boolean $load_box
242 - */
243 - $load_box = apply_filters('boxzilla_load_box_' . $box_id, $load_box);
206 + // break out of loop if we've already matched
207 + if ( $comparision === 'any' && $matched ) {
208 + break;
209 + }
244 210
245 - /**
246 - * Filters whether a box should be loaded into the page HTML.
247 - *
248 - * @param boolean $load_box
249 - * @param int $box_id
250 - */
251 - $load_box = apply_filters('boxzilla_load_box', $load_box, $box_id);
211 + // no need to continue if this rule didn't match
212 + if ( $comparision === 'all' && ! $matched ) {
213 + break;
214 + }
215 + }
252 216
253 - // if matched, box should be loaded on this page
254 - if ($load_box) {
255 - $box_ids_to_load[] = $box_id;
256 - }
257 - }
217 + // value of $matched at this point determines whether box should be loaded
218 + $load_box = $matched;
258 219
259 - /**
260 - * Filters which boxes should be loaded on this page, expects an array of post ID's.
261 - *
262 - * @param array $box_ids_to_load
263 - */
264 - return apply_filters('boxzilla_load_boxes', $box_ids_to_load);
265 - }
220 + /**
221 + * Filters whether a box should be loaded into the page HTML.
222 + *
223 + * The dynamic portion of the hook, `$box_id`, refers to the ID of the box. Return true if you want to output the box.
224 + *
225 + * @param boolean $load_box
226 + */
227 + $load_box = apply_filters( 'boxzilla_load_box_' . $box_id, $load_box );
266 228
267 - /**
268 - * Load plugin styles
269 - */
270 - public function load_assets()
271 - {
272 - wp_enqueue_style('boxzilla', $this->plugin->url('/assets/css/styles.css'), [], $this->plugin->version());
273 - wp_enqueue_script('boxzilla', $this->plugin->url('/assets/js/script.js'), [], $this->plugin->version(), [
274 - 'strategy' => 'defer',
275 - ]);
229 + /**
230 + * Filters whether a box should be loaded into the page HTML.
231 + *
232 + * @param boolean $load_box
233 + * @param int $box_id
234 + */
235 + $load_box = apply_filters( 'boxzilla_load_box', $load_box, $box_id );
276 236
277 - // create boxzilla_Global_Options object
278 - $plugin_options = $this->options;
279 - $boxes = $this->get_matched_boxes();
237 + // if matched, box should be loaded on this page
238 + if ( $load_box ) {
239 + $box_ids_to_load[] = $box_id;
240 + }
241 + }
280 242
281 - $data = [
282 - 'testMode' => (bool) $plugin_options['test_mode'],
283 - 'boxes' => (array) array_map(
284 - function (Box $box) {
285 - return $box->get_client_options();
286 - },
287 - $boxes
288 - ),
289 - ];
290 - wp_add_inline_script('boxzilla', 'var boxzilla_options = ' . wp_json_encode($data) . ';', 'before');
291 - do_action('boxzilla_load_assets', $this);
292 - }
243 + /**
244 + * Filters which boxes should be loaded on this page, expects an array of post ID's.
245 + *
246 + * @param array $box_ids_to_load
247 + */
248 + return apply_filters( 'boxzilla_load_boxes', $box_ids_to_load );
249 + }
293 250
294 - public function print_boxes_content()
295 - {
296 - $boxes = $this->get_matched_boxes();
297 - if (empty($boxes)) {
298 - return;
299 - }
251 + /**
252 + * Load plugin styles
253 + */
254 + public function load_assets() {
255 + $pre_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
256 + wp_enqueue_script( 'boxzilla', $this->plugin->url( '/assets/js/script' . $pre_suffix . '.js' ), array(), $this->plugin->version(), true );
300 257
301 - echo '<div style="display: none;">';
302 - foreach ($boxes as $box) {
303 - printf('<div id="boxzilla-box-%d-content">%s</div>', absint($box->ID), $box->get_content()); // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
304 - }
305 - echo '</div>';
306 - }
258 + // create boxzilla_Global_Options object
259 + $plugin_options = $this->options;
260 + $boxes = $this->get_matched_boxes();
307 261
308 - /**
309 - * Get an array of Box objects. These are the boxes that will be loaded for the current request.
310 - *
311 - * @return Box[]
312 - */
313 - public function get_matched_boxes()
314 - {
315 - static $boxes;
262 + $data = array(
263 + 'testMode' => (bool) $plugin_options['test_mode'],
264 + 'boxes' => (array) array_map(
265 + function ( Box $box ) {
266 + return $box->get_client_options();
267 + },
268 + $boxes
269 + ),
270 + );
316 271
317 - if ($boxes === null) {
318 - if (count($this->box_ids_to_load) === 0) {
319 - return [];
320 - }
272 + wp_localize_script( 'boxzilla', 'boxzilla_options', $data );
321 273
322 - // query Box posts
323 - $q = new \WP_Query();
324 - $posts = $q->query(
325 - [
326 - 'post_type' => 'boxzilla-box',
327 - 'post_status' => 'publish',
328 - 'post__in' => $this->box_ids_to_load,
329 - 'posts_per_page' => count($this->box_ids_to_load),
330 - 'ignore_sticky_posts' => true,
331 - 'no_found_rows' => true,
332 - ]
333 - );
274 + do_action( 'boxzilla_load_assets', $this );
275 + }
334 276
335 - // create `Box` instances out of \WP_Post instances
336 - $boxes = [];
337 - foreach ($posts as $key => $post) {
338 - $box = new Box($post);
277 + public function print_boxes_content() {
278 + $boxes = $this->get_matched_boxes();
279 + if ( empty( $boxes ) ) {
280 + return;
281 + }
339 282
340 - // skip boxes without any content
341 - if ($box->get_content() === '') {
342 - continue;
343 - }
283 + echo '<div style="display: none;">';
284 + foreach ( $boxes as $box ) {
285 + echo sprintf( '<div id="boxzilla-box-%d-content">', $box->ID ) . $box->get_content() . '</div>';
286 + }
287 + echo '</div>';
288 + }
344 289
345 - $boxes[ $key ] = $box;
346 - }
347 - }
290 + /**
291 + * Get an array of Box objects. These are the boxes that will be loaded for the current request.
292 + *
293 + * @return Box[]
294 + */
295 + public function get_matched_boxes() {
296 + static $boxes;
348 297
349 - return $boxes;
350 - }
298 + if ( is_null( $boxes ) ) {
299 + if ( count( $this->box_ids_to_load ) === 0 ) {
300 + $boxes = array();
301 + return $boxes;
302 + }
303 +
304 + // query Box posts
305 + $q = new \WP_Query();
306 + $posts = $q->query(
307 + array(
308 + 'post_type' => 'boxzilla-box',
309 + 'post_status' => 'publish',
310 + 'post__in' => $this->box_ids_to_load,
311 + 'posts_per_page' => count( $this->box_ids_to_load ),
312 + 'ignore_sticky_posts' => true,
313 + 'no_found_rows' => true,
314 + )
315 + );
316 +
317 + // create `Box` instances out of \WP_Post instances
318 + $boxes = array();
319 + foreach ( $posts as $key => $post ) {
320 + $box = new Box( $post );
321 +
322 + // skip boxes without any content
323 + if ( $box->get_content() === '' ) {
324 + continue;
325 + }
326 +
327 + $boxes[ $key ] = $box;
328 + }
329 + }
330 +
331 + return $boxes;
332 + }
351 333 }