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