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/admin/class-admin.php +675 -687 3.4.33.2.18 View file →
@@ -7,821 +7,809 @@
7 7 use Boxzilla\Boxzilla;
8 8 use WP_Post;
9 9 use WP_Screen;
10 10
11 -class Admin
12 -{
13 - /**
14 - * @var Plugin $plugin
15 - */
16 - private $plugin;
11 +class Admin {
17 12
18 - /**
19 - * @var Boxzilla
20 - */
21 - protected $boxzilla;
22 13
23 - /**
24 - * @var ReviewNotice
25 - */
26 - protected $review_notice;
14 + /**
15 + * @var Plugin $plugin
16 + */
17 + private $plugin;
27 18
28 - /**
29 - * @param Plugin $plugin
30 - * @param Boxzilla $boxzilla
31 - */
32 - public function __construct(Plugin $plugin, Boxzilla $boxzilla)
33 - {
34 - $this->plugin = $plugin;
35 - $this->boxzilla = $boxzilla;
36 - $this->review_notice = new ReviewNotice();
37 - }
19 + /**
20 + * @var Boxzilla
21 + */
22 + protected $boxzilla;
38 23
39 - /**
40 - * Initialise the all admin related stuff
41 - */
42 - public function init()
43 - {
44 - $this->add_hooks();
45 - $this->run_migrations();
46 - $this->review_notice->init();
47 - }
24 + /**
25 + * @var ReviewNotice
26 + */
27 + protected $review_notice;
48 28
49 - /**
50 - * Add necessary hooks
51 - */
52 - protected function add_hooks()
53 - {
54 - add_action('admin_init', [ $this, 'lazy_add_hooks' ]);
55 - add_action('admin_init', [ $this, 'register' ]);
56 - add_action('init', [ $this, 'listen_for_actions' ]);
57 - add_action('admin_menu', [ $this, 'menu' ]);
58 - add_action('admin_notices', [ $this, 'notices' ]);
59 - add_action('save_post_boxzilla-box', [ $this, 'save_box_options' ], 20, 2);
60 - add_action('trashed_post', [ $this, 'flush_rules' ]);
61 - add_action('untrashed_post', [ $this, 'flush_rules' ]);
62 - add_filter('bulk_actions-edit-boxzilla-box', [ $this, 'bulk_action_add' ]);
63 - add_filter('handle_bulk_actions-edit-boxzilla-box', [ $this, 'bulk_action_handle' ], 10, 3);
64 - }
29 + /**
30 + * @param Plugin $plugin
31 + * @param Boxzilla $boxzilla
32 + */
33 + public function __construct( Plugin $plugin, Boxzilla $boxzilla ) {
34 + $this->plugin = $plugin;
35 + $this->boxzilla = $boxzilla;
36 + $this->review_notice = new ReviewNotice();
37 + }
65 38
66 - /**
67 - * Listen for admin actions.
68 - */
69 - public function listen_for_actions()
70 - {
71 - // triggered?
72 - $vars = array_merge($_POST, $_GET);
73 - if (empty($vars['_boxzilla_admin_action'])) {
74 - return false;
75 - }
39 + /**
40 + * Initialise the all admin related stuff
41 + */
42 + public function init() {
43 + $this->add_hooks();
44 + $this->run_migrations();
45 + $this->review_notice->init();
46 + }
76 47
77 - // authorized?
78 - if (! current_user_can('edit_posts')) {
79 - return false;
80 - }
48 + /**
49 + * Add necessary hooks
50 + */
51 + protected function add_hooks() {
52 + add_action( 'admin_init', array( $this, 'lazy_add_hooks' ) );
53 + add_action( 'admin_init', array( $this, 'register' ) );
54 + add_action( 'init', array( $this, 'listen_for_actions' ) );
55 + add_action( 'admin_menu', array( $this, 'menu' ) );
56 + add_action( 'admin_notices', array( $this, 'notices' ) );
57 + add_action( 'save_post_boxzilla-box', array( $this, 'save_box_options' ), 20, 2 );
58 + add_action( 'trashed_post', array( $this, 'flush_rules' ) );
59 + add_action( 'untrashed_post', array( $this, 'flush_rules' ) );
60 + add_filter( 'bulk_actions-edit-boxzilla-box', array( $this, 'bulk_action_add' ) );
61 + add_filter( 'handle_bulk_actions-edit-boxzilla-box', array( $this, 'bulk_action_handle' ), 10, 3 );
81 62
82 - // fire action
83 - $action = $vars['_boxzilla_admin_action'];
84 - do_action('boxzilla_admin_' . $action);
63 + }
85 64
86 - return true;
87 - }
65 + /**
66 + * Listen for admin actions.
67 + */
68 + public function listen_for_actions() {
69 + // triggered?
70 + $vars = array_merge( $_POST, $_GET );
71 + if ( empty( $vars['_boxzilla_admin_action'] ) ) {
72 + return false;
73 + }
88 74
89 - public function bulk_action_add($bulk_actions)
90 - {
91 - $bulk_actions['boxzilla_duplicate_box'] = esc_attr__('Duplicate box', 'boxzilla');
92 - return $bulk_actions;
93 - }
75 + // authorized?
76 + if ( ! current_user_can( 'edit_posts' ) ) {
77 + return false;
78 + }
94 79
95 - public function bulk_action_handle($redirect_to, $doaction, $post_ids)
96 - {
97 - if ($doaction !== 'boxzilla_duplicate_box' || empty($post_ids)) {
98 - return $redirect_to;
99 - }
80 + // fire action
81 + $action = $vars['_boxzilla_admin_action'];
82 + do_action( 'boxzilla_admin_' . $action );
100 83
101 - foreach ($post_ids as $post_id) {
102 - $post = get_post($post_id);
103 - if ($post->post_type !== 'boxzilla-box') {
104 - continue;
105 - }
84 + return true;
85 + }
106 86
107 - $new_post_id = wp_insert_post(
108 - [
109 - 'post_type' => $post->post_type,
110 - 'post_title' => $post->post_title,
111 - 'post_content' => $post->post_content,
112 - 'post_status' => 'draft',
113 - ]
114 - );
87 + public function bulk_action_add( $bulk_actions ) {
88 + $bulk_actions['boxzilla_duplicate_box'] = __( 'Duplicate box', 'boxzilla' );
89 + return $bulk_actions;
90 + }
115 91
116 - $options = get_post_meta($post_id, 'boxzilla_options', true);
117 - add_post_meta($new_post_id, 'boxzilla_options', $options);
92 + public function bulk_action_handle( $redirect_to, $doaction, $post_ids ) {
93 + if ( $doaction !== 'boxzilla_duplicate_box' || empty( $post_ids ) ) {
94 + return $redirect_to;
95 + }
118 96
119 - $this->flush_rules($new_post_id);
120 - }
97 + foreach ( $post_ids as $post_id ) {
98 + $post = get_post( $post_id );
99 + if ( $post->post_type !== 'boxzilla-box' ) {
100 + continue;
101 + }
121 102
122 - return $redirect_to;
123 - }
103 + $new_post_id = wp_insert_post(
104 + array(
105 + 'post_type' => $post->post_type,
106 + 'post_title' => $post->post_title,
107 + 'post_content' => $post->post_content,
108 + 'post_status' => 'draft',
109 + )
110 + );
124 111
125 - /**
126 - * All logic for admin notices lives here.
127 - */
128 - public function notices()
129 - {
130 - global $pagenow,
131 - $current_screen;
112 + $options = get_post_meta( $post_id, 'boxzilla_options', true );
113 + add_post_meta( $new_post_id, 'boxzilla_options', $options );
132 114
133 - if (( $pagenow === 'plugins.php' || ( $current_screen && $current_screen->post_type === 'boxzilla-box' ) )
134 - && current_user_can('install_plugins')
135 - && is_plugin_active('scroll-triggered-boxes/index.php')
136 - ) {
137 - ?>
138 - <div class="notice notice-info">
139 - <p><?php esc_html_e('Awesome, you are using Boxzilla! You can now safely deactivate the Scroll Triggered Boxes plugin.', 'boxzilla'); ?></p>
140 - </div>
141 - <?php
142 - }
143 - }
115 + $this->flush_rules( $new_post_id );
116 + }
144 117
145 - /**
146 - * Checks current version against stored version & runs necessary update routines.
147 - *
148 - * @return bool
149 - */
150 - protected function run_migrations()
151 - {
118 + return $redirect_to;
119 + }
152 120
153 - // Only run if db option is at older version than code constant
154 - $previous_version = get_option('boxzilla_version', '0');
155 - $current_version = $this->plugin->version();
121 + /**
122 + * All logic for admin notices lives here.
123 + */
124 + public function notices() {
125 + global $pagenow,
126 + $current_screen;
156 127
157 - if (version_compare($current_version, $previous_version, '<=')) {
158 - return false;
159 - }
128 + if ( ( $pagenow === 'plugins.php' || ( $current_screen && $current_screen->post_type === 'boxzilla-box' ) )
129 + && current_user_can( 'install_plugins' )
130 + && is_plugin_active( 'scroll-triggered-boxes/index.php' ) ) {
131 + $url = wp_nonce_url( 'plugins.php?action=deactivate&plugin=scroll-triggered-boxes/index.php', 'deactivate-plugin_' . 'scroll-triggered-boxes/index.php' ); ?>
132 + <div class="notice notice-info">
133 + <p><?php printf( __( 'Awesome, you are using Boxzilla! You can now safely <a href="%s">deactivate the Scroll Triggered Boxes plugin</a>.', 'boxzilla' ), $url ); ?></p>
134 + </div>
135 + <?php
136 + }
137 + }
160 138
161 - $upgrade_routines = new Migrations($previous_version, $current_version, __DIR__ . '/migrations');
162 - $upgrade_routines->run();
163 - update_option('boxzilla_version', $current_version);
164 - }
139 + /**
140 + * Checks current version against stored version & runs necessary update routines.
141 + *
142 + * @return bool
143 + */
144 + protected function run_migrations() {
165 145
166 - public function lazy_add_hooks()
167 - {
168 - global $pagenow;
146 + // Only run if db option is at older version than code constant
147 + $previous_version = get_option( 'boxzilla_version', '0' );
148 + $current_version = $this->plugin->version();
169 149
170 - add_action('admin_enqueue_scripts', [ $this, 'load_assets' ]);
171 - add_action('add_meta_boxes', [ $this, 'add_meta_boxes' ]);
172 - add_filter('tiny_mce_before_init', [ $this, 'tinymce_init' ]);
173 - add_filter('manage_edit-boxzilla-box_columns', [ $this, 'post_type_column_titles' ]);
174 - add_action('manage_boxzilla-box_posts_custom_column', [ $this, 'post_type_column_content' ], 10, 2);
175 - add_filter('admin_footer_text', [ $this, 'admin_footer_text' ]);
150 + if ( version_compare( $current_version, $previous_version, '<=' ) ) {
151 + return false;
152 + }
176 153
177 - if ($pagenow === 'plugins.php') {
178 - add_filter('plugin_action_links', [ $this, 'add_plugin_settings_link' ], 10, 2);
179 - add_filter('plugin_row_meta', [ $this, 'add_plugin_meta_links' ], 10, 2);
180 - }
181 - }
154 + $upgrade_routines = new Migrations( $previous_version, $current_version, __DIR__ . '/migrations' );
155 + $upgrade_routines->run();
156 + update_option( 'boxzilla_version', $current_version );
157 + }
182 158
183 - /**
184 - * @param $post_id
185 - */
186 - public function post_type_column_box_id_content($post_id)
187 - {
188 - echo $post_id;
189 - }
159 + public function lazy_add_hooks() {
160 + global $pagenow;
190 161
191 - /**
192 - * @param $column
193 - * @param $post_id
194 - */
195 - public function post_type_column_content($column, $post_id)
196 - {
197 - $method_name = 'post_type_column_' . $column . '_content';
198 - if (method_exists($this, $method_name)) {
199 - call_user_func([ $this, $method_name ], $post_id);
200 - }
201 - }
162 + add_action( 'admin_enqueue_scripts', array( $this, 'load_assets' ) );
163 + add_action( 'add_meta_boxes', array( $this, 'add_meta_boxes' ) );
164 + add_filter( 'tiny_mce_before_init', array( $this, 'tinymce_init' ) );
165 + add_filter( 'manage_edit-boxzilla-box_columns', array( $this, 'post_type_column_titles' ) );
166 + add_action( 'manage_boxzilla-box_posts_custom_column', array( $this, 'post_type_column_content' ), 10, 2 );
167 + add_filter( 'admin_footer_text', array( $this, 'admin_footer_text' ) );
202 168
203 - /**
204 - * @param $columns
205 - *
206 - * @return mixed
207 - */
208 - public function post_type_column_titles($columns)
209 - {
210 - $columns = self::array_insert(
211 - $columns,
212 - [
213 - 'box_id' => esc_html__('Box ID', 'boxzilla'),
214 - ],
215 - 1
216 - );
169 + if ( $pagenow === 'plugins.php' ) {
170 + add_filter( 'plugin_action_links', array( $this, 'add_plugin_settings_link' ), 10, 2 );
171 + add_filter( 'plugin_row_meta', array( $this, 'add_plugin_meta_links' ), 10, 2 );
172 + }
173 + }
217 174
218 - $columns['title'] = esc_html__('Box Title', 'boxzilla');
175 + /**
176 + * @param $post_id
177 + */
178 + public function post_type_column_box_id_content( $post_id ) {
179 + echo $post_id;
180 + }
219 181
220 - return $columns;
221 - }
182 + /**
183 + * @param $column
184 + * @param $post_id
185 + */
186 + public function post_type_column_content( $column, $post_id ) {
187 + $method_name = 'post_type_column_' . $column . '_content';
188 + if ( method_exists( $this, $method_name ) ) {
189 + call_user_func( array( $this, $method_name ), $post_id );
190 + }
191 + }
222 192
223 - /**
224 - * Register stuffs
225 - */
226 - public function register()
227 - {
193 + /**
194 + * @param $columns
195 + *
196 + * @return mixed
197 + */
198 + public function post_type_column_titles( $columns ) {
199 + $columns = self::array_insert(
200 + $columns,
201 + array(
202 + 'box_id' => __( 'Box ID', 'boxzilla' ),
203 + ),
204 + 1
205 + );
228 206
229 - register_setting('boxzilla_settings', 'boxzilla_settings', [ $this, 'sanitize_settings' ]);
207 + $columns['title'] = __( 'Box Title', 'boxzilla' );
230 208
231 - wp_register_script(
232 - 'boxzilla-admin',
233 - $this->plugin->url('/assets/js/admin-script.js'),
234 - [
235 - 'jquery',
236 - 'wp-util',
237 - 'wp-color-picker',
238 - 'suggest',
239 - ],
240 - $this->plugin->version(),
241 - true
242 - );
209 + return $columns;
210 + }
243 211
244 - wp_register_style('boxzilla-admin', $this->plugin->url('/assets/css/admin-styles.css'), [], $this->plugin->version());
245 - }
212 + /**
213 + * Register stuffs
214 + */
215 + public function register() {
246 216
247 - /**
248 - * Renders the Boxzilla admin menu items
249 - */
250 - public function menu()
251 - {
252 - $menu_items = [
253 - [
254 - esc_html__('Settings', 'boxzilla'),
255 - esc_html__('Settings', 'boxzilla'),
256 - 'boxzilla-settings',
257 - [ $this, 'show_settings_page' ],
258 - ],
259 - [
260 - esc_html__('Extensions', 'boxzilla'),
261 - '<span style="color: orange">' . esc_html__('Extensions', 'boxzilla') . '</span>',
262 - 'boxzilla-extensions',
263 - [ $this, 'show_extensions_page' ],
264 - ],
265 - ];
217 + // register settings
218 + register_setting( 'boxzilla_settings', 'boxzilla_settings', array( $this, 'sanitize_settings' ) );
266 219
267 - $menu_items = apply_filters('boxzilla_admin_menu_items', $menu_items);
220 + // register scripts
221 + $pre_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
268 222
269 - foreach ($menu_items as $item) {
270 - add_submenu_page('edit.php?post_type=boxzilla-box', $item[0] . '- Boxzilla', $item[1], 'manage_options', $item[2], $item[3]);
271 - }
272 - }
223 + wp_register_script(
224 + 'boxzilla-admin',
225 + $this->plugin->url( '/assets/js/admin-script' . $pre_suffix . '.js' ),
226 + array(
227 + 'jquery',
228 + 'wp-util',
229 + 'wp-color-picker',
230 + 'suggest',
231 + ),
232 + $this->plugin->version(),
233 + true
234 + );
273 235
274 - /**
275 - * Shows the settings page
276 - */
277 - public function show_settings_page()
278 - {
279 - $opts = $this->boxzilla->options;
280 - require __DIR__ . '/views/settings.php';
281 - }
236 + // load stylesheets
237 + wp_register_style( 'boxzilla-admin', $this->plugin->url( '/assets/css/admin-styles' . $pre_suffix . '.css' ), array(), $this->plugin->version() );
238 + }
282 239
283 - /**
284 - * Shows the extensions page
285 - */
286 - public function show_extensions_page()
287 - {
288 - $extensions = $this->fetch_extensions();
289 - require __DIR__ . '/views/extensions.php';
290 - }
240 + /**
241 + * Renders the STB Menu items
242 + */
243 + public function menu() {
244 + $menu_items = array(
245 + array(
246 + __( 'Settings', 'boxzilla' ),
247 + __( 'Settings', 'boxzilla' ),
248 + 'boxzilla-settings',
249 + array( $this, 'show_settings_page' ),
250 + ),
251 + array(
252 + __( 'Extensions', 'boxzilla' ),
253 + '<span style="color: orange">' . __( 'Extensions', 'boxzilla' ) . '</span>',
254 + 'boxzilla-extensions',
255 + array( $this, 'show_extensions_page' ),
256 + ),
257 + );
291 258
292 - /**
293 - * Are we currently editing a box?
294 - *
295 - * @return bool
296 - */
297 - protected function on_edit_box_page()
298 - {
299 - global $pagenow;
259 + $menu_items = apply_filters( 'boxzilla_admin_menu_items', $menu_items );
300 260
301 - if (! in_array($pagenow, [ 'post-new.php', 'post.php' ], true)) {
302 - return false;
303 - }
261 + foreach ( $menu_items as $item ) {
262 + add_submenu_page( 'edit.php?post_type=boxzilla-box', $item[0] . '- Boxzilla', $item[1], 'manage_options', $item[2], $item[3] );
263 + }
264 + }
304 265
305 - if (isset($_GET['post_type']) && $_GET['post_type'] === 'boxzilla-box') {
306 - return true;
307 - }
266 + /**
267 + * Shows the settings page
268 + */
269 + public function show_settings_page() {
270 + $opts = $this->boxzilla->options;
271 + require __DIR__ . '/views/settings.php';
272 + }
308 273
309 - if (get_post_type() === 'boxzilla-box') {
310 - return true;
311 - }
274 + /**
275 + * Shows the extensions page
276 + */
277 + public function show_extensions_page() {
278 + $extensions = $this->fetch_extensions();
279 + require __DIR__ . '/views/extensions.php';
280 + }
312 281
313 - return false;
314 - }
282 + /**
283 + * Are we currently editing a box?
284 + *
285 + * @return bool
286 + */
287 + protected function on_edit_box_page() {
288 + global $pagenow;
315 289
316 - /**
317 - * @param $args
318 - *
319 - * @return mixed
320 - */
321 - public function tinymce_init($args)
322 - {
290 + if ( ! in_array( $pagenow, array( 'post-new.php', 'post.php' ), true ) ) {
291 + return false;
292 + }
323 293
324 - // only act on our post type
325 - if (get_post_type() !== 'boxzilla-box') {
326 - return $args;
327 - }
294 + if ( isset( $_GET['post_type'] ) && $_GET['post_type'] === 'boxzilla-box' ) {
295 + return true;
296 + }
328 297
329 - $args['setup'] = 'function( editor ) { if(typeof(window.Boxzilla_Admin) === \'undefined\') { return; } editor.on("PreInit", window.Boxzilla_Admin.Designer.init ); }';
298 + if ( get_post_type() === 'boxzilla-box' ) {
299 + return true;
300 + }
330 301
331 - return $args;
332 - }
302 + return false;
303 + }
333 304
334 - /**
335 - * Load plugin assets
336 - */
337 - public function load_assets()
338 - {
339 - $screen = get_current_screen();
305 + /**
306 + * @param $args
307 + *
308 + * @return mixed
309 + */
310 + public function tinymce_init( $args ) {
340 311
341 - if (! $screen instanceof WP_Screen) {
342 - return false;
343 - }
312 + // only act on our post type
313 + if ( get_post_type() !== 'boxzilla-box' ) {
314 + return $args;
315 + }
344 316
345 - if ($screen->base === 'edit' && $screen->post_type === 'boxzilla-box') {
346 - wp_enqueue_style('boxzilla-admin');
347 - }
317 + $args['setup'] = 'function( editor ) { if(typeof(window.Boxzilla_Admin) === \'undefined\') { return; } editor.on("PreInit", window.Boxzilla_Admin.Designer.init ); }';
348 318
349 - if ($screen->base === 'post' && $screen->post_type === 'boxzilla-box') {
350 - // color picker
351 - wp_enqueue_style('wp-color-picker');
319 + return $args;
320 + }
352 321
353 - // load scripts
354 - wp_enqueue_script('boxzilla-admin');
322 + /**
323 + * Load plugin assets
324 + */
325 + public function load_assets() {
326 + $screen = get_current_screen();
355 327
356 - $data = [
357 - 'and' => esc_html__('and', 'boxzilla'),
358 - 'or' => esc_html__('or', 'boxzilla'),
359 - 'enterCommaSeparatedValues' => esc_html__('Enter a comma-separated list of values.', 'boxzilla'),
360 - 'enterCommaSeparatedPosts' => esc_html__("Enter a comma-separated list of post slugs or post ID's..", 'boxzilla'),
361 - 'enterCommaSeparatedPages' => esc_html__("Enter a comma-separated list of page slugs or page ID's..", 'boxzilla'),
362 - 'enterCommaSeparatedPostTypes' => esc_html__('Enter a comma-separated list of post types..', 'boxzilla'),
363 - 'enterCommaSeparatedRelativeUrls' => esc_html__("Enter a comma-separated list of relative URL's, eg /contact/", 'boxzilla'),
364 - ];
365 - wp_localize_script('boxzilla-admin', 'boxzilla_i18n', $data);
328 + if ( ! $screen instanceof WP_Screen ) {
329 + return false;
330 + }
366 331
367 - // load stylesheets
368 - wp_enqueue_style('boxzilla-admin');
332 + if ( $screen->base === 'edit' && $screen->post_type === 'boxzilla-box' ) {
333 + wp_enqueue_style( 'boxzilla-admin' );
334 + }
369 335
370 - // allow add-ons to easily load their own scripts or stylesheets
371 - do_action('boxzilla_load_admin_assets');
372 - }
336 + if ( $screen->base === 'post' && $screen->post_type === 'boxzilla-box' ) {
337 + // color picker
338 + wp_enqueue_style( 'wp-color-picker' );
373 339
374 - if (isset($_GET['page']) && $_GET['page'] === 'boxzilla-settings') {
375 - wp_enqueue_style('boxzilla-admin');
376 - }
377 - }
340 + // load scripts
341 + wp_enqueue_script( 'boxzilla-admin' );
378 342
379 - /**
380 - * Register meta boxes
381 - *
382 - * @param string $post_type
383 - *
384 - * @return bool
385 - */
386 - public function add_meta_boxes($post_type)
387 - {
388 - if ($post_type !== 'boxzilla-box') {
389 - return false;
390 - }
343 + $data = array(
344 + 'and' => __( 'and', 'boxzilla' ),
345 + 'or' => __( 'or', 'boxzilla' ),
346 + 'enterCommaSeparatedValues' => __( 'Enter a comma-separated list of values.', 'boxzilla' ),
347 + 'enterCommaSeparatedPosts' => __( "Enter a comma-separated list of post slugs or post ID's..", 'boxzilla' ),
348 + 'enterCommaSeparatedPages' => __( "Enter a comma-separated list of page slugs or page ID's..", 'boxzilla' ),
349 + 'enterCommaSeparatedPostTypes' => __( 'Enter a comma-separated list of post types..', 'boxzilla' ),
350 + 'enterCommaSeparatedRelativeUrls' => __( "Enter a comma-separated list of relative URL's, eg /contact/", 'boxzilla' ),
351 + );
352 + wp_localize_script( 'boxzilla-admin', 'boxzilla_i18n', $data );
391 353
392 - add_meta_box(
393 - 'boxzilla-box-appearance-controls',
394 - esc_html__('Box Appearance', 'boxzilla'),
395 - [ $this, 'metabox_box_appearance_controls' ],
396 - 'boxzilla-box',
397 - 'normal',
398 - 'core'
399 - );
354 + // load stylesheets
355 + wp_enqueue_style( 'boxzilla-admin' );
400 356
401 - add_meta_box(
402 - 'boxzilla-box-options-controls',
403 - esc_html__('Box Options', 'boxzilla'),
404 - [ $this, 'metabox_box_option_controls' ],
405 - 'boxzilla-box',
406 - 'normal',
407 - 'core'
408 - );
357 + // allow add-ons to easily load their own scripts or stylesheets
358 + do_action( 'boxzilla_load_admin_assets' );
359 + }
409 360
410 - add_meta_box(
411 - 'boxzilla-support',
412 - esc_html__('Looking for help?', 'boxzilla'),
413 - [ $this, 'metabox_support' ],
414 - 'boxzilla-box',
415 - 'side'
416 - );
361 + if ( isset( $_GET['page'] ) && $_GET['page'] === 'boxzilla-settings' ) {
362 + wp_enqueue_style( 'boxzilla-admin' );
363 + }
364 + }
417 365
418 - add_meta_box(
419 - 'boxzilla-our-other-plugins',
420 - esc_html__('Our other plugins', 'boxzilla'),
421 - [ $this, 'metabox_our_other_plugins' ],
422 - 'boxzilla-box',
423 - 'side'
424 - );
366 + /**
367 + * Register meta boxes
368 + *
369 + * @param string $post_type
370 + *
371 + * @return bool
372 + */
373 + public function add_meta_boxes( $post_type ) {
374 + if ( $post_type !== 'boxzilla-box' ) {
375 + return false;
376 + }
425 377
426 - return true;
427 - }
378 + add_meta_box(
379 + 'boxzilla-box-appearance-controls',
380 + __( 'Box Appearance', 'boxzilla' ),
381 + array( $this, 'metabox_box_appearance_controls' ),
382 + 'boxzilla-box',
383 + 'normal',
384 + 'core'
385 + );
428 386
429 - /**
430 - * @param \WP_Post $post
431 - * @param $metabox
432 - */
433 - public function metabox_box_appearance_controls(\WP_Post $post, $metabox)
434 - {
387 + add_meta_box(
388 + 'boxzilla-box-options-controls',
389 + __( 'Box Options', 'boxzilla' ),
390 + array( $this, 'metabox_box_option_controls' ),
391 + 'boxzilla-box',
392 + 'normal',
393 + 'core'
394 + );
435 395
436 - // get box options
437 - $box = new Box($post);
438 - $opts = $box->get_options();
396 + add_meta_box(
397 + 'boxzilla-support',
398 + __( 'Looking for help?', 'boxzilla' ),
399 + array( $this, 'metabox_support' ),
400 + 'boxzilla-box',
401 + 'side'
402 + );
439 403
440 - // include view
441 - include __DIR__ . '/views/metaboxes/box-appearance-controls.php';
442 - }
404 + add_meta_box(
405 + 'boxzilla-our-other-plugins',
406 + __( 'Our other plugins', 'boxzilla' ),
407 + array( $this, 'metabox_our_other_plugins' ),
408 + 'boxzilla-box',
409 + 'side'
410 + );
443 411
444 - /**
445 - * @param \WP_Post $post
446 - * @param $metabox
447 - */
448 - public function metabox_box_option_controls(\WP_Post $post, $metabox)
449 - {
412 + add_meta_box(
413 + 'boxzilla-email-optin',
414 + __( 'Subscribe to our newsletter', 'boxzilla' ),
415 + array( $this, 'metabox_email_optin' ),
416 + 'boxzilla-box',
417 + 'side'
418 + );
450 419
451 - // get box options
452 - $box = new Box($post);
453 - $opts = $box->get_options();
454 - $global_opts = $this->boxzilla->options;
420 + return true;
421 + }
455 422
456 - if (empty($opts['rules'])) {
457 - $opts['rules'][] = [
458 - 'condition' => '',
459 - 'qualifier' => 1,
460 - 'value' => '',
461 - ];
462 - }
423 + /**
424 + * @param \WP_Post $post
425 + * @param $metabox
426 + */
427 + public function metabox_box_appearance_controls( \WP_Post $post, $metabox ) {
463 428
464 - // include view
465 - include __DIR__ . '/views/metaboxes/box-option-controls.php';
466 - }
429 + // get box options
430 + $box = new Box( $post );
431 + $opts = $box->get_options();
467 432
468 - /**
469 - * @param \WP_Post $post
470 - * @param $metabox
471 - */
472 - public function metabox_our_other_plugins(\WP_Post $post, $metabox)
473 - {
474 - include __DIR__ . '/views/metaboxes/our-other-plugins.php';
475 - }
433 + // include view
434 + include __DIR__ . '/views/metaboxes/box-appearance-controls.php';
435 + }
476 436
477 - /**
478 - * @param \WP_Post $post
479 - * @param $metabox
480 - */
481 - public function metabox_support(\WP_Post $post, $metabox)
482 - {
483 - include __DIR__ . '/views/metaboxes/need-help.php';
484 - }
437 + /**
438 + * @param \WP_Post $post
439 + * @param $metabox
440 + */
441 + public function metabox_box_option_controls( \WP_Post $post, $metabox ) {
485 442
443 + // get box options
444 + $box = new Box( $post );
445 + $opts = $box->get_options();
446 + $global_opts = $this->boxzilla->options;
486 447
487 - /**
488 - * Saves box options and rules
489 - *
490 - * @param int $box_id
491 - *
492 - * @return bool
493 - */
494 - public function save_box_options($box_id, $post)
495 - {
448 + if ( empty( $opts['rules'] ) ) {
449 + $opts['rules'][] = array(
450 + 'condition' => '',
451 + 'qualifier' => 1,
452 + 'value' => '',
453 + );
454 + }
496 455
497 - // Only act on our own post type
498 - if ($post->post_type !== 'boxzilla-box') {
499 - return false;
500 - }
456 + // include view
457 + include __DIR__ . '/views/metaboxes/box-option-controls.php';
458 + }
501 459
502 - // is this a revision save?
503 - if (wp_is_post_revision($box_id) || ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE )) {
504 - return false;
505 - }
460 + /**
461 + * @param \WP_Post $post
462 + * @param $metabox
463 + */
464 + public function metabox_email_optin( \WP_Post $post, $metabox ) {
465 + include __DIR__ . '/views/metaboxes/email-optin.php';
466 + }
506 467
507 - // can user edit this post?
508 - if (! current_user_can('edit_post', $box_id)) {
509 - return false;
510 - }
468 + /**
469 + * @param \WP_Post $post
470 + * @param $metabox
471 + */
472 + public function metabox_our_other_plugins( \WP_Post $post, $metabox ) {
473 + include __DIR__ . '/views/metaboxes/our-other-plugins.php';
474 + }
511 475
512 - // make sure options array is set
513 - if (! isset($_POST['boxzilla_box']) || ! is_array($_POST['boxzilla_box'])) {
514 - return false;
515 - }
476 + /**
477 + * @param \WP_Post $post
478 + * @param $metabox
479 + */
480 + public function metabox_support( \WP_Post $post, $metabox ) {
481 + include __DIR__ . '/views/metaboxes/need-help.php';
482 + }
516 483
517 - // get new options from $_POST
518 - $opts = $this->sanitize_box_options($_POST['boxzilla_box']);
519 484
520 - // allow extensions to filter the saved options
521 - $opts = apply_filters('boxzilla_saved_options', $opts, $box_id);
485 + /**
486 + * Saves box options and rules
487 + *
488 + * @param int $box_id
489 + *
490 + * @return bool
491 + */
492 + public function save_box_options( $box_id, $post ) {
522 493
523 - // save individual box settings
524 - update_post_meta($box_id, 'boxzilla_options', $opts);
494 + // Only act on our own post type
495 + if ( $post->post_type !== 'boxzilla-box' ) {
496 + return false;
497 + }
525 498
526 - // update global settings if given
527 - if (! empty($_POST['boxzilla_global_settings'])) {
528 - $global_settings = get_option('boxzilla_settings', []);
529 - if (! is_array($global_settings)) {
530 - $global_settings = [];
531 - }
532 - $global_settings = array_merge($global_settings, $_POST['boxzilla_global_settings']);
533 - update_option('boxzilla_settings', $global_settings);
534 - }
499 + // is this a revision save?
500 + if ( wp_is_post_revision( $box_id ) || ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) ) {
501 + return false;
502 + }
535 503
536 - $this->flush_rules($box_id);
504 + // can user edit this post?
505 + if ( ! current_user_can( 'edit_post', $box_id ) ) {
506 + return false;
507 + }
537 508
538 - return true;
539 - }
509 + // make sure options array is set
510 + if ( ! isset( $_POST['boxzilla_box'] ) || ! is_array( $_POST['boxzilla_box'] ) ) {
511 + return false;
512 + }
540 513
541 - /**
542 - * @param array $opts
543 - *
544 - * @return array
545 - */
546 - public function sanitize_settings($opts)
547 - {
548 - return $opts;
549 - }
514 + // get new options from $_POST
515 + $opts = $this->sanitize_box_options( $_POST['boxzilla_box'] );
550 516
551 - /**
552 - * @param string $url_string
553 - *
554 - * @return string
555 - */
556 - public function sanitize_url($url_string)
557 - {
517 + // allow extensions to filter the saved options
518 + $opts = apply_filters( 'boxzilla_saved_options', $opts, $box_id );
558 519
559 - // if empty, just return a slash
560 - if (empty($url_string)) {
561 - return '/';
562 - }
520 + // save individual box settings
521 + update_post_meta( $box_id, 'boxzilla_options', $opts );
563 522
564 - // if string looks like an absolute URL, extract just the path
565 - if (preg_match('/^((https|http)?\:\/\/)?(\w+\.)?\w+\.\w+\.*/i', $url_string)) {
566 - // make sure URL has scheme prepended, to make parse_url() understand..
567 - $url_string = 'https://' . str_replace([ 'http://', 'https://' ], '', $url_string);
523 + // update global settings if given
524 + if ( ! empty( $_POST['boxzilla_global_settings'] ) ) {
525 + $global_settings = get_option( 'boxzilla_settings', array() );
526 + if ( ! is_array( $global_settings ) ) {
527 + $global_settings = array();
528 + }
529 + $global_settings = array_merge( $global_settings, $_POST['boxzilla_global_settings'] );
530 + update_option( 'boxzilla_settings', $global_settings );
531 + }
568 532
569 - // get just the path
570 - $url_string = parse_url($url_string, PHP_URL_PATH);
571 - }
533 + $this->flush_rules( $box_id );
572 534
573 - // leading slash it
574 - return $url_string;
575 - }
535 + return true;
536 + }
576 537
577 - /**
578 - * @param array $rule
579 - * @return array The sanitized rule array
580 - */
581 - public function sanitize_box_rule($rule)
582 - {
583 - $rule['value'] = trim($rule['value']);
538 + /**
539 + * @param array $opts
540 + *
541 + * @return array
542 + */
543 + public function sanitize_settings( $opts ) {
544 + return $opts;
545 + }
584 546
585 - // convert to array
586 - $rule['value'] = explode(',', trim($rule['value'], ','));
547 + /**
548 + * @param string $url_string
549 + *
550 + * @return string
551 + */
552 + public function sanitize_url( $url_string ) {
587 553
588 - // trim all whitespace in value field
589 - $rule['value'] = array_map('trim', $rule['value']);
554 + // if empty, just return a slash
555 + if ( empty( $url_string ) ) {
556 + return '/';
557 + }
590 558
591 - // Make sure "is_url" values have a leading slash
592 - if ($rule['condition'] === 'is_url') {
593 - $rule['value'] = array_map([ $this, 'sanitize_url' ], $rule['value']);
594 - }
559 + // if string looks like an absolute URL, extract just the path
560 + if ( preg_match( '/^((https|http)?\:\/\/)?(\w+\.)?\w+\.\w+\.*/i', $url_string ) ) {
595 561
596 - // (re)set value to 0 when condition is everywhere
597 - if ($rule['condition'] === 'everywhere') {
598 - $rule['value'] = '';
599 - }
562 + // make sure URL has scheme prepended, to make parse_url() understand..
563 + $url_string = 'https://' . str_replace( array( 'http://', 'https://' ), '', $url_string );
600 564
601 - // convert back to string before saving
602 - if (is_array($rule['value'])) {
603 - $rule['value'] = join(',', $rule['value']);
604 - }
565 + // get just the path
566 + $url_string = parse_url( $url_string, PHP_URL_PATH );
567 + }
605 568
606 - return $rule;
607 - }
569 + // leading slash it
570 + return $url_string;
571 + }
608 572
609 - /**
610 - * @param array $css
611 - * @return array
612 - */
613 - public function sanitize_box_css($css)
614 - {
573 + /**
574 + * @param array $rule
575 + * @return array The sanitized rule array
576 + */
577 + public function sanitize_box_rule( $rule ) {
578 + $rule['value'] = trim( $rule['value'] );
615 579
616 - // sanitize settings
617 - if ('' !== $css['width']) {
618 - $css['width'] = absint($css['width']);
619 - }
580 + // convert to array
581 + $rule['value'] = explode( ',', trim( $rule['value'], ',' ) );
620 582
621 - if ('' !== $css['border_width']) {
622 - $css['border_width'] = absint($css['border_width']);
623 - }
583 + // trim all whitespace in value field
584 + $rule['value'] = array_map( 'trim', $rule['value'] );
624 585
625 - // make sure colors start with `#`
626 - $color_keys = [ 'color', 'background_color', 'border_color' ];
627 - foreach ($color_keys as $key) {
628 - $value = $css[ $key ];
629 - $color = sanitize_text_field($value);
586 + // Make sure "is_url" values have a leading slash
587 + if ( $rule['condition'] === 'is_url' ) {
588 + $rule['value'] = array_map( array( $this, 'sanitize_url' ), $rule['value'] );
589 + }
630 590
631 - // make sure color starts with `#`
632 - if ('' !== $color && $color[0] !== '#') {
633 - $color = '#' . $color;
634 - }
635 - $css[ $key ] = $color;
636 - }
591 + // (re)set value to 0 when condition is everywhere
592 + if ( $rule['condition'] === 'everywhere' ) {
593 + $rule['value'] = '';
594 + }
637 595
638 - return $css;
639 - }
596 + // convert back to string before saving
597 + if ( is_array( $rule['value'] ) ) {
598 + $rule['value'] = join( ',', $rule['value'] );
599 + }
640 600
641 - /**
642 - * Sanitize the options for this box.
643 - *
644 - * @param array $opts
645 - *
646 - * @return array
647 - */
648 - protected function sanitize_box_options($opts)
649 - {
650 - $defaults = [
651 - 'rules' => [],
652 - 'css' => [],
653 - ];
601 + return $rule;
602 + }
654 603
655 - $opts = array_replace_recursive($defaults, $opts);
604 + /**
605 + * @param array $css
606 + * @return array
607 + */
608 + public function sanitize_box_css( $css ) {
656 609
657 - $opts['rules'] = array_map([ $this, 'sanitize_box_rule' ], $opts['rules']);
658 - $opts['css'] = $this->sanitize_box_css($opts['css']);
659 - $opts['cookie']['triggered'] = absint($opts['cookie']['triggered']);
660 - $opts['cookie']['dismissed'] = absint($opts['cookie']['dismissed']);
661 - $opts['trigger'] = sanitize_text_field($opts['trigger']);
662 - $opts['trigger_percentage'] = absint($opts['trigger_percentage']);
663 - $opts['trigger_element'] = sanitize_text_field($opts['trigger_element']);
664 - $opts['screen_size_condition']['value'] = intval($opts['screen_size_condition']['value']);
610 + // sanitize settings
611 + if ( '' !== $css['width'] ) {
612 + $css['width'] = absint( $css['width'] );
613 + }
665 614
666 - return $opts;
667 - }
615 + if ( '' !== $css['border_width'] ) {
616 + $css['border_width'] = absint( $css['border_width'] );
617 + }
668 618
669 - /**
670 - * Add the settings link to the Plugins overview
671 - *
672 - * @param array $links
673 - * @param string $slug
674 - *
675 - * @return array
676 - */
677 - public function add_plugin_settings_link($links, $slug)
678 - {
679 - if ($slug !== $this->plugin->slug() || ! is_array($links)) {
680 - return $links;
681 - }
619 + // make sure colors start with `#`
620 + $color_keys = array( 'color', 'background_color', 'border_color' );
621 + foreach ( $color_keys as $key ) {
622 + $value = $css[ $key ];
623 + $color = sanitize_text_field( $value );
682 624
683 - $href = admin_url('edit.php?post_type=boxzilla-box');
684 - $label = esc_html__('Boxes', 'boxzilla');
685 - $settings_link = "<a href=\"{$href}\">{$label}</a>";
686 - array_unshift($links, $settings_link);
687 - return $links;
688 - }
625 + // make sure color starts with `#`
626 + if ( '' !== $color && $color[0] !== '#' ) {
627 + $color = '#' . $color;
628 + }
629 + $css[ $key ] = $color;
630 + }
689 631
690 - /**
691 - * Adds meta links to the plugin in the WP Admin > Plugins screen
692 - *
693 - * @param array $links
694 - * @param string $slug
695 - *
696 - * @return array
697 - */
698 - public function add_plugin_meta_links($links, $slug)
699 - {
700 - if ($slug !== $this->plugin->slug()) {
701 - return $links;
702 - }
632 + return $css;
633 + }
703 634
704 - $links[] = '<a href="https://kb.boxzillaplugin.com/">Documentation</a>';
705 - $links[] = '<a href="https://boxzillaplugin.com/add-ons/">Add-ons</a>';
635 + /**
636 + * Sanitize the options for this box.
637 + *
638 + * @param array $opts
639 + *
640 + * @return array
641 + */
642 + protected function sanitize_box_options( $opts ) {
643 + $defaults = array(
644 + 'rules' => array(),
645 + 'css' => array(),
646 + );
706 647
707 - return $links;
708 - }
648 + $opts = array_replace_recursive( $defaults, $opts );
709 649
710 - /**
711 - * Flush all box rules
712 - *
713 - * Loops through all published boxes and fills the rules option
714 - *
715 - * @param int $post_id
716 - */
717 - public function flush_rules($post_id)
718 - {
650 + $opts['rules'] = array_map( array( $this, 'sanitize_box_rule' ), $opts['rules'] );
651 + $opts['css'] = $this->sanitize_box_css( $opts['css'] );
652 + $opts['cookie']['triggered'] = absint( $opts['cookie']['triggered'] );
653 + $opts['cookie']['dismissed'] = absint( $opts['cookie']['dismissed'] );
654 + $opts['trigger'] = sanitize_text_field( $opts['trigger'] );
655 + $opts['trigger_percentage'] = absint( $opts['trigger_percentage'] );
656 + $opts['trigger_element'] = sanitize_text_field( $opts['trigger_element'] );
657 + $opts['screen_size_condition']['value'] = intval( $opts['screen_size_condition']['value'] );
719 658
720 - // only act on our own post type
721 - $post = get_post($post_id);
722 - if (! $post instanceof WP_Post || $post->post_type !== 'boxzilla-box') {
723 - return;
724 - }
659 + return $opts;
660 + }
725 661
726 - // get all published boxes
727 - $query = new \WP_Query();
728 - $boxes = $query->query(
729 - [
730 - 'post_type' => 'boxzilla-box',
731 - 'post_status' => 'publish',
732 - 'posts_per_page' => - 1,
733 - 'ignore_sticky_posts' => true,
734 - 'no_found_rows' => true,
735 - ]
736 - );
662 + /**
663 + * Add the settings link to the Plugins overview
664 + *
665 + * @param array $links
666 + * @param string $slug
667 + *
668 + * @return array
669 + */
670 + public function add_plugin_settings_link( $links, $slug ) {
671 + if ( $slug !== $this->plugin->slug() || ! is_array( $links ) ) {
672 + return $links;
673 + }
737 674
738 - // setup empty array of rules
739 - $rules = [];
675 + $settings_link = '<a href="' . admin_url( 'edit.php?post_type=boxzilla-box' ) . '">' . __( 'Boxes', 'boxzilla' ) . '</a>';
676 + array_unshift( $links, $settings_link );
740 677
741 - // fill rules array
742 - if (is_array($boxes)) {
743 - foreach ($boxes as $box) {
744 - // get box meta data
745 - $box_meta = get_post_meta($box->ID, 'boxzilla_options', true);
678 + return $links;
679 + }
746 680
747 - // add box rules to all rules
748 - $rules[ $box->ID ] = (array) $box_meta['rules'];
749 - $rules[ $box->ID ]['comparision'] = isset($box_meta['rules_comparision']) ? $box_meta['rules_comparision'] : 'any';
750 - }
751 - }
681 + /**
682 + * Adds meta links to the plugin in the WP Admin > Plugins screen
683 + *
684 + * @param array $links
685 + * @param string $slug
686 + *
687 + * @return array
688 + */
689 + public function add_plugin_meta_links( $links, $slug ) {
690 + if ( $slug !== $this->plugin->slug() ) {
691 + return $links;
692 + }
752 693
753 - update_option('boxzilla_rules', $rules);
754 - }
694 + $links[] = '<a href="https://kb.boxzillaplugin.com/#utm_source=wp-plugin&utm_medium=boxzilla&utm_campaign=plugins-page">Documentation</a>';
695 + $links[] = '<a href="https://boxzillaplugin.com/add-ons/#utm_source=wp-plugin&utm_medium=boxzilla&utm_campaign=plugins-page">Add-ons</a>';
755 696
756 - /**
757 - * Fetches a list of available add-on plugins
758 - *
759 - * @return array
760 - */
761 - protected function fetch_extensions()
762 - {
763 - $extensions = get_transient('boxzilla_remote_extensions');
764 - if ($extensions) {
765 - return $extensions;
766 - }
697 + return $links;
698 + }
767 699
768 - $response = wp_remote_get('https://my.boxzillaplugin.com/api/v2/plugins');
769 - if (is_wp_error($response) || wp_remote_retrieve_response_code($response) >= 400) {
770 - return [];
771 - }
700 + /**
701 + * Flush all box rules
702 + *
703 + * Loops through all published boxes and fills the rules option
704 + *
705 + * @param int $post_id
706 + */
707 + public function flush_rules( $post_id ) {
772 708
773 - $body = wp_remote_retrieve_body($response);
774 - $data = json_decode($body);
775 - if (is_array($data)) {
776 - set_transient('boxzilla_remote_extensions', $data, 24 * HOUR_IN_SECONDS);
777 - return $data;
778 - }
709 + // only act on our own post type
710 + $post = get_post( $post_id );
711 + if ( ! $post instanceof WP_Post || $post->post_type !== 'boxzilla-box' ) {
712 + return;
713 + }
779 714
780 - return [];
781 - }
715 + // get all published boxes
716 + $query = new \WP_Query;
717 + $boxes = $query->query(
718 + array(
719 + 'post_type' => 'boxzilla-box',
720 + 'post_status' => 'publish',
721 + 'posts_per_page' => - 1,
722 + 'ignore_sticky_posts' => true,
723 + 'no_found_rows' => true,
724 + )
725 + );
782 726
783 - /**
784 - * @param $arr
785 - * @param $insert
786 - * @param $position
787 - *
788 - * @return array
789 - */
790 - public static function array_insert($arr, $insert, $position)
791 - {
792 - $i = 0;
793 - $ret = [];
794 - foreach ($arr as $key => $value) {
795 - if ($i == $position) {
796 - foreach ($insert as $ikey => $ivalue) {
797 - $ret[ $ikey ] = $ivalue;
798 - }
799 - }
800 - $ret[ $key ] = $value;
801 - $i++;
802 - }
727 + // setup empty array of rules
728 + $rules = array();
803 729
804 - return $ret;
805 - }
730 + // fill rules array
731 + if ( is_array( $boxes ) ) {
732 + foreach ( $boxes as $box ) {
733 + // get box meta data
734 + $box_meta = get_post_meta( $box->ID, 'boxzilla_options', true );
806 735
807 - /**
808 - * @param string $text
809 - *
810 - * @return string
811 - */
812 - public function admin_footer_text($text)
813 - {
814 - $screen = get_current_screen();
736 + // add box rules to all rules
737 + $rules[ $box->ID ] = (array) $box_meta['rules'];
738 + $rules[ $box->ID ]['comparision'] = isset( $box_meta['rules_comparision'] ) ? $box_meta['rules_comparision'] : 'any';
739 + }
740 + }
815 741
816 - if (! $screen instanceof WP_Screen) {
817 - return $text;
818 - }
742 + update_option( 'boxzilla_rules', $rules );
743 + }
819 744
820 - $on_edit_page = $screen->parent_base === 'edit' && $screen->post_type === 'boxzilla-box';
821 - if ($on_edit_page) {
822 - return sprintf('If you enjoy using <strong>Boxzilla</strong>, please <a href="%s" target="_blank">leave us a ★★★★★ rating</a>. A <strong style="text-decoration: underline;">huge</strong> thank you in advance!', 'https://wordpress.org/support/view/plugin-reviews/boxzilla?rate=5#postform');
823 - }
745 + /**
746 + * Fetches a list of available add-on plugins
747 + *
748 + * @return array
749 + */
750 + protected function fetch_extensions() {
751 + $extensions = get_transient( 'boxzilla_remote_extensions' );
752 + if ( $extensions ) {
753 + return $extensions;
754 + }
824 755
825 - return $text;
826 - }
756 + $response = wp_remote_get( 'https://my.boxzillaplugin.com/api/v2/plugins' );
757 + if ( is_wp_error( $response ) || wp_remote_retrieve_response_code( $response ) >= 400 ) {
758 + return array();
759 + }
760 +
761 + $body = wp_remote_retrieve_body( $response );
762 + $data = json_decode( $body );
763 + if ( is_array( $data ) ) {
764 + set_transient( 'boxzilla_remote_extensions', $data, 24 * HOUR_IN_SECONDS );
765 + return $data;
766 + }
767 +
768 + return array();
769 + }
770 +
771 + /**
772 + * @param $arr
773 + * @param $insert
774 + * @param $position
775 + *
776 + * @return array
777 + */
778 + public static function array_insert( $arr, $insert, $position ) {
779 + $i = 0;
780 + $ret = array();
781 + foreach ( $arr as $key => $value ) {
782 + if ( $i == $position ) {
783 + foreach ( $insert as $ikey => $ivalue ) {
784 + $ret[ $ikey ] = $ivalue;
785 + }
786 + }
787 + $ret[ $key ] = $value;
788 + $i ++;
789 + }
790 +
791 + return $ret;
792 + }
793 +
794 + /**
795 + * @param string $text
796 + *
797 + * @return string
798 + */
799 + public function admin_footer_text( $text ) {
800 + $screen = get_current_screen();
801 +
802 + if ( ! $screen instanceof WP_Screen ) {
803 + return $text;
804 + }
805 +
806 + $on_edit_page = $screen->parent_base === 'edit' && $screen->post_type === 'boxzilla-box';
807 + if ( $on_edit_page ) {
808 + return sprintf( 'If you enjoy using <strong>Boxzilla</strong>, please <a href="%s" target="_blank">leave us a ★★★★★ rating</a>. A <strong style="text-decoration: underline;">huge</strong> thank you in advance!', 'https://wordpress.org/support/view/plugin-reviews/boxzilla?rate=5#postform' );
809 + }
810 +
811 + return $text;
812 + }
813 +
814 +
827 815 }