Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple settings Wordpress Options Page plugin

Tags:

wordpress

I want to make an Options page with multiple settings for my plugin. I want to use this code as a start: http://codex.wordpress.org/Creating_Options_Pages#Example_.232

<?php
class wctest{
    public function __construct(){
        if(is_admin()){
            add_action('admin_menu', array($this, 'add_plugin_page'));
            add_action('admin_init', array($this, 'page_init'));
        }
    }

    public function add_plugin_page(){
        // This page will be under "Settings"
        add_options_page('Settings Admin', 'Settings', 'manage_options', 'test-setting-admin', array($this, 'create_admin_page'));
    }

    public function create_admin_page(){
    ?>
    <div class="wrap">
        <?php screen_icon(); ?>
        <h2>Settings</h2>           
        <form method="post" action="options.php">
            <?php
                    // This prints out all hidden setting fields
            settings_fields('test_option_group');   
            do_settings_sections('test-setting-admin');
        ?>
            <?php submit_button(); ?>
        </form>
    </div>
    <?php
    }

    public function page_init(){        
        register_setting('test_option_group', 'array_key', array($this, 'check_ID'));

        add_settings_section(
            'setting_section_id',
            'Setting',
            array($this, 'print_section_info'),
            'test-setting-admin'
        );  

        add_settings_field(
            'some_id', 
            'Some ID(Title)', 
            array($this, 'create_an_id_field'), 
            'test-setting-admin',
            'setting_section_id'            
        );      
    }

    public function check_ID($input){
        if(is_numeric($input['some_id'])){
            $mid = $input['some_id'];           
            if(get_option('test_some_id') === FALSE){
                add_option('test_some_id', $mid);
            }else{
                update_option('test_some_id', $mid);
            }
        }else{
            $mid = '';
        }
        return $mid;
    }

    public function print_section_info(){
        print 'Enter your setting below:';
    }

    public function create_an_id_field(){
        ?><input type="text" id="input_whatever_unique_id_I_want" name="array_key[some_id]"    value="<?=get_option('test_some_id');?>" /><?php
    }
}

$wctest = new wctest();

Everything works as shown below the code on the page, but I want to add a second setting. How do I add another settings section and a settings field and being able to safe the values? I have been puzzling for half a day now, but no luck.

Could someone help me out please? This is my first plugin and if I understand this part I can do the rest.

like image 915
WendiT Avatar asked Jul 22 '13 22:07

WendiT


People also ask

How do I create a custom options page in WordPress?

Creating custom options panels in WordPress is relatively easy. First, to create the menu item and the new page, see Adding Administration Menus. So long as you stick to this structure, WordPress will handle all of the option creation, update, saving, and redirection for you.

How do I add a settings field in WordPress?

The html input field's name attribute must match $option_name in register_setting() , and value can be filled using get_option() . This function can also be used to add extra settings fields to the default WP settings pages like media or general.

How many WP plugins is too many?

Too many plugins can lead to security breaches on your site, site crashes, bad performance, slow loading speeds, and more. A good rule of thumb is to never exceed 20 plugins. If your site is hosted on shared or budget cloud hosting, try not to use more than 5 plugins.


1 Answers

I just modified the example in the Codex: Creating_Options_Pages#Example_.232. Now it includes a second Settings Field. The sanitization function is simpler to understand and expand. Also changed the names of the variables and added documentation in the code. I think it's easier to follow the logic now. Here it is in full:

<?php
class MySettingsPage
{
    /**
     * Holds the values to be used in the fields callbacks 
     */
    private $options;

    /**
     * Start up
     */
    public function __construct()
    {
        add_action( 'admin_menu', array( $this, 'add_plugin_page' ) );
        add_action( 'admin_init', array( $this, 'page_init' ) );
    }

    /**
     * Add options page
     */
    public function add_plugin_page()
    {
        // This page will be under "Settings"
        add_options_page(
            'Settings Admin', 
            'My Settings', 
            'manage_options', 
            'my-setting-admin', 
            array( $this, 'create_admin_page' )
        );
    }

    /**
     * Options page callback
     */
    public function create_admin_page()
    {
        // Set class property
        $this->options = get_option( 'my_option_name' );
    ?>
    <div class="wrap">
        <?php screen_icon(); ?>
        <h2>My Settings</h2>           
        <form method="post" action="options.php">
        <?php
            // This prints out all hidden setting fields
            settings_fields( 'my_option_group' );   
            do_settings_sections( 'my-setting-admin' );
            submit_button(); 
        ?>
        </form>
    </div>
    <?php
    }

    /**
     * Register and add settings
     */
    public function page_init()
    {        
        register_setting(
            'my_option_group', // Option group
            'my_option_name', // Option name
            array( $this, 'sanitize' ) // Sanitize
        );

        add_settings_section(
            'setting_section_id', // ID
            'My Custom Settings', // Title
            array( $this, 'print_section_info' ), // Callback
            'my-setting-admin' // Page
        );  

        add_settings_field(
            'id_number', // ID
            'ID Number', // Title 
            array( $this, 'id_number_callback' ), // Callback
            'my-setting-admin', // Page
            'setting_section_id' // Section           
        );      

        add_settings_field(
            'title', 
            'Title', 
            array( $this, 'title_callback' ), 
            'my-setting-admin', 
            'setting_section_id'
        );      
    }

    /**
     * Sanitize each setting field as needed
     *
     * @param array $input Contains all settings fields as array keys
     */
    public function sanitize( $input )
    {
        $new_input = array();
        if( isset( $input['id_number'] ) )
            $new_input['id_number'] = absint( $input['id_number'] );

        if( isset( $input['title'] ) )
            $new_input['title'] = sanitize_text_field( $input['title'] );

        return $new_input;
    }

    /** 
     * Print the Section text
     */
    public function print_section_info()
    {
        print 'Enter your settings below:';
    }

    /** 
     * Get the settings option array and print one of its values
     */
    public function id_number_callback()
    {
        printf(
            '<input type="text" id="id_number" name="my_option_name[id_number]" value="%s" />',
            isset( $this->options['id_number'] ) ? esc_attr( $this->options['id_number']) : ''
        );
    }

    /** 
     * Get the settings option array and print one of its values
     */
    public function title_callback()
    {
        printf(
            '<input type="text" id="title" name="my_option_name[title]" value="%s" />',
            isset( $this->options['title'] ) ? esc_attr( $this->options['title']) : ''
        );
    }
}

if( is_admin() )
    $my_settings_page = new MySettingsPage();

If you want to add new Settings Sections, just do it and point the desired Settings Fields to the new section.

Pull the information wherever needed using: get_option( 'my_option_name' );.

like image 181
brasofilo Avatar answered Oct 14 '22 04:10

brasofilo