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