Looking at an old commit on a plugin I am writing, I am seeing a couple of things that jump out at me.
First is your options page declaration. I had mine as follows, using your labels:
function settings_menu_email() {
add_menu_page(
'Set Email',
'Set Email',
'manage_options',
'email_admin_menu',
'email_admin_menu_callback',
);
add_submenu_page(
'email_admin_menu',
__( 'Options', 'textdomain' ),
__( 'Options', 'textdomain' ),
'administrator',
'email_admin_menu_options',
'email_admin_menu_options_callback'
);
}
add_action( 'admin_menu', 'settings_menu_email' );
Then define your settings groups outside of the callback function.
function email_initialize_plugin_options() {
add_settings_section(
'email_settings_section',
'EMail Options',
'email_options_callback',
'email_admin_menu_options'
);
// Add Email Address Option
add_settings_field(
'email_settings_section',
'EMail Address',
'email_set_address_callback',
'email_admin_menu_options',
'email_settings_section',
array(
'Enter a description here...',
)
);
// Register Email Address Option
register_setting(
'email_settings_section',
'email_settings_section'
);
}
add_action( 'admin_init', 'email_initialize_plugin_options' );
Then you do your callbacks.
In order to test this, just add empty callback functions.