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