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 +274 -295 3.4.103.2.21 View file →
@@ -1,354 +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($_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 = $_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 - 'in_footer' => true,
276 - ]);
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 );
277 236
278 - // create boxzilla_Global_Options object
279 - $plugin_options = $this->options;
280 - $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 + }
281 242
282 - $data = [
283 - 'testMode' => (bool) $plugin_options['test_mode'],
284 - 'boxes' => (array) array_map(
285 - function (Box $box) {
286 - return $box->get_client_options();
287 - },
288 - $boxes
289 - ),
290 - ];
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 + }
291 250
292 - wp_localize_script('boxzilla', 'boxzilla_options', $data);
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 );
293 257
294 - do_action('boxzilla_load_assets', $this);
295 - }
258 + // create boxzilla_Global_Options object
259 + $plugin_options = $this->options;
260 + $boxes = $this->get_matched_boxes();
296 261
297 - public function print_boxes_content()
298 - {
299 - $boxes = $this->get_matched_boxes();
300 - if (empty($boxes)) {
301 - return;
302 - }
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 + );
303 271
304 - echo '<div style="display: none;">';
305 - foreach ($boxes as $box) {
306 - printf('<div id="boxzilla-box-%d-content">%s</div>', absint($box->ID), $box->get_content());
307 - }
308 - echo '</div>';
309 - }
272 + wp_localize_script( 'boxzilla', 'boxzilla_options', $data );
310 273
311 - /**
312 - * Get an array of Box objects. These are the boxes that will be loaded for the current request.
313 - *
314 - * @return Box[]
315 - */
316 - public function get_matched_boxes()
317 - {
318 - static $boxes;
274 + do_action( 'boxzilla_load_assets', $this );
275 + }
319 276
320 - if (is_null($boxes)) {
321 - if (count($this->box_ids_to_load) === 0) {
322 - return [];
323 - }
277 + public function print_boxes_content() {
278 + $boxes = $this->get_matched_boxes();
279 + if ( empty( $boxes ) ) {
280 + return;
281 + }
324 282
325 - // query Box posts
326 - $q = new \WP_Query();
327 - $posts = $q->query(
328 - [
329 - 'post_type' => 'boxzilla-box',
330 - 'post_status' => 'publish',
331 - 'post__in' => $this->box_ids_to_load,
332 - 'posts_per_page' => count($this->box_ids_to_load),
333 - 'ignore_sticky_posts' => true,
334 - 'no_found_rows' => true,
335 - ]
336 - );
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 + }
337 289
338 - // create `Box` instances out of \WP_Post instances
339 - $boxes = [];
340 - foreach ($posts as $key => $post) {
341 - $box = new Box($post);
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;
342 297
343 - // skip boxes without any content
344 - if ($box->get_content() === '') {
345 - continue;
346 - }
298 + if ( is_null( $boxes ) ) {
299 + if ( count( $this->box_ids_to_load ) === 0 ) {
300 + $boxes = array();
301 + return $boxes;
302 + }
347 303
348 - $boxes[ $key ] = $box;
349 - }
350 - }
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 + );
351 316
352 - return $boxes;
353 - }
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 + }
354 333 }