$conf, $runtime; function_exists('chdir') AND chdir(APP_PATH); $r = 'mysql' == $conf['cache']['type'] ? website_set('runtime', $runtime) : cache_set('runtime', $runtime); } function runtime_truncate() { global $conf; 'mysql' == $conf['cache']['type'] ? website_set('runtime', '') : cache_delete('runtime'); } register_shutdown_function('runtime_save'); ?>plugin development - Options API - Validation Callback $input is NULL|Programmer puzzle solving
最新消息:Welcome to the puzzle paradise for programmers! Here, a well-designed puzzle awaits you. From code logic puzzles to algorithmic challenges, each level is closely centered on the programmer's expertise and skills. Whether you're a novice programmer or an experienced tech guru, you'll find your own challenges on this site. In the process of solving puzzles, you can not only exercise your thinking skills, but also deepen your understanding and application of programming knowledge. Come to start this puzzle journey full of wisdom and challenges, with many programmers to compete with each other and show your programming wisdom! Translated with DeepL.com (free version)

plugin development - Options API - Validation Callback $input is NULL

matteradmin9PV0评论

Issue is that the validation callback function for my plugin has NULL as the $input value.

It's my understanding that the validation callback will use the $input parameter, which contains the POST fields. But when I test the validation callback, the $input parameter is NULL, even though settings are checked.

Note that the settings page has just checkboxes; no other input field types.

My register_settings is as follows; it is tied to the admin_init hook.

register_setting( 
   'pluginPage',    // option group name
    'Settings Name',    // option name (used to store into wp-options
    array('sanitize_callback' => 'sanitize_callback' // sanitize the data function')
    );

And the sanitize_data callback:

 function sanitize_callback($input)
    { $new_input = array();
  // ... some checking here, setting $new_input array values if $input array value exists
  return $new_input;}

Because $input is NULL, which I have verified with a print_r($input);exit; at the beginning of the sanitize_callback() function, the options are not saved in wp-options.

The only way I can get options saved is to use $_POST variables in the sanitize_callback function. That will properly store the options.

So, why is the sanitize_callback function not receiving the $_POST variables when the form is submitted?

Note that I have followed the instructions in the Settings API; I have verified all code is correct according to those instructions. The form is displayed with this code, so the nonce is in the form.

<form action='options.php' method='post'>
        <?php
        settings_fields( 'pluginPage' );    // initializes all of the settings fields
        do_settings_sections( 'pluginPage' );   // does the settings section
        submit_button();    // creats the submit button
        ?>
    </form>

Issue is that the validation callback function for my plugin has NULL as the $input value.

It's my understanding that the validation callback will use the $input parameter, which contains the POST fields. But when I test the validation callback, the $input parameter is NULL, even though settings are checked.

Note that the settings page has just checkboxes; no other input field types.

My register_settings is as follows; it is tied to the admin_init hook.

register_setting( 
   'pluginPage',    // option group name
    'Settings Name',    // option name (used to store into wp-options
    array('sanitize_callback' => 'sanitize_callback' // sanitize the data function')
    );

And the sanitize_data callback:

 function sanitize_callback($input)
    { $new_input = array();
  // ... some checking here, setting $new_input array values if $input array value exists
  return $new_input;}

Because $input is NULL, which I have verified with a print_r($input);exit; at the beginning of the sanitize_callback() function, the options are not saved in wp-options.

The only way I can get options saved is to use $_POST variables in the sanitize_callback function. That will properly store the options.

So, why is the sanitize_callback function not receiving the $_POST variables when the form is submitted?

Note that I have followed the instructions in the Settings API; I have verified all code is correct according to those instructions. The form is displayed with this code, so the nonce is in the form.

<form action='options.php' method='post'>
        <?php
        settings_fields( 'pluginPage' );    // initializes all of the settings fields
        do_settings_sections( 'pluginPage' );   // does the settings section
        submit_button();    // creats the submit button
        ?>
    </form>
Share Improve this question asked Jun 21, 2018 at 21:16 Rick HellewellRick Hellewell 7,1612 gold badges23 silver badges41 bronze badges
Add a comment  | 

1 Answer 1

Reset to default 3

I guess in the meantime you figured in out already. Though I want to share my experience since I faced the same problem and it might be useful for others.

In my case I just got the reference to the options wrong when creating the HTML code for the input-elements.

So since Wordpress suggests to have one option saving an array of values that are the actual settings of your plugin/theme/whatever, you'll problaby have something like this somewhere: (Note: I will use plugin_config where you you have Settings Name, Rick.)

add_option('plugin_config', array(
    'val1' => 1,
    'val2' => 2'
));

Then in addition to registering the settings somwhere you will have registered the corresponding fields to enter values for the section, like this:

add_settings_field('val1_field', 'Field Label:', 'creat_html_callback', 'settings_page_slug_name');

Now the intresting part; when defining the html code, you have to set the name of the field in a way that wordpress can associate the corresponding post value of the request to the correct array position of the option plugin_config (your Settings Name!). So here is the callback referenced in add_settings_field before

public function creat_html_callback() {
    $option = get_option('plugin_config');
    echo '<input type="text" id="val1Field" name="plugin_config[val1]" size="10" value="'.$option['val1'].'"/>';
}

The essentiell part for me was name="plugin_config[val1]". The name of the html-input-element must be the same as the registered (register_setting!) option/setting or the name of the option together with the array index of the value corresponding to the input field. Of course this seems clear and easy to see. Bit I think whith all those slug-names and references you can get easily confused especially when following a tutorial like this.

Post a comment

comment list (0)

  1. No comments so far