PluginProbe
Boxzilla – WordPress Popup Builder / 3.1.8
Boxzilla – WordPress Popup Builder v3.1.8
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
boxzilla / src / class-loader.php

class-loader.php in Boxzilla – WordPress Popup Builder 3.1.8, at src/class-loader.php

300 lines 6.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Boxzilla;
4
5 class BoxLoader {
6
7 /**
8 * @var Plugin
9 */
10 private $plugin;
11
12 /**
13 * @var array
14 */
15 private $box_ids_to_load = array();
16
17 /**
18 * @var array
19 */
20 protected $options;
21
22 /**
23 * Constructor
24 *
25 * @param Plugin $plugin
26 * @param array $options
27 */
28 public function __construct( Plugin $plugin, array $options ) {
29 $this->plugin = $plugin;
30 $this->options = $options;
31 }
32
33 /**
34 * Initializes the plugin, runs on `wp` hook.
35 */
36 public function init() {
37
38 $this->box_ids_to_load = $this->filter_boxes();
39
40 // Only add other hooks if necessary
41 if( count( $this->box_ids_to_load ) > 0 ) {
42 add_action( 'wp_enqueue_scripts', array( $this, 'load_assets' ), 90 );
43 }
44 }
45
46 /**
47 * Get global rules for all boxes
48 *
49 * @return array
50 */
51 protected function get_filter_rules() {
52 $rules = get_option( 'boxzilla_rules', array() );
53
54 if( ! is_array( $rules ) ) {
55 return array();
56 }
57
58 return $rules;
59 }
60
61
62 /**
63 * Match a string against an array of patterns, glob-style.
64 *
65 * @param string $string
66 * @param array $patterns
67 *
68 * @return boolean
69 */
70 protected function match_patterns( $string, $patterns ) {
71 $string = strtolower( $string );
72
73 foreach( $patterns as $pattern ) {
74
75 $pattern = strtolower( $pattern );
76
77 if( function_exists( 'fnmatch' ) ) {
78 $match = fnmatch( $pattern, $string );
79 } else {
80 $match = ( $pattern === $string );
81 }
82
83 if( $match ) {
84 return true;
85 }
86 }
87
88 return false;
89 }
90
91 /**
92 * Check if this rule passes (conditional matches expected value)
93 *
94 * @param string $condition
95 * @param string $value
96 * @param boolean $qualifier
97 *
98 * @return bool
99 */
100 protected function match_rule( $condition, $value, $qualifier = true ) {
101
102 $matched = false;
103
104 // cast value to array & trim whitespace or excess comma's
105 $value = array_map( 'trim', explode( ',', rtrim( trim( $value ), ',' ) ) );
106
107 switch ( $condition ) {
108 case 'everywhere';
109 $matched = true;
110 break;
111
112 case 'is_url':
113 $matched = $this->match_patterns( $_SERVER['REQUEST_URI'], $value );
114 break;
115
116 case 'is_referer':
117 if( ! empty( $_SERVER['HTTP_REFERER'] ) ) {
118 $referer = $_SERVER['HTTP_REFERER'];
119 $matched = $this->match_patterns( $referer, $value );
120 }
121 break;
122
123 case 'is_post_type':
124 $post_type = (string) get_post_type();
125 $matched = in_array( $post_type, (array) $value );
126 break;
127
128 case 'is_single':
129 case 'is_post':
130 // convert to empty string if array with just empty string in it
131 $value = ( $value === array( '' ) ) ? '' : $value;
132 $matched = is_single( $value );
133 break;
134
135 case 'is_post_in_category':
136 $matched = is_singular( 'post' ) && has_category( $value );
137 break;
138
139
140 case 'is_page':
141 $matched = is_page( $value );
142 break;
143
144 case 'is_post_with_tag':
145 $matched = is_singular( 'post' ) && has_tag( $value );
146 break;
147 }
148
149 /**
150 * Filters whether a given box rule matches the condition and expected value.
151 *
152 * The dynamic portion of the hook, `$condition`, refers to the condition being matched.
153 *
154 * @param boolean $matched
155 * @param array $value
156 */
157 $matched = apply_filters( 'boxzilla_box_rule_matches_' . $condition, $matched, $value );
158
159 // if qualifier is set to false, we need to reverse this value here.
160 if( ! $qualifier ) {
161 $matched = ! $matched;
162 }
163
164 return $matched;
165 }
166
167 /**
168 * Checks which boxes should be loaded for this request.
169 *
170 * @return array
171 */
172 private function filter_boxes() {
173
174 $box_ids_to_load = array();
175 $rules = $this->get_filter_rules();
176
177 foreach( $rules as $box_id => $box_rules ) {
178
179 $matched = false;
180 $comparision = isset( $box_rules['comparision'] ) ? $box_rules['comparision'] : 'any';
181
182 // loop through all rules for all boxes
183 foreach ( $box_rules as $rule ) {
184
185 // skip faulty values (and comparision rule)
186 if( empty( $rule['condition'] ) ) {
187 continue;
188 }
189
190 $qualifier = isset( $rule['qualifier'] ) ? $rule['qualifier'] : true;
191 $matched = $this->match_rule( $rule['condition'], $rule['value'], $qualifier );
192
193 // break out of loop if we've already matched
194 if( $comparision === 'any' && $matched ) {
195 break;
196 }
197
198 // no need to continue if this rule didn't match
199 if( $comparision === 'all' && ! $matched ) {
200 break;
201 }
202 }
203
204 // value of $matched at this point determines whether box should be loaded
205 $load_box = $matched;
206
207 /**
208 * Filters whether a box should be loaded into the page HTML.
209 *
210 * The dynamic portion of the hook, `$box_id`, refers to the ID of the box. Return true if you want to output the box.
211 *
212 * @param boolean $load_box
213 */
214 $load_box = apply_filters( 'boxzilla_load_box_' . $box_id, $load_box );
215
216 /**
217 * Filters whether a box should be loaded into the page HTML.
218 *
219 * @param boolean $load_box
220 * @param int $box_id
221 */
222 $load_box = apply_filters( 'boxzilla_load_box', $load_box, $box_id );
223
224 // if matched, box should be loaded on this page
225 if ( $load_box ) {
226 $box_ids_to_load[] = $box_id;
227 }
228
229 }
230
231 return $box_ids_to_load;
232 }
233
234 /**
235 * Load plugin styles
236 */
237 public function load_assets() {
238 $pre_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
239 wp_enqueue_script('boxzilla', $this->plugin->url('/assets/js/script' . $pre_suffix . '.js' ), array(), $this->plugin->version(), true );
240
241 $this->pass_box_options();
242
243 do_action( 'boxzilla_load_assets', $this );
244 }
245
246 /**
247 * Get an array of Box objects. These are the boxes that will be loaded for the current request.
248 *
249 * @return Box[]
250 */
251 public function get_matched_boxes() {
252 static $boxes;
253
254 if( is_null( $boxes ) ) {
255
256 if( count( $this->box_ids_to_load ) === 0 ) {
257 $boxes = array();
258 return $boxes;
259 }
260
261 // query Box posts
262 $boxes = get_posts(
263 array(
264 'post_type' => 'boxzilla-box',
265 'post_status' => 'publish',
266 'post__in' => $this->box_ids_to_load,
267 'numberposts' => -1
268 )
269 );
270
271 // create `Box` instances out of \WP_Post instances
272 foreach ( $boxes as $key => $box ) {
273 $boxes[ $key ] = new Box( $box );
274 }
275 }
276
277 return $boxes;
278 }
279
280 /**
281 * Create array of Box options and pass it to JavaScript script.
282 */
283 public function pass_box_options() {
284
285 // create boxzilla_Global_Options object
286 $plugin_options = $this->options;
287 $boxes = $this->get_matched_boxes();
288
289 $data = array(
290 'testMode' => (bool) $plugin_options['test_mode'],
291 'boxes' => array_map( function(Box $box) { return $box->get_client_options(); }, $boxes ),
292 );
293
294 wp_localize_script( 'boxzilla', 'boxzilla_options', $data );
295 }
296
297 }
298
299
300