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?
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.To complement @Radek’s answer, here is another way to use his solution.
The
sanitize_callback
function is the one passed as an argument in yourregister_setting
, and then you can use another one (namedsanitize_options
in my case) to do your sanitization.This
sanitize_callback
will take care of merging all the options under the same$option_name
.