diff --git a/.gitignore b/.gitignore
index 723ef36..090a1f0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
-.idea
\ No newline at end of file
+.idea
+.DS_Store
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..216004d
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,22 @@
+{
+ "name": "wp-settings-api",
+ "type": "library",
+ "description": "WordPress settings API Abstraction Class",
+ "keywords": ["wp","wordpress", "settings-api"],
+ "homepage": "https://github.com/wp-graphql/wp-settings-api",
+ "license": "GPLv2",
+ "authors": [
+ {
+ "name": "Tareq Hasan",
+ "email": "tareq@wedevs.com",
+ "homepage": "http://tareq.wedevs.com",
+ "role": "Developer"
+ }
+ ],
+ "require": {
+ "php": ">=5.2.4"
+ },
+ "autoload": {
+ "classmap": ["src/"]
+ }
+}
diff --git a/example/oop-example.php b/example/oop-example.php
new file mode 100755
index 0000000..ec51a08
--- /dev/null
+++ b/example/oop-example.php
@@ -0,0 +1,202 @@
+settings_api = new WPGraphQL_Settings_API;
+
+ add_action( 'admin_init', array($this, 'admin_init') );
+ add_action( 'admin_menu', array($this, 'admin_menu') );
+ }
+
+ function admin_init() {
+
+ //set the settings
+ $this->settings_api->set_sections( $this->get_settings_sections() );
+ $this->settings_api->set_fields( $this->get_settings_fields() );
+
+ //initialize settings
+ $this->settings_api->admin_init();
+ }
+
+ function admin_menu() {
+ add_options_page( 'Settings API', 'Settings API', 'delete_posts', 'settings_api_test', array($this, 'plugin_page') );
+ }
+
+ function get_settings_sections() {
+ $sections = array(
+ array(
+ 'id' => 'wedevs_basics',
+ 'title' => __( 'Basic Settings', 'wedevs' )
+ ),
+ array(
+ 'id' => 'wedevs_advanced',
+ 'title' => __( 'Advanced Settings', 'wedevs' )
+ )
+ );
+ return $sections;
+ }
+
+ /**
+ * Returns all the settings fields
+ *
+ * @return array settings fields
+ */
+ function get_settings_fields() {
+ $settings_fields = array(
+ 'wedevs_basics' => array(
+ array(
+ 'name' => 'text_val',
+ 'label' => __( 'Text Input', 'wedevs' ),
+ 'desc' => __( 'Text input description', 'wedevs' ),
+ 'placeholder' => __( 'Text Input placeholder', 'wedevs' ),
+ 'type' => 'text',
+ 'default' => 'Title',
+ 'sanitize_callback' => 'sanitize_text_field'
+ ),
+ array(
+ 'name' => 'number_input',
+ 'label' => __( 'Number Input', 'wedevs' ),
+ 'desc' => __( 'Number field with validation callback `floatval`', 'wedevs' ),
+ 'placeholder' => __( '1.99', 'wedevs' ),
+ 'min' => 0,
+ 'max' => 100,
+ 'step' => '0.01',
+ 'type' => 'number',
+ 'default' => 'Title',
+ 'sanitize_callback' => 'floatval'
+ ),
+ array(
+ 'name' => 'textarea',
+ 'label' => __( 'Textarea Input', 'wedevs' ),
+ 'desc' => __( 'Textarea description', 'wedevs' ),
+ 'placeholder' => __( 'Textarea placeholder', 'wedevs' ),
+ 'type' => 'textarea'
+ ),
+ array(
+ 'name' => 'html',
+ 'desc' => __( 'HTML area description. You can use any bold or other HTML elements.', 'wedevs' ),
+ 'type' => 'html'
+ ),
+ array(
+ 'name' => 'checkbox',
+ 'label' => __( 'Checkbox', 'wedevs' ),
+ 'desc' => __( 'Checkbox Label', 'wedevs' ),
+ 'type' => 'checkbox'
+ ),
+ array(
+ 'name' => 'radio',
+ 'label' => __( 'Radio Button', 'wedevs' ),
+ 'desc' => __( 'A radio button', 'wedevs' ),
+ 'type' => 'radio',
+ 'options' => array(
+ 'yes' => 'Yes',
+ 'no' => 'No'
+ )
+ ),
+ array(
+ 'name' => 'selectbox',
+ 'label' => __( 'A Dropdown', 'wedevs' ),
+ 'desc' => __( 'Dropdown description', 'wedevs' ),
+ 'type' => 'select',
+ 'default' => 'no',
+ 'options' => array(
+ 'yes' => 'Yes',
+ 'no' => 'No'
+ )
+ ),
+ array(
+ 'name' => 'password',
+ 'label' => __( 'Password', 'wedevs' ),
+ 'desc' => __( 'Password description', 'wedevs' ),
+ 'type' => 'password',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'file',
+ 'label' => __( 'File', 'wedevs' ),
+ 'desc' => __( 'File description', 'wedevs' ),
+ 'type' => 'file',
+ 'default' => '',
+ 'options' => array(
+ 'button_label' => 'Choose Image'
+ )
+ )
+ ),
+ 'wedevs_advanced' => array(
+ array(
+ 'name' => 'color',
+ 'label' => __( 'Color', 'wedevs' ),
+ 'desc' => __( 'Color description', 'wedevs' ),
+ 'type' => 'color',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'password',
+ 'label' => __( 'Password', 'wedevs' ),
+ 'desc' => __( 'Password description', 'wedevs' ),
+ 'type' => 'password',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'wysiwyg',
+ 'label' => __( 'Advanced Editor', 'wedevs' ),
+ 'desc' => __( 'WP_Editor description', 'wedevs' ),
+ 'type' => 'wysiwyg',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'multicheck',
+ 'label' => __( 'Multile checkbox', 'wedevs' ),
+ 'desc' => __( 'Multi checkbox description', 'wedevs' ),
+ 'type' => 'multicheck',
+ 'default' => array('one' => 'one', 'four' => 'four'),
+ 'options' => array(
+ 'one' => 'One',
+ 'two' => 'Two',
+ 'three' => 'Three',
+ 'four' => 'Four'
+ )
+ ),
+ )
+ );
+
+ return $settings_fields;
+ }
+
+ function plugin_page() {
+ echo '
';
+
+ $this->settings_api->show_navigation();
+ $this->settings_api->show_forms();
+
+ echo '
';
+ }
+
+ /**
+ * Get all the pages
+ *
+ * @return array page names with key value pairs
+ */
+ function get_pages() {
+ $pages = get_pages();
+ $pages_options = array();
+ if ( $pages ) {
+ foreach ($pages as $page) {
+ $pages_options[$page->ID] = $page->post_title;
+ }
+ }
+
+ return $pages_options;
+ }
+
+}
+endif;
diff --git a/example/procedural-example.php b/example/procedural-example.php
new file mode 100755
index 0000000..f72c1ac
--- /dev/null
+++ b/example/procedural-example.php
@@ -0,0 +1,297 @@
+
+ */
+
+
+/**
+ * Registers settings section and fields
+ */
+if ( !function_exists( 'wedevs_admin_init' ) ):
+ function wedevs_admin_init() {
+
+ $sections = array(
+ array(
+ 'id' => 'wedevs_basics',
+ 'title' => __( 'Basic Settings', 'wedevs' )
+ ),
+ array(
+ 'id' => 'wedevs_advanced',
+ 'title' => __( 'Advanced Settings', 'wedevs' )
+ ),
+ array(
+ 'id' => 'wedevs_others',
+ 'title' => __( 'Other Settings', 'wpuf' )
+ )
+ );
+
+ $fields = array(
+ 'wedevs_basics' => array(
+ array(
+ 'name' => 'text',
+ 'label' => __( 'Text Input', 'wedevs' ),
+ 'desc' => __( 'Text input description', 'wedevs' ),
+ 'type' => 'text',
+ 'default' => 'Title'
+ ),
+ array(
+ 'name' => 'textarea',
+ 'label' => __( 'Textarea Input', 'wedevs' ),
+ 'desc' => __( 'Textarea description', 'wedevs' ),
+ 'type' => 'textarea'
+ ),
+ array(
+ 'name' => 'checkbox',
+ 'label' => __( 'Checkbox', 'wedevs' ),
+ 'desc' => __( 'Checkbox Label', 'wedevs' ),
+ 'type' => 'checkbox'
+ ),
+ array(
+ 'name' => 'radio',
+ 'label' => __( 'Radio Button', 'wedevs' ),
+ 'desc' => __( 'A radio button', 'wedevs' ),
+ 'type' => 'radio',
+ 'options' => array(
+ 'yes' => 'Yes',
+ 'no' => 'No'
+ )
+ ),
+ array(
+ 'name' => 'multicheck',
+ 'label' => __( 'Multile checkbox', 'wedevs' ),
+ 'desc' => __( 'Multi checkbox description', 'wedevs' ),
+ 'type' => 'multicheck',
+ 'options' => array(
+ 'one' => 'One',
+ 'two' => 'Two',
+ 'three' => 'Three',
+ 'four' => 'Four'
+ )
+ ),
+ array(
+ 'name' => 'selectbox',
+ 'label' => __( 'A Dropdown', 'wedevs' ),
+ 'desc' => __( 'Dropdown description', 'wedevs' ),
+ 'type' => 'select',
+ 'default' => 'no',
+ 'options' => array(
+ 'yes' => 'Yes',
+ 'no' => 'No'
+ )
+ ),
+ array(
+ 'name' => 'password',
+ 'label' => __( 'Password', 'wedevs' ),
+ 'desc' => __( 'Password description', 'wedevs' ),
+ 'type' => 'password',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'file',
+ 'label' => __( 'File', 'wedevs' ),
+ 'desc' => __( 'File description', 'wedevs' ),
+ 'type' => 'file',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'color',
+ 'label' => __( 'Color', 'wedevs' ),
+ 'desc' => __( 'Color description', 'wedevs' ),
+ 'type' => 'color',
+ 'default' => ''
+ )
+ ),
+ 'wedevs_advanced' => array(
+ array(
+ 'name' => 'text',
+ 'label' => __( 'Text Input', 'wedevs' ),
+ 'desc' => __( 'Text input description', 'wedevs' ),
+ 'type' => 'text',
+ 'default' => 'Title'
+ ),
+ array(
+ 'name' => 'textarea',
+ 'label' => __( 'Textarea Input', 'wedevs' ),
+ 'desc' => __( 'Textarea description', 'wedevs' ),
+ 'type' => 'textarea'
+ ),
+ array(
+ 'name' => 'checkbox',
+ 'label' => __( 'Checkbox', 'wedevs' ),
+ 'desc' => __( 'Checkbox Label', 'wedevs' ),
+ 'type' => 'checkbox'
+ ),
+ array(
+ 'name' => 'radio',
+ 'label' => __( 'Radio Button', 'wedevs' ),
+ 'desc' => __( 'A radio button', 'wedevs' ),
+ 'type' => 'radio',
+ 'default' => 'no',
+ 'options' => array(
+ 'yes' => 'Yes',
+ 'no' => 'No'
+ )
+ ),
+ array(
+ 'name' => 'multicheck',
+ 'label' => __( 'Multile checkbox', 'wedevs' ),
+ 'desc' => __( 'Multi checkbox description', 'wedevs' ),
+ 'type' => 'multicheck',
+ 'default' => array( 'one' => 'one', 'four' => 'four' ),
+ 'options' => array(
+ 'one' => 'One',
+ 'two' => 'Two',
+ 'three' => 'Three',
+ 'four' => 'Four'
+ )
+ ),
+ array(
+ 'name' => 'selectbox',
+ 'label' => __( 'A Dropdown', 'wedevs' ),
+ 'desc' => __( 'Dropdown description', 'wedevs' ),
+ 'type' => 'select',
+ 'options' => array(
+ 'yes' => 'Yes',
+ 'no' => 'No'
+ )
+ ),
+ array(
+ 'name' => 'password',
+ 'label' => __( 'Password', 'wedevs' ),
+ 'desc' => __( 'Password description', 'wedevs' ),
+ 'type' => 'password',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'file',
+ 'label' => __( 'File', 'wedevs' ),
+ 'desc' => __( 'File description', 'wedevs' ),
+ 'type' => 'file',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'color',
+ 'label' => __( 'Color', 'wedevs' ),
+ 'desc' => __( 'Color description', 'wedevs' ),
+ 'type' => 'color',
+ 'default' => ''
+ )
+ ),
+ 'wedevs_others' => array(
+ array(
+ 'name' => 'text',
+ 'label' => __( 'Text Input', 'wedevs' ),
+ 'desc' => __( 'Text input description', 'wedevs' ),
+ 'type' => 'text',
+ 'default' => 'Title'
+ ),
+ array(
+ 'name' => 'textarea',
+ 'label' => __( 'Textarea Input', 'wedevs' ),
+ 'desc' => __( 'Textarea description', 'wedevs' ),
+ 'type' => 'textarea'
+ ),
+ array(
+ 'name' => 'checkbox',
+ 'label' => __( 'Checkbox', 'wedevs' ),
+ 'desc' => __( 'Checkbox Label', 'wedevs' ),
+ 'type' => 'checkbox'
+ ),
+ array(
+ 'name' => 'radio',
+ 'label' => __( 'Radio Button', 'wedevs' ),
+ 'desc' => __( 'A radio button', 'wedevs' ),
+ 'type' => 'radio',
+ 'options' => array(
+ 'yes' => 'Yes',
+ 'no' => 'No'
+ )
+ ),
+ array(
+ 'name' => 'multicheck',
+ 'label' => __( 'Multile checkbox', 'wedevs' ),
+ 'desc' => __( 'Multi checkbox description', 'wedevs' ),
+ 'type' => 'multicheck',
+ 'options' => array(
+ 'one' => 'One',
+ 'two' => 'Two',
+ 'three' => 'Three',
+ 'four' => 'Four'
+ )
+ ),
+ array(
+ 'name' => 'selectbox',
+ 'label' => __( 'A Dropdown', 'wedevs' ),
+ 'desc' => __( 'Dropdown description', 'wedevs' ),
+ 'type' => 'select',
+ 'options' => array(
+ 'yes' => 'Yes',
+ 'no' => 'No'
+ )
+ ),
+ array(
+ 'name' => 'password',
+ 'label' => __( 'Password', 'wedevs' ),
+ 'desc' => __( 'Password description', 'wedevs' ),
+ 'type' => 'password',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'file',
+ 'label' => __( 'File', 'wedevs' ),
+ 'desc' => __( 'File description', 'wedevs' ),
+ 'type' => 'file',
+ 'default' => ''
+ ),
+ array(
+ 'name' => 'color',
+ 'label' => __( 'Color', 'wedevs' ),
+ 'desc' => __( 'Color description', 'wedevs' ),
+ 'type' => 'color',
+ 'default' => ''
+ )
+ )
+ );
+
+ $settings_api = new WPGraphQL_Settings_API;
+
+ //set sections and fields
+ $settings_api->set_sections( $sections );
+ $settings_api->set_fields( $fields );
+
+ //initialize them
+ $settings_api->admin_init();
+ }
+endif;
+add_action( 'admin_init', 'wedevs_admin_init' );
+
+if ( !function_exists( 'wedevs_admin_menu' ) ):
+ /**
+ * Register the plugin page
+ */
+ function wedevs_admin_menu() {
+ add_options_page( 'Settings API', 'Settings API', 'delete_posts', 'settings_api_test', 'wedevs_plugin_page' );
+ }
+endif;
+add_action( 'admin_menu', 'wedevs_admin_menu' );
+
+/**
+ * Display the plugin settings options page
+ */
+if ( !function_exists( 'wedevs_plugin_page' ) ):
+ function wedevs_plugin_page() {
+ $settings_api = new WPGraphQL_Settings_API;
+
+ echo '';
+ settings_errors();
+
+ $settings_api->show_navigation();
+ $settings_api->show_forms();
+
+ echo '
';
+ }
+endif;
diff --git a/plugin.php b/plugin.php
new file mode 100644
index 0000000..02d5ef2
--- /dev/null
+++ b/plugin.php
@@ -0,0 +1,14 @@
+
+ * @link https://tareq.co Tareq Hasan
+ * @example example/oop-example.php How to use the class
+ */
+if ( !class_exists( 'WPGraphQL_Settings_API' ) ):
+class WPGraphQL_Settings_API {
+
+ /**
+ * settings sections array
+ *
+ * @var array
+ */
+ protected $settings_sections = array();
+
+ /**
+ * Settings fields array
+ *
+ * @var array
+ */
+ protected $settings_fields = array();
+
+ public function __construct() {
+ add_action( 'admin_enqueue_scripts', array( $this, 'admin_enqueue_scripts' ) );
+ }
+
+ /**
+ * Enqueue scripts and styles
+ */
+ function admin_enqueue_scripts() {
+ wp_enqueue_style( 'wp-color-picker' );
+
+ wp_enqueue_media();
+ wp_enqueue_script( 'wp-color-picker' );
+ wp_enqueue_script( 'jquery' );
+ }
+
+ /**
+ * Set settings sections
+ *
+ * @param array $sections setting sections array
+ */
+ function set_sections( $sections ) {
+ $this->settings_sections = $sections;
+
+ return $this;
+ }
+
+ /**
+ * Add a single section
+ *
+ * @param array $section
+ */
+ function add_section( $section ) {
+ $this->settings_sections[] = $section;
+
+ return $this;
+ }
+
+ /**
+ * Set settings fields
+ *
+ * @param array $fields settings fields array
+ */
+ 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;
+ }
+
+ /**
+ * Initialize and registers the settings sections and fileds to WordPress
+ *
+ * Usually this should be called at `admin_init` hook.
+ *
+ * This function gets the initiated settings sections and fields. Then
+ * registers them to WordPress and ready for use.
+ */
+ function admin_init() {
+ //register settings sections
+ foreach ( $this->settings_sections as $section ) {
+ if ( false == get_option( $section['id'] ) ) {
+ add_option( $section['id'] );
+ }
+
+ if ( isset($section['desc']) && !empty($section['desc']) ) {
+ $section['desc'] = '' . $section['desc'] . '
';
+ $callback = function() use ( $section ) {
+ echo str_replace( '"', '\"', $section['desc'] );
+ };
+ } else if ( isset( $section['callback'] ) ) {
+ $callback = $section['callback'];
+ } else {
+ $callback = null;
+ }
+
+ add_settings_section( $section['id'], $section['title'], $callback, $section['id'] );
+ }
+
+ //register settings fields
+ foreach ( $this->settings_fields as $section => $field ) {
+ foreach ( $field as $option ) {
+
+ $name = $option['name'];
+ $type = isset( $option['type'] ) ? $option['type'] : 'text';
+ $label = isset( $option['label'] ) ? $option['label'] : '';
+ $callback = isset( $option['callback'] ) ? $option['callback'] : array( $this, 'callback_' . $type );
+
+ $args = array(
+ 'id' => $name,
+ 'class' => isset( $option['class'] ) ? $option['class'] : $name,
+ 'label_for' => "{$section}[{$name}]",
+ 'desc' => isset( $option['desc'] ) ? $option['desc'] : '',
+ 'name' => $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,
+ 'placeholder' => isset( $option['placeholder'] ) ? $option['placeholder'] : '',
+ 'min' => isset( $option['min'] ) ? $option['min'] : '',
+ 'max' => isset( $option['max'] ) ? $option['max'] : '',
+ 'step' => isset( $option['step'] ) ? $option['step'] : '',
+ );
+
+ add_settings_field( "{$section}[{$name}]", $label, $callback, $section, $section, $args );
+ }
+ }
+
+ // creates our settings in the options table
+ foreach ( $this->settings_sections as $section ) {
+ register_setting( $section['id'], $section['id'], array( $this, 'sanitize_options' ) );
+ }
+ }
+
+ /**
+ * Get field description for display
+ *
+ * @param array $args settings field args
+ */
+ public function get_field_description( $args ) {
+ if ( ! empty( $args['desc'] ) ) {
+ $desc = sprintf( '%s
', $args['desc'] );
+ } else {
+ $desc = '';
+ }
+
+ return $desc;
+ }
+
+ /**
+ * Displays a text field for a settings field
+ *
+ * @param array $args settings field args
+ */
+ 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';
+ $placeholder = empty( $args['placeholder'] ) ? '' : ' placeholder="' . $args['placeholder'] . '"';
+
+ $html = sprintf( ' ', $type, $size, $args['section'], $args['id'], $value, $placeholder );
+ $html .= $this->get_field_description( $args );
+
+ echo $html;
+ }
+
+ /**
+ * Displays a url field for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_url( $args ) {
+ $this->callback_text( $args );
+ }
+
+ /**
+ * Displays a number field for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_number( $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'] : 'number';
+ $placeholder = empty( $args['placeholder'] ) ? '' : ' placeholder="' . $args['placeholder'] . '"';
+ $min = ( $args['min'] == '' ) ? '' : ' min="' . $args['min'] . '"';
+ $max = ( $args['max'] == '' ) ? '' : ' max="' . $args['max'] . '"';
+ $step = ( $args['step'] == '' ) ? '' : ' step="' . $args['step'] . '"';
+
+ $html = sprintf( ' ', $type, $size, $args['section'], $args['id'], $value, $placeholder, $min, $max, $step );
+ $html .= $this->get_field_description( $args );
+
+ echo $html;
+ }
+
+ /**
+ * Displays a checkbox for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_checkbox( $args ) {
+
+ $value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
+
+ $html = '';
+ $html .= sprintf( '', $args['section'], $args['id'] );
+ $html .= sprintf( ' ', $args['section'], $args['id'] );
+ $html .= sprintf( ' ', $args['section'], $args['id'], checked( $value, 'on', false ) );
+ $html .= sprintf( '%1$s ', $args['desc'] );
+ $html .= ' ';
+
+ echo $html;
+ }
+
+ /**
+ * Displays a multicheckbox for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_multicheck( $args ) {
+
+ $value = $this->get_option( $args['id'], $args['section'], $args['std'] );
+ $html = '';
+ $html .= sprintf( ' ', $args['section'], $args['id'] );
+ foreach ( $args['options'] as $key => $label ) {
+ $checked = isset( $value[$key] ) ? $value[$key] : '0';
+ $html .= sprintf( '', $args['section'], $args['id'], $key );
+ $html .= sprintf( ' ', $args['section'], $args['id'], $key, checked( $checked, $key, false ) );
+ $html .= sprintf( '%1$s ', $label );
+ }
+
+ $html .= $this->get_field_description( $args );
+ $html .= ' ';
+
+ echo $html;
+ }
+
+ /**
+ * Displays a radio button for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_radio( $args ) {
+
+ $value = $this->get_option( $args['id'], $args['section'], $args['std'] );
+ $html = '';
+
+ foreach ( $args['options'] as $key => $label ) {
+ $html .= sprintf( '', $args['section'], $args['id'], $key );
+ $html .= sprintf( ' ', $args['section'], $args['id'], $key, checked( $value, $key, false ) );
+ $html .= sprintf( '%1$s ', $label );
+ }
+
+ $html .= $this->get_field_description( $args );
+ $html .= ' ';
+
+ echo $html;
+ }
+
+ /**
+ * Displays a selectbox for a settings field
+ *
+ * @param array $args settings field args
+ */
+ 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( '', $size, $args['section'], $args['id'] );
+
+ foreach ( $args['options'] as $key => $label ) {
+ $html .= sprintf( '%s ', $key, selected( $value, $key, false ), $label );
+ }
+
+ $html .= sprintf( ' ' );
+ $html .= $this->get_field_description( $args );
+
+ echo $html;
+ }
+
+ /**
+ * Displays a textarea for a settings field
+ *
+ * @param array $args settings field args
+ */
+ 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';
+ $placeholder = empty( $args['placeholder'] ) ? '' : ' placeholder="'.$args['placeholder'].'"';
+
+ $html = sprintf( '', $size, $args['section'], $args['id'], $placeholder, $value );
+ $html .= $this->get_field_description( $args );
+
+ echo $html;
+ }
+
+ /**
+ * Displays the html for a settings field
+ *
+ * @param array $args settings field args
+ * @return string
+ */
+ function callback_html( $args ) {
+ echo $this->get_field_description( $args );
+ }
+
+ /**
+ * Displays a rich text textarea for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_wysiwyg( $args ) {
+
+ $value = $this->get_option( $args['id'], $args['section'], $args['std'] );
+ $size = isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : '500px';
+
+ echo '';
+
+ $editor_settings = array(
+ 'teeny' => true,
+ 'textarea_name' => $args['section'] . '[' . $args['id'] . ']',
+ 'textarea_rows' => 10
+ );
+
+ if ( isset( $args['options'] ) && is_array( $args['options'] ) ) {
+ $editor_settings = array_merge( $editor_settings, $args['options'] );
+ }
+
+ wp_editor( $value, $args['section'] . '-' . $args['id'], $editor_settings );
+
+ echo '
';
+
+ echo $this->get_field_description( $args );
+ }
+
+ /**
+ * Displays a file upload field for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_file( $args ) {
+
+ $value = esc_attr( $this->get_option( $args['id'], $args['section'], $args['std'] ) );
+ $size = isset( $args['size'] ) && !is_null( $args['size'] ) ? $args['size'] : 'regular';
+ $id = $args['section'] . '[' . $args['id'] . ']';
+ $label = isset( $args['options']['button_label'] ) ? $args['options']['button_label'] : __( 'Choose File' );
+
+ $html = sprintf( ' ', $size, $args['section'], $args['id'], $value );
+ $html .= ' ';
+ $html .= $this->get_field_description( $args );
+
+ echo $html;
+ }
+
+ /**
+ * Displays a password field for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_password( $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( ' ', $size, $args['section'], $args['id'], $value );
+ $html .= $this->get_field_description( $args );
+
+ echo $html;
+ }
+
+ /**
+ * Displays a color picker field for a settings field
+ *
+ * @param array $args settings field args
+ */
+ function callback_color( $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( ' ', $size, $args['section'], $args['id'], $value, $args['std'] );
+ $html .= $this->get_field_description( $args );
+
+ echo $html;
+ }
+
+
+ /**
+ * Displays a select box for creating the pages select box
+ *
+ * @param array $args settings field args
+ */
+ function callback_pages( $args ) {
+
+ $dropdown_args = array(
+ 'selected' => esc_attr($this->get_option($args['id'], $args['section'], $args['std'] ) ),
+ 'name' => $args['section'] . '[' . $args['id'] . ']',
+ 'id' => $args['section'] . '[' . $args['id'] . ']',
+ 'echo' => 0
+ );
+ $html = wp_dropdown_pages( $dropdown_args );
+ echo $html;
+ }
+
+ /**
+ * Sanitize callback for Settings API
+ *
+ * @return mixed
+ */
+ function sanitize_options( $options ) {
+
+ if ( !$options ) {
+ return $options;
+ }
+
+ foreach( $options as $option_slug => $option_value ) {
+ $sanitize_callback = $this->get_sanitize_callback( $option_slug );
+
+ // If callback is set, call it
+ if ( $sanitize_callback ) {
+ $options[ $option_slug ] = call_user_func( $sanitize_callback, $option_value );
+ continue;
+ }
+ }
+
+ return $options;
+ }
+
+ /**
+ * Get sanitization callback for given option slug
+ *
+ * @param string $slug option slug
+ *
+ * @return mixed string or bool false
+ */
+ function get_sanitize_callback( $slug = '' ) {
+ if ( empty( $slug ) ) {
+ return false;
+ }
+
+ // Iterate over registered fields and see if we can find proper callback
+ foreach( $this->settings_fields as $section => $options ) {
+ foreach ( $options as $option ) {
+ if ( $option['name'] != $slug ) {
+ continue;
+ }
+
+ // Return the callback name
+ return isset( $option['sanitize_callback'] ) && is_callable( $option['sanitize_callback'] ) ? $option['sanitize_callback'] : false;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Get the value of a settings field
+ *
+ * @param string $option settings field name
+ * @param string $section the section name this field belongs to
+ * @param string $default default text if it's not found
+ * @return string
+ */
+ function get_option( $option, $section, $default = '' ) {
+
+ $options = get_option( $section );
+
+ if ( isset( $options[$option] ) ) {
+ return $options[$option];
+ }
+
+ return $default;
+ }
+
+ /**
+ * Show navigations as tab
+ *
+ * Shows all the settings section labels as tab
+ */
+ function show_navigation() {
+ $html = '';
+
+ $count = count( $this->settings_sections );
+
+ // don't show the navigation if only one section exists
+ if ( $count === 1 ) {
+ return;
+ }
+
+ foreach ( $this->settings_sections as $tab ) {
+ $html .= sprintf( '%2$s ', $tab['id'], $tab['title'] );
+ }
+
+ $html .= ' ';
+
+ echo $html;
+ }
+
+ /**
+ * Show the section settings forms
+ *
+ * This function displays every sections in a different form
+ */
+ function show_forms() {
+ ?>
+
+ script();
+ }
+
+ /**
+ * Tabbable JavaScript codes & Initiate Color Picker
+ *
+ * This code uses localstorage for displaying active tabs
+ */
+ function script() {
+ ?>
+
+ _style_fix();
+ }
+
+ function _style_fix() {
+ global $wp_version;
+
+ if (version_compare($wp_version, '3.8', '<=')):
+ ?>
+
+