settings = apply_filters( 'cs_framework_settings', $settings ); $this->options = apply_filters( 'cs_framework_options', $options ); if( ! empty( $this->options ) ) { $this->sections = $this->get_sections(); $this->get_option = get_option( CS_OPTION ); $this->addAction( 'admin_init', 'settings_api' ); $this->addAction( 'admin_menu', 'admin_menu' ); $this->addAction( 'wp_ajax_cs-export-options', 'export' ); } } // instance public static function instance( $settings = array(), $options = array() ) { if ( is_null( self::$instance ) && CS_ACTIVE_FRAMEWORK ) { self::$instance = new self( $settings, $options ); } return self::$instance; } // get sections public function get_sections() { $sections = array(); foreach ( $this->options as $key => $value ) { if( isset( $value['sections'] ) ) { foreach ( $value['sections'] as $section ) { if( isset( $section['fields'] ) ) { $sections[] = $section; } } } else { if( isset( $value['fields'] ) ) { $sections[] = $value; } } } return $sections; } // wp settings api public function settings_api() { $defaults = array(); foreach( $this->sections as $section ) { register_setting( $this->unique .'_group', $this->unique, array( &$this,'validate_save' ) ); if( isset( $section['fields'] ) ) { add_settings_section( $section['name'] .'_section', $section['title'], '', $section['name'] .'_section_group' ); foreach( $section['fields'] as $field_key => $field ) { add_settings_field( $field_key .'_field', '', array( &$this, 'field_callback' ), $section['name'] .'_section_group', $section['name'] .'_section', $field ); // set default option if isset if( isset( $field['default'] ) ) { $defaults[$field['id']] = $field['default']; if( ! empty( $this->get_option ) && ! isset( $this->get_option[$field['id']] ) ) { $this->get_option[$field['id']] = $field['default']; } } } } } // set default variable if empty options and not empty defaults if( empty( $this->get_option ) && ! empty( $defaults ) ) { update_option( $this->unique, $defaults ); $this->get_option = $defaults; } } // section fields validate in save public function validate_save( $request ) { $add_errors = array(); $section_id = ( isset( $_POST['cs_section_id'] ) ) ? $_POST['cs_section_id'] : ''; // ignore nonce requests if( isset( $request['_nonce'] ) ) { unset( $request['_nonce'] ); } // import if ( isset( $request['import'] ) && ! empty( $request['import'] ) ) { $decode_string = cs_decode_string( $request['import'] ); if( is_array( $decode_string ) ) { return $decode_string; } $add_errors[] = $this->add_settings_error( __( 'Success. Imported backup options.', 'cs-framework' ), 'updated' ); } // reset all options if ( isset( $request['resetall'] ) ) { $add_errors[] = $this->add_settings_error( __( 'Default options restored.', 'cs-framework' ), 'updated' ); return; } // reset only section if ( isset( $request['reset'] ) && ! empty( $section_id ) ) { foreach ( $this->sections as $value ) { if( $value['name'] == $section_id ) { foreach ( $value['fields'] as $field ) { if( isset( $field['id'] ) ) { if( isset( $field['default'] ) ) { $request[$field['id']] = $field['default']; } else { unset( $request[$field['id']] ); } } } } } $add_errors[] = $this->add_settings_error( __( 'Default options restored for only this section.', 'cs-framework' ), 'updated' ); } // option sanitize and validate foreach( $this->sections as $section ) { if( isset( $section['fields'] ) ) { foreach( $section['fields'] as $field ) { // ignore santize and validate if element multilangual if ( isset( $field['type'] ) && ! isset( $field['multilang'] ) && isset( $field['id'] ) ) { // sanitize options $request_value = isset( $request[$field['id']] ) ? $request[$field['id']] : ''; $sanitize_type = $field['type']; if( isset( $field['sanitize'] ) ) { $sanitize_type = ( $field['sanitize'] !== false ) ? $field['sanitize'] : false; } if( $sanitize_type !== false && has_filter( 'cs_sanitize_'. $sanitize_type ) ) { $request[$field['id']] = apply_filters( 'cs_sanitize_' . $sanitize_type, $request_value, $field, $section['fields'] ); } // validate options if ( isset( $field['validate'] ) && has_filter( 'cs_validate_'. $field['validate'] ) ) { $validate = apply_filters( 'cs_validate_' . $field['validate'], $request_value, $field, $section['fields'] ); if( ! empty( $validate ) ) { $add_errors[] = $this->add_settings_error( $validate, 'error', $field['id'] ); $request[$field['id']] = ( isset( $this->get_option[$field['id']] ) ) ? $this->get_option[$field['id']] : ''; } } } if( ! isset( $field['id'] ) || empty( $request[$field['id']] ) ) { continue; } } } } $request = apply_filters( 'cs_validate_save', $request ); // set transient $transient_time = ( cs_language_defaults() !== false ) ? 30 : 10; set_transient( 'cs-framework-transient', array( 'errors' => $add_errors, 'section_id' => $section_id ), $transient_time ); return $request; } // field callback classes public function field_callback( $field ) { $value = ( isset( $field['id'] ) && isset( $this->get_option[$field['id']] ) ) ? $this->get_option[$field['id']] : ''; echo cs_add_element( $field, $value, $this->unique ); } // settings sections public function do_settings_sections( $page ) { global $wp_settings_sections, $wp_settings_fields; if ( ! isset( $wp_settings_sections[$page] ) ){ return; } foreach ( $wp_settings_sections[$page] as $section ) { if ( $section['callback'] ){ call_user_func( $section['callback'], $section ); } if ( ! isset( $wp_settings_fields ) || !isset( $wp_settings_fields[$page] ) || !isset( $wp_settings_fields[$page][$section['id']] ) ){ continue; } $this->do_settings_fields( $page, $section['id'] ); } } // settings fields public function do_settings_fields( $page, $section ) { global $wp_settings_fields; if ( ! isset( $wp_settings_fields[$page][$section] ) ) { return; } foreach ( $wp_settings_fields[$page][$section] as $field ) { call_user_func($field['callback'], $field['args']); } } public function add_settings_error( $message, $type = 'error', $id = 'global' ) { return array( 'setting' => 'cs-errors', 'code' => $id, 'message' => $message, 'type' => $type ); } // adding option page public function admin_menu() { $defaults_menu_args = array( 'menu_parent' => '', 'menu_title' => '', 'menu_type' => '', 'menu_slug' => '', 'menu_icon' => '', 'menu_capability' => 'manage_options', 'menu_position' => null, ); $args = wp_parse_args( $this->settings, $defaults_menu_args ); if( $args['menu_type'] == 'add_theme_page' ) { call_user_func( $args['menu_type'], $args['menu_title'], $args['menu_title'], $args['menu_capability'], $args['menu_slug'], array( &$this, 'admin_page' ), $args['menu_icon'], $args['menu_position'] ); } else { call_user_func( $args['menu_type'], $args['menu_parent'], $args['menu_title'], $args['menu_title'], $args['menu_capability'], $args['menu_slug'], array( &$this, 'admin_page' ) ); } } // option page html output public function admin_page() { $transient = get_transient( 'cs-framework-transient' ); $has_nav = ( count( $this->options ) <= 1 ) ? ' cs-show-all' : ''; $section_id = ( ! empty( $transient['section_id'] ) ) ? $transient['section_id'] : $this->sections[0]['name']; $section_id = ( isset( $_GET['cs-section'] ) ) ? esc_attr( $_GET['cs-section'] ) : $section_id; echo '