PluginProbe
Boxzilla – WordPress Popup Builder / 3.4.2
Boxzilla – WordPress Popup Builder v3.4.2
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-box.php

class-box.php in Boxzilla – WordPress Popup Builder 3.4.2, at src/class-box.php

269 lines 7.1 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 use WP_Post;
6
7 class Box
8 {
9 /**
10 * @var int
11 */
12 public $ID;
13
14 /**
15 * @var array
16 */
17 public $options = [];
18
19 /**
20 * @var string
21 */
22 public $title = '';
23
24 /**
25 * @var string
26 */
27 protected $content = '';
28
29 /**
30 * @var bool
31 */
32 public $enabled = false;
33
34 /**
35 * @var WP_Post
36 */
37 private $post;
38
39 /**
40 * @param WP_Post|int $post
41 */
42 public function __construct($post)
43 {
44
45 // fetch post if it hasn't been fetched yet
46 if (! $post instanceof WP_Post) {
47 $post = get_post($post);
48 }
49
50 // store ref to post
51 $this->post = $post;
52
53 // store ID in property for quick access
54 $this->ID = $post->ID;
55
56 // store title in property
57 $this->title = $post->post_title;
58
59 // store content in property
60 $this->content = $post->post_content;
61
62 // is this box enabled?
63 $this->enabled = $post->post_status === 'publish';
64
65 // load and store options in property
66 $this->options = $this->load_options();
67 }
68
69 /**
70 * Get the options for this box.
71 **
72 * @return array Array of box options
73 */
74 protected function load_options()
75 {
76 $defaults = [
77 'css' => [
78 'background_color' => '',
79 'color' => '',
80 'width' => '',
81 'border_color' => '',
82 'border_width' => '',
83 'border_style' => '',
84 'position' => 'bottom-right',
85 ],
86 'rules' => [
87 0 => [
88 'condition' => '',
89 'value' => '',
90 ],
91 ],
92 'rules_comparision' => 'any',
93 'cookie' => [
94 'triggered' => 0,
95 'dismissed' => 0,
96 ],
97 'trigger' => 'percentage',
98 'trigger_percentage' => 65,
99 'trigger_element' => '',
100 'trigger_time_on_site' => 0,
101 'trigger_time_on_page' => 0,
102 'animation' => 'fade',
103 'auto_hide' => 0,
104 'screen_size_condition' => [
105 'condition' => 'larger',
106 'value' => 0,
107 ],
108 'closable' => 1,
109 'show_close_icon' => 1,
110 ];
111 $box = $this;
112
113 $options = get_post_meta($this->ID, 'boxzilla_options', true);
114 $options = is_array($options) ? $options : [];
115
116 // merge options with default options
117 $options = array_replace_recursive($defaults, $options);
118
119 // allow others to filter the final array of options
120 /**
121 * Filter the options for a given box
122 *
123 * @param array $options
124 * @param Box $box
125 */
126 $options = apply_filters('boxzilla_box_options', $options, $box);
127
128 return $options;
129 }
130
131 /**
132 * @return bool
133 */
134 public function is_enabled()
135 {
136 return $this->enabled;
137 }
138
139 /**
140 * Get the options for this box
141 *
142 * @return array
143 */
144 public function get_options()
145 {
146 return $this->options;
147 }
148
149 /**
150 * Get the close / hide icon for this box
151 *
152 * @return string
153 */
154 public function get_close_icon()
155 {
156 if (! $this->options['show_close_icon']) {
157 return '';
158 }
159
160 $box = $this;
161 $html = '&times;';
162
163 /**
164 * Filters the HTML for the close icon.
165 *
166 * @param string $html
167 * @param Box $box
168 */
169 $close_icon = (string) apply_filters('boxzilla_box_close_icon', $html, $box);
170
171 return $close_icon;
172 }
173
174 /**
175 * Get the content of this box
176 *
177 * @return string
178 */
179 public function get_content()
180 {
181 $content = $this->content;
182 $box = $this;
183
184 // replace boxzilla specific shortcodes
185 $close_link = "<a href=\"javascript:Boxzilla.dismiss({$this->ID});\">";
186
187 $replacements = [
188 '[boxzilla_close]' => $close_link, // accept underscore and dash here for consistency with other shortcode
189 '[boxzilla-close]' => $close_link,
190 '[/boxzilla_close]' => '</a>',
191 '[/boxzilla-close]' => '</a>',
192 ];
193
194 $content = str_replace(array_keys($replacements), array_values($replacements), $content);
195
196 /**
197 * Filters the HTML for the box content
198 *
199 * @param string $content
200 * @param Box $box
201 */
202 $content = apply_filters('boxzilla_box_content', $content, $box);
203 return $content;
204 }
205
206 /**
207 * Get options object for JS script.
208 *
209 * @return array
210 */
211 public function get_client_options()
212 {
213 $box = $this;
214
215 $trigger = false;
216 if ($box->options['trigger']) {
217 $trigger = [
218 'method' => $this->options['trigger'],
219 ];
220
221 if (isset($this->options[ 'trigger_' . $this->options['trigger'] ])) {
222 $trigger['value'] = $this->options[ 'trigger_' . $this->options['trigger'] ];
223 }
224 }
225
226 // build screenWidthCondition object (or null)
227 $screen_width_condition = null;
228 if ($box->options['screen_size_condition']['value'] > 0) {
229 $screen_width_condition = [
230 'condition' => $box->options['screen_size_condition']['condition'],
231 'value' => intval($box->options['screen_size_condition']['value']),
232 ];
233 }
234
235 $post = $this->post;
236 $client_options = [
237 'id' => $box->ID,
238 'icon' => $box->get_close_icon(),
239 'content' => '', // we grab this later from an HTML element
240 'css' => array_filter($box->options['css']),
241 'trigger' => $trigger,
242 'animation' => $box->options['animation'],
243 'cookie' => [
244 'triggered' => absint($box->options['cookie']['triggered']),
245 'dismissed' => absint($box->options['cookie']['dismissed']),
246 ],
247 'rehide' => (bool) $box->options['auto_hide'],
248 'position' => $box->options['css']['position'],
249 'screenWidthCondition' => $screen_width_condition,
250 'closable' => ! ! $box->options['closable'],
251 'post' => [
252 'id' => $post->ID,
253 'title' => $post->post_title,
254 'slug' => $post->post_name,
255 ],
256 ];
257
258 /**
259 * Filter the final options for the JS Boxzilla client.
260 *
261 * @param array $client_options
262 * @param Box $box
263 */
264 $client_options = apply_filters('boxzilla_box_client_options', $client_options, $box);
265
266 return $client_options;
267 }
268 }
269