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