I registered one options group with few different options sections. Each section is meant for different page.

register_setting(                       // http://codex.wordpress.org/Function_Reference/register_setting
        'mhp_options',                  // Options group
        'mhp_plugin_options',           // Database option
        'mhp_plugin_options_validate'   // The sanitization callback,

// Manage Menu section
add_settings_section(                   // http://codex.wordpress.org/Function_Reference/add_settings_section
        $mhp_manage_menu_section,   // Unique identifier for the settings section
        __('Manage Menu Settings', 'mhp'),  // Section title
        '__return_false',               // Section callback (we don't want anything)
        $mhp_manage_menu_section            // Menu slug
        __('Home Page Layout Settings', 'mhp'),     

Then each page is using

settings_fields( 'mhp_options' ); 
do_settings_sections( $mhp_manage_menu_section);

so the other page is using

settings_fields( 'mhp_options' ); 
do_settings_sections( $mhp_home_page_layout_settings_section);

but it looks like on save only current section is saved in the options table. What ever was already there is deleted.

Do I have to create new options group for each page or is there any other solution?

  • If you can retrieve all the fields names from outside settings api (e.g. you have saved it in a static class variable or in a global variable) what you ask is possible and easy. Just for clarification for 'field names' I mean the ids you pass as first argument to add_settings_field for fields of all sections.
    – gmazzap
    Oct 10, 2013 at 5:23
  • I already found the solution. Before posting it I wanted to give opportunity someone to earn the points. Your way would work, do you want to create an answer out of it?
    – Radek
    Oct 11, 2013 at 3:03

2 Answers 2


The solution is to merge existing options before saving options in case not all options are presented on the page we are about save.

So in the end of $sanitize_callback in register_setting function just before I return the data I call below function where $existing are all existing options saved in database.

function merge_options( $existing,  $input ) { // Merges existing options with $input to preserve existing options

    if ( !is_array( $existing ) || !is_array( $input ) ) // something went wrong
        return $data;
    return array_merge( $existing, $input );
  • Just to clarify, $input refers to the $options parameter received in the sanitize_callback, and $existing refers to the option that you can retrieve with get_option( $option_name ) Jul 27, 2020 at 11:38

To complement @Radek's answer, here is another way to use his solution.

public function sanitize_callback ( $options )
    $saved_options = $this->get_option( 'your_option_name' );
    $options = $this->sanitize_options( $options );

    if ( is_array( $saved_options ) && is_array( $options ) )
        $options = array_merge( $saved_options, $options );

    return $options;

The sanitize_callback function is the one passed as an argument in your register_setting, and then you can use another one (named sanitize_options in my case) to do your sanitization.

This sanitize_callback will take care of merging all the options under the same $option_name.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.