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