settings_sections = $sections; return $this; } function add_section($section) { $this->settings_sections[] = $section; return $this; } function set_fields($fields) { $this->settings_fields = $fields; return $this; } function add_field($section, $field) { $defaults = array( 'name' => '', 'label' => '', 'desc' => '', 'type' => 'text' ); $arg = wp_parse_args($field, $defaults); $this->settings_fields[$section][] = $arg; return $this; } function admin_init() { foreach ($this->settings_sections as $section) { if (false === get_option($section['id'])) { add_option($section['id']); } $callback = isset($section['callback']) ? $section['callback'] : null; if (isset($section['desc']) && !empty($section['desc'])) { $callback = function () use ($section) { echo '
%s
', esc_html($args['desc'])); } else { $desc = ''; } return $desc; } function callback_text($args) { $value = esc_attr($this->get_option($args['id'], $args['section'], $args['std'])); $size = isset($args['size']) && !is_null($args['size']) ? $args['size'] : 'regular'; $type = isset($args['type']) ? $args['type'] : 'text'; $html = sprintf( '', $type, $size, esc_attr($args['section']), esc_attr($args['id']), $value ); $html .= $this->get_field_description($args); echo wp_kses_post($html); } function callback_url($args) { $this->callback_text($args); } function callback_number($args) { $this->callback_text($args); } function callback_checkbox($args) { $value = esc_attr($this->get_option($args['id'], $args['section'], $args['std'])); $html = ''; echo wp_kses_post($html); } function callback_multicheck($args) { $value = $this->get_option($args['id'], $args['section'], $args['std']); $html = ''; echo wp_kses_post($html); } function callback_select($args) { $value = esc_attr($this->get_option($args['id'], $args['section'], $args['std'])); $size = isset($args['size']) && !is_null($args['size']) ? $args['size'] : 'regular'; $html = sprintf(''); $html .= $this->get_field_description($args); echo wp_kses_post($html); } function callback_textarea($args) { $value = esc_textarea($this->get_option($args['id'], $args['section'], $args['std'])); $size = isset($args['size']) && !is_null($args['size']) ? $args['size'] : 'regular'; $html = sprintf('', $size, esc_attr($args['section']), esc_attr($args['id']), $value); $html .= $this->get_field_description($args); echo wp_kses_post($html); } function sanitize_options($options) { foreach ($options as $option_slug => $option_value) { $sanitize_callback = $this->get_sanitize_callback($option_slug); if ($sanitize_callback) { $options[$option_slug] = call_user_func($sanitize_callback, $option_value); continue; } } return $options; } function get_sanitize_callback($slug = '') { if (empty($slug)) { return false; } foreach ($this->settings_fields as $section => $options) { foreach ($options as $option) { if ($option['name'] !== $slug) { continue; } return isset($option['sanitize_callback']) && is_callable($option['sanitize_callback']) ? $option['sanitize_callback'] : false; } } return false; } function get_option($option, $section, $default = '') { $options = get_option($section); return isset($options[$option]) ? $options[$option] : $default; } function show_navigation() { $html = '