WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. Join them; it only takes a minute:

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

Im trying to learn Settings API and I'd appreciate if someone could clarify this for me.

I want to store serialized data in the database. Im using a class to do all the work for me.

Heres what I have:

public function admin_init()
    {
        register_setting('wp_plugin_template-group', 'my_settings', array(&$this,'validate'));

        // add your settings section 
        add_settings_section(
        'wp_plugin_template-section', 
        'MY Settings', 
        array(&$this, 'settings_section_wp_plugin_template'), 
        'wp_plugin_template' );


        // add your setting's fields 
        add_settings_field(
        'wp_plugin_template-setting_a', 
        'Setting A', 
        array(&$this, 'settings_field_input_text'), 
        'wp_plugin_template', 
        'wp_plugin_template-section', 
        array( 'field' => 'setting_a' )
        );


        add_settings_field(
        'wp_plugin_template-setting_b', 
        'Setting B', 
        array(&$this, 'settings_field_input_text'), 
        'wp_plugin_template', 
        'wp_plugin_template-section', 
        array( 'field' => 'setting_b' )
        );

    }

As you can see, Im using validate callback to return an array so it can be serialized and stored in the DB. Heres the Validate function:

public function validate($args)
    {
        //echo "vali";      

        $valid = array();


        //$valid['setting_a'] = sanitize_text_field($args['setting_a']);
        //$valid['setting_b'] = sanitize_text_field($args['setting_b']);


        $valid['setting_a'] = $_POST['setting_a'];
        $valid['setting_b'] = $args['setting_b'];


        //$valid['setting_a'] = "AAAA";
        $valid['setting_b'] = "BBBB";



        return $valid;
    }

Please note only one value is now stored in the DB:

 $valid['setting_a'] = $_POST['setting_a']; //stored in the DB
 $valid['setting_b'] = $args['setting_b']; //Stored as null, in other words it doesnt work
 $valid['setting_b'] = "BBBB"; //Works fine, using it, just for testing purposes

This is how the form is built:

public function settings_field_input_text($args) 
    {


        // Get the field name from the $args array 
        $field = $args['field']; 

        // Get the value of this setting 
        $value = get_option($field);

        // echo a proper input type="text"
        echo sprintf('<input type="text" name="%s" id="%s" value="%s" />', $field, $field, $value); 


    }

And Displayed:

    <div class="wrap">
   <?php if ( isset( $_GET['settings-updated'] ) ) {
           echo "<div class='updated'><p>Settings updated successfully.</p></div>";
      } ?>
<?php screen_icon(); ?>
<h2>WP Plugin Template</h2> 
    <form method="post" action="options.php">
    <?php //Output nonce, action, and option_page fields for a settings page. Please note that this function must be called inside of the form tag for the options page. ?>
        <?php @settings_fields('wp_plugin_template-group'); ?> 
        <?php @do_settings_fields('wp_plugin_template-group'); ?> 
        <?php @do_settings_sections('wp_plugin_template'); ?> 
        <?php @submit_button(); ?> 
    </form> 
     </div>

HTML Version A:

<div class="wrap">
<div class="icon32" id="icon-usy-settings"><br></div>   <h2>WP Plugin Template</h2> 
    <form action="options.php" method="post">
                <input type="hidden" value="wp_plugin_template-group" name="option_page"><input type="hidden" value="update" name="action"><input type="hidden" value="5d72478b96" name="_wpnonce" id="_wpnonce"><input type="hidden" value="/inspired/wp-admin/admin.php?page=usy-settings" name="_wp_http_referer"> 

        <h3>MY Settings</h3>

These settings do things for the WP Plugin Template.Setting ASetting B

And also I've tried this:

HTML Version B:

<div class="wrap">
<div class="icon32" id="icon-usy-settings"><br></div>   <h2>WP Plugin Template</h2><div class="updated"><p>Settings updated successfully.</p></div> 
    <form action="options.php" method="post">
                <input type="hidden" value="wp_plugin_template-group" name="option_page"><input type="hidden" value="update" name="action"><input type="hidden" value="5d72478b96" name="_wpnonce" id="_wpnonce"><input type="hidden" value="/inspired/wp-admin/admin.php?page=usy-settings&amp;settings-updated=true" name="_wp_http_referer"> 

        <h3>MY Settings</h3>

These settings do things for the WP Plugin Template.Setting ASetting B

I was wondering if there is a better way of doing this? I was under impression that all the form values will be passed as parameter $args

But no matter what I try, $args always empty:(

Can you please help me understand how to get it to work? or is $_POST['setting_a'] my only option?

share|improve this question
    
Add the form fields to your question. – toscho Apr 3 '13 at 3:50
    
Thank you Toscho, I updated my question as per your request. – user30899 Apr 3 '13 at 5:09
    
What is the actual name attribute of your input fields? – toscho Apr 3 '13 at 7:18
    
Toscho, I've updated the question. Thank you. – user30899 Apr 4 '13 at 5:54
    
I have seen it; just haven't found the time to answer. – toscho Apr 4 '13 at 5:56

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Browse other questions tagged or ask your own question.