Can I use the different settings sections over different pages using the save options group?

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
);
add_settings_section(                   
        $mhp_home_page_layout_settings_section,     
        __('Home Page Layout Settings', 'mhp'),     
        '__return_false',               
        $mhp_home_page_layout_settings_section          
);

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?

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 );
}

Leave a Comment