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