PluginProbe ʕ •ᴥ•ʔ
Post Views Counter / 1.3.13
Post Views Counter v1.3.13
1.7.13 1.7.12 1.7.11 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.2.0 1.2.1 1.2.10 1.2.11 1.2.12 1.2.13 1.2.14 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.2.7 1.2.8 1.2.9 1.3 1.3.1 1.3.10 1.3.11 1.3.12 1.3.13 1.3.2 1.3.2.1 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4 1.4.1 1.4.2 1.4.3 1.4.4 1.4.5 1.4.6 1.4.7 1.4.8 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.5.9 1.6.0 1.6.1 1.7.0 1.7.1 1.7.10 1.7.2 1.7.3 1.7.4 1.7.5 1.7.6 1.7.7 1.7.8 1.7.9
post-views-counter / includes / class-settings-api.php
post-views-counter / includes Last commit date
class-admin.php 3 years ago class-columns.php 3 years ago class-counter.php 3 years ago class-crawler-detect.php 3 years ago class-cron.php 3 years ago class-dashboard.php 3 years ago class-frontend.php 3 years ago class-functions.php 3 years ago class-query.php 3 years ago class-settings-api.php 3 years ago class-settings.php 3 years ago class-update.php 3 years ago class-widgets.php 3 years ago functions.php 3 years ago
class-settings-api.php
735 lines
1 <?php
2 // exit if accessed directly
3 if ( ! defined( 'ABSPATH' ) )
4 exit;
5
6 /**
7 * Post_Views_Counter_Settings_API class.
8 *
9 * @class Post_Views_Counter_Settings_API
10 */
11 class Post_Views_Counter_Settings_API {
12
13 private $settings = [];
14 private $input_settings = [];
15 private $validated_settings = [];
16 private $pages = [];
17 private $page_types = [];
18 private $prefix = '';
19 private $slug = '';
20 private $domain = '';
21 private $short = '';
22 private $plugin = '';
23 private $plugin_url = '';
24 private $object;
25
26 /**
27 * Class constructor.
28 *
29 * @return void
30 */
31 public function __construct( $args ) {
32 // set initial data
33 $this->prefix = $args['prefix'];
34 $this->domain = $args['domain'];
35
36 // empty slug?
37 if ( empty( $args['slug'] ) )
38 $this->slug = $args['domain'];
39 else
40 $this->slug = $args['slug'];
41
42 // empty short name?
43 if ( empty( $args['short'] ) ) {
44 $short = '';
45
46 // prepare short name based on prefix
47 $parts = explode( '_', $this->prefix );
48
49 foreach ( $parts as $string ) {
50 $short .= substr( $string, 0, 1 );
51 }
52
53 // set short name
54 $this->short = $short;
55 } else
56 $this->short = $args['short'];
57
58 $this->object = $args['object'];
59 $this->plugin = $args['plugin'];
60 $this->plugin_url = $args['plugin_url'];
61
62 // actions
63 add_action( 'admin_menu', [ $this, 'admin_menu_options' ], 11 );
64 add_action( 'admin_init', [ $this, 'register_settings' ], 11 );
65 }
66
67 /**
68 * Get prefix.
69 *
70 * @return string
71 */
72 public function get_prefix() {
73 return $this->prefix;
74 }
75
76 /**
77 * Get pages.
78 *
79 * @return array
80 */
81 public function get_pages() {
82 return $this->pages;
83 }
84
85 /**
86 * Get settings.
87 *
88 * @return array
89 */
90 public function get_settings() {
91 return $this->settings;
92 }
93
94 /**
95 * Get current input settings during saving.
96 *
97 * @return array
98 */
99 public function get_input_settings() {
100 return $this->input_settings;
101 }
102
103 /**
104 * Get already validated setting fields during saving.
105 *
106 * @return array
107 */
108 public function get_validated_settings() {
109 return $this->validated_settings;
110 }
111
112 /**
113 * Add menu pages.
114 *
115 * @return void
116 */
117 public function admin_menu_options() {
118 $this->pages = apply_filters( $this->prefix . '_settings_pages', [] );
119 $types = [
120 'page' => [],
121 'subpage' => [],
122 'settings_page' => []
123 ];
124
125 foreach ( $this->pages as $page => $data ) {
126 // skip invalid page types
127 if ( empty( $data['type'] ) || ! array_key_exists( $data['type'], $types ) )
128 continue;
129
130 // menu subpage?
131 if ( $data['type'] === 'subpage' ) {
132 add_submenu_page( $data['parent_slug'], $data['page_title'], $data['menu_title'], $data['capability'], $data['menu_slug'], ! empty( $data['callback'] ) ? $data['callback'] : [ $this, 'options_page' ] );
133
134 // add subpage type
135 $types['subpage'][$data['menu_slug']] = $page;
136 // menu settings page?
137 } elseif ( $data['type'] === 'settings_page' ) {
138 add_options_page( $data['page_title'], $data['menu_title'], $data['capability'], $data['menu_slug'], ! empty( $data['callback'] ) ? $data['callback'] : [ $this, 'options_page' ] );
139
140 // add settings type
141 $types['settings_page'][$data['menu_slug']] = $page;
142 }
143 }
144
145 // set page types
146 $this->page_types = $types;
147 }
148
149 /**
150 * Render settings.
151 *
152 * @global string $pagenow
153 *
154 * @return void
155 */
156 public function options_page() {
157 global $pagenow;
158
159 $valid_page = false;
160
161 // get current screen
162 $screen = get_current_screen();
163
164 // display sub level settings page?
165 if ( $pagenow === 'admin.php' && preg_match( '/^(?:toplevel|' . $this->prefix . ')_page_' . $this->prefix . '-(' . implode( '|', $this->page_types['subpage'] ) . ')-settings$/', $screen->base, $matches ) === 1 && ! empty( $matches[1] ) ) {
166 $valid_page = true;
167 $page_type = 'subpage';
168 $url_page = 'admin.php';
169 }
170
171 // display settings page?
172 if ( ! $valid_page && $pagenow === 'options-general.php' && preg_match( '/^(?:settings_page_)(' . implode( '|', array_keys( $this->page_types['settings_page'] ) ) . ')$/', $screen->base, $matches ) === 1 ) {
173 $valid_page = true;
174 $page_type = 'settings_page';
175 $url_page = 'options-general.php';
176 }
177
178 // skip invalid pages
179 if ( ! $valid_page )
180 return;
181
182 echo '
183 <div class="wrap">
184 <h2>' . esc_html( $this->settings[$matches[1]]['label'] ) . '</h2>';
185
186 // any tabs?
187 if ( array_key_exists( 'tabs', $this->pages[$this->page_types[$page_type][$matches[1]]] ) ) {
188 // get tabs
189 $tabs = $this->pages[$this->page_types[$page_type][$matches[1]]]['tabs'];
190
191 // reset tabs
192 reset( $tabs );
193
194 // get first default tab
195 $first_tab = key( $tabs );
196
197 // get current tab
198 $tab_key = ! empty( $_GET['tab'] ) && array_key_exists( $_GET['tab'], $tabs ) ? $_GET['tab'] : $first_tab;
199
200 echo '
201 <h2 class="nav-tab-wrapper">';
202
203 foreach ( $tabs as $key => $tab ) {
204 echo '
205 <a class="nav-tab ' . ( $tab_key === $key ? 'nav-tab-active' : '' ) . '" href="' . esc_url( admin_url( $url_page . '?page=' . $matches[1] . '&tab=' . $key ) ) . '">' . esc_html( $tab['label'] ) . '</a>';
206 }
207
208 echo '
209 </h2>';
210 }
211
212 // skip for internal options page
213 if ( $page_type !== 'settings_page' )
214 settings_errors();
215
216 echo '
217 <div class="' . $this->slug . '-settings">
218 <div class="df-credits">
219 <h3 class="hndle">' . $this->plugin . ' ' . $this->object->defaults['version'] . '</h3>
220 <div class="inside">
221 <h4 class="inner">' . __( 'Need support?', $this->domain ) . '</h4>
222 <p class="inner">' . sprintf( __( 'If you are having problems with this plugin, please browse it\'s <a href="%s" target="_blank">Documentation</a> or talk about them in the <a href="%s" target="_blank">Support forum</a>', $this->domain ), 'http://www.dfactory.co/docs/' . $this->slug . '/?utm_source=' . $this->slug . '-settings&utm_medium=link&utm_campaign=docs', 'http://www.dfactory.co/support/?utm_source=' . $this->slug . '-settings&utm_medium=link&utm_campaign=support' ) . '</p>
223 <hr />
224 <h4 class="inner">' . __( 'Do you like this plugin?', $this->domain ) . '</h4>
225 <p class="inner">' . sprintf( __( '<a href="%s" target="_blank">Rate it 5</a> on WordPress.org', $this->domain ), 'https://wordpress.org/support/plugin/' . $this->slug . '/reviews/?filter=5' ) . '<br />' .
226 sprintf( __( 'Blog about it & link to the <a href="%s" target="_blank">plugin page</a>.', $this->domain ), 'http://www.dfactory.co/products/' . $this->slug . '/?utm_source=' . $this->slug . '-settings&utm_medium=link&utm_campaign=blog-about' ) . '<br />' .
227 sprintf( __( 'Check out our other <a href="%s" target="_blank">WordPress plugins</a>.', $this->domain ), 'http://www.dfactory.co/products/?utm_source=' . $this->slug . '-settings&utm_medium=link&utm_campaign=other-plugins' ) . '
228 </p>
229 <hr />
230 <p class="df-link inner"><a href="http://www.dfactory.co/?utm_source=' . $this->slug . '-settings&utm_medium=link&utm_campaign=created-by" target="_blank" title="Digital Factory"><img src="//pvc-53eb.kxcdn.com/df-black-sm.png" alt="Digital Factory"></a></p>
231 </div>
232 </div>';
233
234 $display_form = true;
235
236 // check form attribute
237 if ( ! empty( $this->settings[$matches[1]]['form'] ) && ! empty( $tab_key ) && ! empty( $this->settings[$matches[1]]['form'][$tab_key] ) ) {
238 $form = $this->settings[$matches[1]]['form'][$tab_key];
239
240 if ( isset( $form['buttons'] ) && ! $form['buttons'] )
241 $display_form = false;
242 }
243
244 // any tabs?
245 if ( ! empty( $tab_key ) ) {
246 if ( ! empty( $tabs[$tab_key]['option_name'] ) )
247 $setting = $tabs[$tab_key]['option_name'];
248 else
249 $setting = $this->prefix . '_' . $tab_key . '_settings';
250 } else
251 $setting = $this->prefix . '_' . $matches[1] . '_settings';
252
253 if ( $display_form ) {
254 echo '
255 <form action="options.php" method="post">';
256 }
257
258 settings_fields( $setting );
259 do_settings_sections( $setting );
260
261 if ( $display_form ) {
262 echo '
263 <p class="submit">';
264
265 submit_button( '', 'primary', 'save_' . $setting, false );
266
267 echo ' ';
268
269 submit_button( __( 'Reset to defaults', $this->domain ), 'secondary reset_' . $setting . ' reset_' . $this->short . '_settings', 'reset_' . $setting, false );
270
271 echo '
272 </p>
273 </form>';
274 }
275
276 echo '
277 </div>
278 <div class="clear"></div>
279 </div>';
280 }
281
282 /**
283 * Register settings.
284 *
285 * @return void
286 */
287 public function register_settings() {
288 $this->settings = apply_filters( $this->prefix . '_settings_data', [] );
289
290 // check settings
291 foreach ( $this->settings as $setting_id => $setting ) {
292 // tabs?
293 if ( is_array( $setting['option_name'] ) ) {
294 foreach ( $setting['option_name'] as $tab => $option_name ) {
295 $this->register_setting_fields( $tab, $setting, $option_name );
296 }
297 } else
298 $this->register_setting_fields( $setting_id, $setting );
299 }
300 }
301
302 /**
303 * Register setting with sections and fields.
304 *
305 * @return void
306 */
307 public function register_setting_fields( $setting_id, $setting, $option_name = '' ) {
308 if ( empty( $option_name ) )
309 $option_name = $setting['option_name'];
310
311 // register setting
312 register_setting( $option_name, $option_name, ! empty( $setting['validate'] ) ? $setting['validate'] : [ $this, 'validate_settings' ] );
313
314 // register setting sections
315 if ( ! empty( $setting['sections'] ) ) {
316 foreach ( $setting['sections'] as $section_id => $section ) {
317 // skip unwanted sections
318 if ( ! empty( $section['tab'] ) && $section['tab'] !== $setting_id )
319 continue;
320
321 add_settings_section(
322 $section_id,
323 ! empty( $section['title'] ) ? esc_html( $section['title'] ) : '',
324 ! empty( $section['callback'] ) ? $section['callback'] : null,
325 ! empty( $section['page'] ) ? $section['page'] : $option_name
326 );
327 }
328 }
329
330 // register setting fields
331 if ( ! empty( $setting['fields'] ) ) {
332 foreach ( $setting['fields'] as $field_key => $field ) {
333 // skip unwanted fields
334 if ( ! empty( $field['tab'] ) && $field['tab'] !== $setting_id )
335 continue;
336
337 // set field ID
338 $field_id = implode( '_', [ $this->prefix, $setting_id, $field_key ] );
339
340 // skip rendering this field?
341 if ( ! empty( $field['skip_rendering'] ) )
342 continue;
343
344 add_settings_field(
345 $field_id,
346 ! empty( $field['title'] ) ? esc_html( $field['title'] ) : '',
347 [ $this, 'render_field' ],
348 $option_name,
349 ! empty( $field['section'] ) ? esc_attr( $field['section'] ) : '',
350 array_merge( $this->prepare_field_args( $field, $field_id, $field_key, $setting_id, $option_name ), $field )
351 );
352 }
353 }
354 }
355
356 /**
357 * Prepare field arguments.
358 *
359 * @param array $args
360 * @return array
361 */
362 public function prepare_field_args( $field, $field_id, $field_key, $setting_id, $setting_name ) {
363 // get field type
364 $field_type = ! empty( $field['type'] ) ? $field['type'] : '';
365
366 return [
367 'id' => $field_id,
368 'name' => $setting_name . '[' . $field_key . ']',
369 'class' => ! empty( $field['class'] ) ? $field['class'] : '',
370 'type' => $field_type,
371 'label' => ! empty( $field['label'] ) ? $field['label'] : '',
372 'description' => ! empty( $field['description'] ) ? $field['description'] : '',
373 'text' => ! empty( $field['text'] ) ? $field['text'] : '',
374 'min' => ! empty( $field['min'] ) ? (int) $field['min'] : 0,
375 'max' => ! empty( $field['max'] ) ? (int) $field['max'] : 0,
376 'options' => ! empty( $field['options'] ) ? $field['options'] : [],
377 'callback' => ! empty( $field['callback'] ) ? $field['callback'] : null,
378 'validate' => ! empty( $field['validate'] ) ? $field['validate'] : null,
379 'callback_args' => ! empty( $field['callback_args'] ) ? $field['callback_args'] : [],
380 'default' => $field_type !== 'custom' ? $this->object->defaults[$setting_id][$field_key] : null,
381 'value' => $field_type !== 'custom' ? $this->object->options[$setting_id][$field_key] : null
382 /*
383 after_field
384 before_field
385 */
386 ];
387 }
388
389 /**
390 * Render settings field.
391 *
392 * @param array $args
393 * @return void|string
394 */
395 public function render_field( $args ) {
396 if ( empty( $args ) || ! is_array( $args ) )
397 return;
398
399 $html = '<div id="' . $args['id'] . '_setting"' . ( ! empty( $args['class'] ) ? ' class="' . $args['class'] . '"' : '' ) . '>';
400
401 if ( ! empty ( $args['before_field'] ) )
402 $html .= $args['before_field'];
403
404 switch ( $args['type'] ) {
405 case 'boolean':
406 $html .= '<input type="hidden" name="' . esc_attr( $args['name'] ) . '" value="false" />';
407 $html .= '<label><input id="' . esc_attr( $args['id'] ) . '" type="checkbox" name="' . esc_attr( $args['name'] ) . '" value="true" ' . checked( (bool) $args['value'], true, false ) . ' ' . disabled( empty( $args['disabled'] ), false, false ) . ' />' . esc_html( $args['label'] ) . '</label>';
408 break;
409
410 case 'radio':
411 foreach ( $args['options'] as $key => $name ) {
412 $html .= '<label><input id="' . esc_attr( $args['id'] . '_' . $key ) . '" type="radio" name="' . esc_attr( $args['name'] ) . '" value="' . esc_attr( $key ) . '" ' . checked( $key, $args['value'], false ) . ' ' . disabled( ! empty( $args['disabled'] ) && in_array ( $key, $args['disabled'], true ), true, false ) . ' />' . esc_html( $name ) . '</label> ';
413 }
414 break;
415
416 case 'checkbox':
417 // possible "empty" value
418 if ( $args['value'] === 'empty' )
419 $args['value'] = [];
420
421 $display_type = ! empty( $args['display_type'] ) && in_array( $args['display_type'], [ 'horizontal', 'vertical' ], true ) ? $args['display_type'] : 'horizontal';
422
423 $html .= '<input type="hidden" name="' . esc_attr( $args['name'] ) . '" value="empty" />';
424
425 foreach ( $args['options'] as $key => $name ) {
426 $html .= '<label><input id="' . esc_attr( $args['id'] . '_' . $key ) . '" type="checkbox" name="' . esc_attr( $args['name'] ) . '[]" value="' . esc_attr( $key ) . '" ' . checked( in_array( $key, $args['value'] ), true, false ) . ' ' . disabled( ! empty( $args['disabled'] ) && in_array ( $key, $args['disabled'], true ), true, false ) . ' />' . esc_html( $name ) . '</label>' . ( $display_type === 'horizontal' ? ' ' : '<br />' );
427 }
428 break;
429
430 case 'select':
431 $html .= '<select id="' . esc_attr( $args['id'] ) . '" name="' . esc_attr( $args['name'] ) . '" />';
432
433 foreach ( $args['options'] as $key => $name ) {
434 $html .= '<option value="' . esc_attr( $key ) . '" ' . selected( $args['value'], $key, false ) . '>' . esc_html( $name ) . '</option>';
435 }
436
437 $html .= '</select>';
438 break;
439
440 case 'range':
441 $html .= '<input id="' . esc_attr( $args['id'] . '_slider' ) . '" type="range" name="' . esc_attr( $args['name'] ) . '" value="' . esc_attr( $args['value'] ) . '" min="' . esc_attr( $args['min'] ) . '" max="' . esc_attr( $args['max'] ) . '" oninput="this.form.' . esc_attr( $args['id'] ) . '_range.value = this.value" /><output class="' . esc_attr( $this->slug ) . '-range" name="' . esc_attr( $args['id'] ) . '_range">' . ( (int) $args['value'] ) . '</output>';
442 break;
443
444 case 'number':
445 $html .= ( ! empty( $args['prepend'] ) ? '<span>' . esc_html( $args['prepend'] ) . '</span> ' : '' );
446 $html .= '<input id="' . $args['id'] . '" type="text" value="' . esc_attr( $args['value'] ) . '" name="' . esc_attr( $args['name'] ) . '" />';
447 $html .= ( ! empty( $args['append'] ) ? ' <span>' . esc_html( $args['append'] ) . '</span>' : '' );
448 break;
449
450 case 'custom':
451 $html .= call_user_func( $args['callback'], $args );
452 break;
453
454 case 'info':
455 $html .= '<span' . ( ! empty( $args['subclass'] ) ? ' class="' . esc_attr( $args['subclass'] ) . '"' : '' ) . '>' . esc_html( $args['text'] ) . '</span>';
456 break;
457
458 case 'input':
459 default:
460 $html .= ( ! empty( $args['prepend'] ) ? '<span>' . esc_html( $args['prepend'] ) . '</span> ' : '' );
461 $html .= '<input id="' . $args['id'] . '"' . ( ! empty( $args['subclass'] ) ? ' class="' . esc_attr( $args['subclass'] ) . '"' : '' ) . ' type="text" value="' . esc_attr( $args['value'] ) . '" name="' . esc_attr( $args['name'] ) . '" />';
462 $html .= ( ! empty( $args['append'] ) ? ' <span>' . esc_html( $args['append'] ) . '</span>' : '' );
463 }
464
465 if ( ! empty ( $args['after_field'] ) )
466 $html .= $args['after_field'];
467
468 if ( ! empty ( $args['description'] ) )
469 $html .= '<p class="description">' . $args['description'] . '</p>';
470
471 $html .= '</div>';
472
473 if ( ! empty( $args['return'] ) )
474 return $html;
475 else
476 echo $html;
477 }
478
479 /**
480 * Validate settings field.
481 *
482 * @param mixed $value
483 * @param string $type
484 * @param array $args
485 * @return mixed
486 */
487 public function validate_field( $value = null, $type = '', $args = [] ) {
488 if ( is_null( $value ) )
489 return null;
490
491 switch ( $type ) {
492 case 'boolean':
493 // possible value: 'true' or 'false'
494 $value = ( $value === 'true' || $value === true );
495 break;
496
497 case 'radio':
498 $value = is_array( $value ) ? false : sanitize_text_field( $value );
499 break;
500
501 case 'checkbox':
502 // possible value: 'empty' or array
503 if ( $value === 'empty' )
504 $value = [];
505 else {
506 if ( is_array( $value ) && ! empty( $value ) ) {
507 $value = array_map( 'sanitize_text_field', $value );
508 $values = [];
509
510 foreach ( $value as $single_value ) {
511 if ( array_key_exists( $single_value, $args['options'] ) )
512 $values[] = $single_value;
513 }
514
515 $value = $values;
516 } else
517 $value = [];
518 }
519 break;
520
521 case 'number':
522 $value = (int) $value;
523
524 // is value lower than?
525 if ( isset( $args['min'] ) && $value < $args['min'] )
526 $value = $args['min'];
527
528 // is value greater than?
529 if ( isset( $args['max'] ) && $value > $args['max'] )
530 $value = $args['max'];
531 break;
532
533 case 'info':
534 $value = '';
535 break;
536
537 case 'custom':
538 // do nothing
539 break;
540
541 case 'input':
542 case 'select':
543 default:
544 $value = is_array( $value ) ? array_map( 'sanitize_text_field', $value ) : sanitize_text_field( $value );
545 break;
546 }
547
548 return stripslashes_deep( $value );
549 }
550
551 /**
552 * Validate settings.
553 *
554 * @param array $input
555 * @return array
556 */
557 public function validate_settings( $input ) {
558 // check capability
559 //@TODO dodac tu capability
560 // if ( ! current_user_can( apply_filters( 'rl_lightbox_settings_capability', 'edit_lightbox_settings' ) ) )
561 // return $input;
562
563 // check capability
564 if ( ! current_user_can( 'manage_options' ) )
565 return $input;
566
567 // check option page
568 if ( empty( $_POST['option_page'] ) )
569 return $input;
570
571 // try to get setting name and ID
572 foreach ( $this->settings as $id => $setting ) {
573 // tabs?
574 if ( is_array( $setting['option_name'] ) ) {
575 foreach ( $setting['option_name'] as $tab => $option_name ) {
576 // found valid setting?
577 if ( $option_name === $_POST['option_page'] ) {
578 // assign setting ID
579 $setting_id = $tab;
580
581 // assign setting name
582 $setting_name = $option_name;
583
584 // assign setting key
585 $setting_key = $id;
586
587 // already found setting, no need to check the rest
588 break 2;
589 }
590 }
591 } else {
592 // found valid setting?
593 if ( $setting['option_name'] === $_POST['option_page'] ) {
594 // assign setting ID and key
595 $setting_key = $setting_id = $id;
596
597 // assign setting name
598 $setting_name = $setting['option_name'];
599
600 // already found setting, no need to check the rest
601 break;
602 }
603 }
604 }
605
606 // check setting id, no need to check $setting_name since it was at the same stage
607 if ( empty( $setting_id ) )
608 return $input;
609
610 // save settings
611 if ( isset( $_POST['save_' . $setting_name] ) ) {
612 $input = $this->validate_input_settings( $setting_id, $setting_key, $input );
613
614 add_settings_error( $setting_name, 'settings_saved', __( 'Settings saved.', $this->domain ), 'updated' );
615 // reset settings
616 } elseif ( isset( $_POST['reset_' . $setting_name] ) ) {
617 // get default values
618 $input = $this->object->defaults[$setting_id];
619
620 // check custom reset functions
621 if ( ! empty( $this->settings[$setting_key]['fields'] ) ) {
622 foreach ( $this->settings[$setting_key]['fields'] as $field_id => $field ) {
623 // skip invalid tab field if any
624 if ( ! empty( $field['tab'] ) && $field['tab'] !== $setting_id )
625 continue;
626
627 // custom reset function?
628 if ( ! empty( $field['reset'] ) ) {
629 // valid function? no need to check "else" since all default values are already set
630 if ( $this->callback_function_exists( $field['reset'] ) ) {
631 if ( $field['type'] === 'custom' )
632 $input = call_user_func( $field['reset'], $input, $field );
633 else
634 $input[$field_id] = call_user_func( $field['reset'], $input[$field_id], $field );
635 }
636 }
637 }
638 }
639
640 add_settings_error( $setting_name, 'settings_restored', __( 'Settings restored to defaults.', $this->domain ), 'updated' );
641 }
642
643 return $input;
644 }
645
646 /**
647 * Validate input settings.
648 *
649 * @param string $setting_id
650 * @param array $input
651 * @return array
652 */
653 public function validate_input_settings( $setting_id, $setting_key, $input ) {
654 if ( ! empty( $this->settings[$setting_key]['fields'] ) ) {
655 foreach ( $this->settings[$setting_key]['fields'] as $field_id => $field ) {
656 // skip saving this field?
657 if ( ! empty( $field['skip_saving'] ) )
658 continue;
659
660 // skip invalid tab field if any
661 if ( ! empty( $field['tab'] ) && $field['tab'] !== $setting_id )
662 continue;
663
664 // custom validate function?
665 if ( ! empty( $field['validate'] ) ) {
666 // valid function?
667 if ( $this->callback_function_exists( $field['validate'] ) ) {
668 if ( $field['type'] === 'custom' )
669 $input = call_user_func( $field['validate'], $input, $field );
670 else
671 $input[$field_id] = isset( $input[$field_id] ) ? call_user_func( $field['validate'], $input[$field_id], $field ) : $this->object->defaults[$setting_id][$field_id];
672 } else
673 $input[$field_id] = $this->object->defaults[$setting_id][$field_id];
674 } else {
675 // field data?
676 if ( isset( $input[$field_id] ) )
677 $input[$field_id] = $this->validate_field( $input[$field_id], $field['type'], $field );
678 else
679 $input[$field_id] = $this->object->defaults[$setting_id][$field_id];
680 }
681
682 // update input data
683 $this->input_settings = $input;
684
685 // add this field as validated
686 $this->validated_settings[] = $field_id;
687 }
688 }
689
690 return $input;
691 }
692
693 /**
694 * Check whether callback is a valid function.
695 *
696 * @param string|array $callback
697 * @return bool
698 */
699 public function callback_function_exists( $callback ) {
700 // function as array?
701 if ( is_array( $callback ) ) {
702 list( $object, $function ) = $callback;
703
704 // check function existence
705 $function_exists = method_exists( $object, $function );
706 // function as string?
707 } elseif ( is_string( $callback ) ) {
708 // check function existence
709 $function_exists = function_exists( $callback );
710 } else
711 $function_exists = false;
712
713 return $function_exists;
714 }
715
716 /**
717 * Get value based on minimum and maximum.
718 *
719 * @param array $data
720 * @param string $setting_name
721 * @param int $default
722 * @param int $min
723 * @param int $max
724 * @return void
725 */
726 public function get_int_value( $data, $setting_name, $default, $min, $max ) {
727 // check existence of value
728 $value = array_key_exists( $setting_name, $data ) ? (int) $data[$setting_name] : $default;
729
730 if ( $value > $max || $value < $min )
731 $value = $default;
732
733 return $value;
734 }
735 }