Title: Plugin Dev: Using Settings API with class
Last modified: August 19, 2016

---

# Plugin Dev: Using Settings API with class

 *  [digitaldonkey](https://wordpress.org/support/users/digitaldonkey/)
 * (@digitaldonkey)
 * [15 years, 6 months ago](https://wordpress.org/support/topic/plugin-dev-using-settings-api-with-class/)
 * After a loooong session I finally go the Settings-Api working with a class.
    
   Maybe it’s usefull for Plugin Developers who wanna use the Settings API.
 * Comments Welcome 🙂
    _[Code moderated as per the [Forum Rules](http://codex.wordpress.org/Forum_Welcome).
   Please use the [pastebin](http://wordpress.pastebin.com)]_

Viewing 6 replies - 1 through 6 (of 6 total)

 *  [ilightning](https://wordpress.org/support/users/ilightning/)
 * (@ilightning)
 * [15 years, 6 months ago](https://wordpress.org/support/topic/plugin-dev-using-settings-api-with-class/#post-1761590)
 * thanks d-monkey. Do you know of a way to pass a variable into the function called‘
   admin_display_settings’ above? Working toward a similar approach for theme development
   but it’s not objected oriented at the moment. I’m just looping through a multidimensional
   array I built to create the needed admin pages.
 * Thanks!
 *  [ilightning](https://wordpress.org/support/users/ilightning/)
 * (@ilightning)
 * [15 years, 6 months ago](https://wordpress.org/support/topic/plugin-dev-using-settings-api-with-class/#post-1761604)
 * whoops, meant d-donkey. Hopefully you can get that class uploaded, I was just
   coming back to take a closer look =)
 *  Thread Starter [digitaldonkey](https://wordpress.org/support/users/digitaldonkey/)
 * (@digitaldonkey)
 * [15 years, 6 months ago](https://wordpress.org/support/topic/plugin-dev-using-settings-api-with-class/#post-1761606)
 * I don’t know which rules I violated, but I pasted the code here and I don’t know
   wehere else.
 * [@moderator](https://wordpress.org/support/users/moderator/): I posted code here
   to enable seraching for the functions-names please dont REMOVE it, but MOVE it!
   Next time I’ll use the pastbim, but I didn’t know about yet.
 * [@ilightning](https://wordpress.org/support/users/ilightning/): I don’t have 
   it anymore (thats why I posted it here … ). Please ask the Moderator.
 *  [HelgaTheViking](https://wordpress.org/support/users/helgatheviking/)
 * (@helgatheviking)
 * [15 years, 5 months ago](https://wordpress.org/support/topic/plugin-dev-using-settings-api-with-class/#post-1761652)
 * So you now longer have this code? Damn, it sounded like exactly what i need to
   integrate the settings API into my theme options
 *  Thread Starter [digitaldonkey](https://wordpress.org/support/users/digitaldonkey/)
 * (@digitaldonkey)
 * [15 years, 5 months ago](https://wordpress.org/support/topic/plugin-dev-using-settings-api-with-class/#post-1761653)
 * Sorry, can’t find the published Version, but it’s about the following. Would 
   be nice if the Anonymus moderator who deleted it can show where he put it.
 * You can see the code and the implementation in the loaded classes at the [wpg3-git](https://github.com/digitaldonkey/wpg3/blob/master/wpg3.php)
 * It’s about this:
 *     ```
       /**
          *   Options Page and Input Validation for WPG3-Modules
          *
          *   Depends on WP-Settings Api
          *
          *    {@source}
          *
         **/
         public function wpg3_admin_init()
         {
           global $wp_rewrite;
   
           // MODULES register their options here
           $modules = array($this->get_module() );
           if($this->is_enabled){
   
             $xhttp = $this->get_module_instance('WPG3_Xhttp');
             array_push($modules, $xhttp->admin_init() );
   
             $template = $this->get_module_instance('WPG3_Template');
             array_push($modules, $template->admin_init() );
             /*
             $imagechoser = $this->get_module_instance('WPG3_Imagechoser');
             array_push($modules, $imagechoser->admin_init() );
             */
             if ( $wp_rewrite->using_permalinks() ){
               $gallerypage = $this->get_module_instance('WPG3_Rewrite');
               array_push($modules, $gallerypage->admin_init() );
             }
           }
   
           register_setting(
             'wpg3_options_grp', // settings group
             'wpg3_options', // settings
             array(&$this,'admin_validate_options') // fn to validate input
             );
           $page = 'wpg3_options_page';
   
           // load Settings API
           if (!function_exists('add_settings_section')){
             require_once(ABSPATH.'wp-admin/includes/template.php');
           }
           /* stores validation functions */
           $this->validate_fields = array();
           //  setting Option sections and fields
           foreach( $modules as $module){
             if ( $module ){
               add_settings_section( $module['unique_name'], $module['title'], $module['function'], $page);
               if( isset($module['settings_fields']) ){
                 foreach($module['settings_fields'] as $field){
                  add_settings_field($field['field_id'], $field['field_title'], $field['field_display'], $page, $module['unique_name']);
                  if( isset($field['field_validate']) )$this->validate_fields[ $field['field_id'] ] = $field['field_validate'];
                 }
               }
             }
           }
         }
   
       /**
         *   get a module instance, load if required
         *
         *   {@source}
         *
         *   @param string Classname
         *   @return object instance
        **/
         public function get_module_instance($module, $override_options = false){
           $return = false;
           if (isset($this->modules[$module]) and !$override_options){
             $return = $this->modules[$module];
           }else{
             if (! isset($this->modules[$module])) $this->__autoload( $module );
             if ( $override_options){
               $this->wpg3_options = $override_options;
             }
             $instance = new $module( $this->wpg3_options );
             $this->modules[$module] = $instance;
             $return = $instance;
           }
          return $return;
         }
   
       /**
         *   Create Options Page for WPG3
         *   @internal
        **/
         public function admin_add_page()
         {
           add_options_page(__('WPG3 Settings'),
                            __('WPG3'),
                            'manage_options',
                            __('WPG3'),
                            array(&$this,'admin_optins_page_fn')
                            );
         }
   
       /**
         *   Echo Option Page
         *   @internal
        **/
         public function admin_optins_page_fn()
         {
           //echo "This is the admin_optins_page() ";
           echo "\n<div>\n";
           echo '<h2>'.__('WPG3 Settings')."</h2>\n";
           echo '<form action="options.php" method="post">'."\n";
           settings_fields('wpg3_options_grp'); // Group Name
           echo "\n";
           do_settings_sections('wpg3_options_page');
           echo "\n";
           echo '<p><input name="Submit" type="submit" value="'. __('Save Changes').'" /></p>'."\n";
           echo "</form>\n</div>\n";
         }
   
       /**
         *   Validate Option Fields
         *
         *   @param array WP-secured Input from $_POST
         *   @return array Input validated
        **/
         public function admin_validate_options($input)
         {
           $wpg3_options = $this->wpg3_options;
   
           $validatable = array_intersect_key( $this->validate_fields,  $input);
   
           foreach ($validatable as $field => $function){
             $val = call_user_func ($function, $input[$field]);
             if( $val) $wpg3_options[$field] = $val;
          }
           return $wpg3_options;
         }		
   
       /**
        *  Every Module can provide its own Options or return "false"
        *
       **/
         private function get_module(){
            $main_mudule = array(
                       // unique section ID
                       'unique_name' =>'main_options',
                       // visible Section Title
                       'title' => __('Basic WPG3 Options'),
                       // callback_fn displaying the Settings
                       'function' => array( $this , 'admin_options_section_display' ),
                       // FIELDS
                       'settings_fields' => array(
                                               array(
                                               // unique ID
                                               'field_id' => 'g3Url',
                                               // field TITLE text
                                               'field_title' => __('Gallery3 Url'),
                                               // function CALLBACK, to display the input box
                                               'field_display' => array( $this , 'admin_options_section_display_g3Url'),
                                               // function CALLBACK validate field
                                               'field_validate' => array( $this , 'admin_options_section_validate_g3Url')
                                              ),
                                               array(
                                               // unique ID
                                               'field_id' => 'g3Resize',
                                               // field TITLE text
                                               'field_title' => __('Resize Options'),
                                               // function CALLBACK, to display the input box
                                               'field_display' => array( $this , 'admin_options_section_display_g3Resize'),
                                               // function CALLBACK validate field
                                               'field_validate' => array( $this , 'admin_options_section_validate_g3Resize')
                                              )
                                      )
                 );
           return $main_mudule;
         }
   
       /**
        *  Section Header for Options Page
        *
       **/
         public function admin_options_section_display()
         {?>
           <div style="width: 600px; margin-left: 10px;">
   
           <p>
              You must enable REST-Module in Gallery3 in Order to use WPG3.
           </p>
           </div>
   
       <?php }
   
       /**
        *  Options Page Output for "g3Resize"
        *
        *  @todo Pass the Width-param from WPG3-Tag to Template
       **/
         public function admin_options_section_display_g3Resize()
         {
           $options = $this->wpg3_options; 
   
           $field_id = 'g3Resize';
           $val = isset($options[$field_id])? $options[$field_id] : array('max_thumb' => 100, 'max_resize' => 300) ;
           ?>
           <p style = "width:600px;">Gallery 2 <strong>offered custom Resizes</strong>. Gallery3 not yet.<br />
              You can chose which reize to use in WPG3 for the width parameter in WPGX-Tags<br />
              <strong>Note:</strong><em> The Numbered width paramater is available in the Template to adjust width by CSS.</em>
           </p>
           <table >
             <tr>
               <td style = "text-align: right;">Max pixel width<br />to use Thumb</td>
             <?php
               echo '<td><input id="'.$field_id.'[max_thumb]" name="wpg3_options['.$field_id.'][max_thumb]" size="10" type="text" value="'.$val['max_thumb'].'" /> px</td>'."\n";
               echo '<td style = "text-align: center;">Max pixel width<br />to use Medium</td>';
               echo '<td><input id="'.$field_id.'[max_resize]" name="wpg3_options['.$field_id.'][max_resize]" size="10" type="text" value="'.$val['max_resize'].'" /> px</td>'."\n";
             ?>
             <td>For higher width values<br />we use the Fullsize Image</td>
           </tr>
          </table>
          <p>According to this settings WPG3 will chose the
          'thumb', 'resize' or 'full' G3-Image to be inserted for a width parameter</p>
       <?php
         }
   
       /**
        *  Validation Page Validation for "g3Resize"
        *
       **/
         public function admin_options_section_validate_g3Resize($field_val)
         {
          $return = isset($this->wpg3_options['g3Resize']) ? $this->wpg3_options['g3Resize'] : array('max_thumb' => 60, 'max_resize' => 500 );
           if ( is_array($field_val)){
   
             if ( intval( $field_val['max_thumb']) > 0  and intval( $field_val['max_resize'] ) > $field_val['max_thumb']){
               $return['max_thumb'] = $field_val['max_thumb'];
             }else{
             add_settings_error('g3Resize',
                                'settings_updated',
                                __('The Thumb width must be lower than the Medium width @ g3Resize<br /> You entered:<br /> max_thumb = '.$field_val['max_thumb'].'px<br />max_resize = '.$field_val['max_resize'].'px'));
             }
             if ( intval( $field_val['max_resize']) > 0 and $field_val['max_resize'] > $return['max_thumb'] ){
              $return['max_resize'] = $field_val['max_resize'];
             }
           }
           return $return;
         }
   
       /**
        *  Options Page Output for "g3Url"
        *
       **/
         public function admin_options_section_display_g3Url()
         { $field_id = 'g3Url';
           $options = $this->wpg3_options; // we should use data of $this !! ?>
           <p>The Url of you Gallery3 installation
              e.g. <strong>http://wpg3.local/gallery3/index.php</strong>
           </p>
           <?php
           $val = isset($options[$field_id])?$options[$field_id]:get_bloginfo('url').'/gallery3/index.php';
           !$this->is_enabled ? $enabled = ' style="color: red;" ': $enabled ='';
           echo '<input id="'.$field_id.'" name="wpg3_options['.$field_id.']" '.$enabled.'size="60" type="text" value="'.$val.'" />'."\n";
         }
   
       /**
        *  Validate field "restReqestKey"
        *
        *  @todo validate g3Url against REST
       **/
         public function admin_options_section_validate_g3Url($field_val)
         {
           $return = false;
           // validate input
           if ( preg_match('#^http\\:\\/\\/[a-z0-9\-]+\.([a-z0-9\-]+\.)?[a-z]+#i', $field_val)){
               if( substr( $field_val, -1 ) === "/" ) $field_val = substr ( $field_val, 0 , -1 );
               // unset REST API Key
               unset($this->wpg3_options['restReqestKey']);
               $return = $field_val;
           }else{
             // create a nice Error including you field_id
             add_settings_error('g3Url',
                                'settings_updated',
                                __('A valid Gallery3 Url is required @ g3Url<br /> You entered: "'.$field_val.'"'));
           }
           return $return;
         }
   
         private function __autoload($class_name) {
           include 'wpg3_class_'.$class_name . '.php';
         }
       /**
        *  Get WPG3 Options
        *  @return array wpg3_options
       **/
       	public function get_options() {
           return $this->wpg3_options;
         }
       /**
        *  WPG3 enabled?
        *  @return bool true/false
       **/
         public function is_enabled($type){
           $return = false;
           if (isset($this->wpg3_options[$type]) and $this->wpg3_options[$type] == "enabled") $return = true;
           return $return;
         }
   
       }// END class WPG3_Main
   
       	add_action('init', array(&$wpg3, 'wpg3_init') );
       	add_action('admin_init', array(&$wpg3, 'wpg3_admin_init') );
          /* Add options Page */
           add_action('admin_menu', array(&$wpg3, 'admin_add_page') );
         if($wpg3->is_enabled){
           add_filter('the_content', array(&$wpg3, 'wpg3_content_callback') );
        }
       ```
   
 *  [HelgaTheViking](https://wordpress.org/support/users/helgatheviking/)
 * (@helgatheviking)
 * [15 years, 5 months ago](https://wordpress.org/support/topic/plugin-dev-using-settings-api-with-class/#post-1761654)
 * thanks for posting this!

Viewing 6 replies - 1 through 6 (of 6 total)

The topic ‘Plugin Dev: Using Settings API with class’ is closed to new replies.

## Tags

 * [add_options_page](https://wordpress.org/support/topic-tag/add_options_page/)
 * [class](https://wordpress.org/support/topic-tag/class/)

 * In: [Fixing WordPress](https://wordpress.org/support/forum/how-to-and-troubleshooting/)
 * 6 replies
 * 3 participants
 * Last reply from: [HelgaTheViking](https://wordpress.org/support/users/helgatheviking/)
 * Last activity: [15 years, 5 months ago](https://wordpress.org/support/topic/plugin-dev-using-settings-api-with-class/#post-1761654)
 * Status: not resolved

## Topics

### Topics with no replies

### Non-support topics

### Resolved topics

### Unresolved topics

### All topics
