Take the 2-minute tour ×
WordPress Development Stack Exchange is a question and answer site for WordPress developers and administrators. It's 100% free, no registration required.

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?

share|improve this question
    
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. –  G. M. Oct 10 '13 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 '13 at 3:03

1 Answer 1

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 );
}
share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

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