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 '
' . esc_html($section['desc']) . '
'; }; } add_settings_section($section['id'], esc_html($section['title']), $callback, $section['id']); } foreach ($this->settings_fields as $section => $field) { foreach ($field as $option) { $type = isset($option['type']) ? $option['type'] : 'text'; $args = array( 'id' => $option['name'], 'label_for' => "{$section}[{$option['name']}]", 'desc' => isset($option['desc']) ? $option['desc'] : '', 'name' => $option['label'], 'section' => $section, 'size' => isset($option['size']) ? $option['size'] : null, 'options' => isset($option['options']) ? $option['options'] : '', 'std' => isset($option['default']) ? $option['default'] : '', 'sanitize_callback' => isset($option['sanitize_callback']) ? $option['sanitize_callback'] : '', 'type' => $type, ); add_settings_field($section . '[' . $option['name'] . ']', esc_html($option['label']), array($this, 'callback_' . $type), $section, $section, $args); } } foreach ($this->settings_sections as $section) { register_setting($section['id'], $section['id'], array($this, 'sanitize_options')); } } public function get_field_description($args) { if (! empty($args['desc'])) { $desc = sprintf('

%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 = '
'; $html .= sprintf('', esc_html($args['desc'])); $html .= '
'; echo wp_kses_post($html); } function callback_multicheck($args) { $value = $this->get_option($args['id'], $args['section'], $args['std']); $html = '
'; foreach ($args['options'] as $key => $label) { $checked = isset($value[$key]) ? $value[$key] : '0'; $html .= sprintf('
', esc_html($label)); } $html .= $this->get_field_description($args); $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 = ''; echo wp_kses_post($html); } function show_forms() { ?>
settings_sections as $form) { ?>
script(); } function script() { ?>