Ever since WordPress 3.0 came out, merging the multi-blog network capabilities of WordPress MU into the core or WordPress, users have been asking for plugins that let you set options across the entire network, rather than per-blog. Setting up a network settings page is similar to setting up a standard settings page, but with a few key differences.
Creating the Page
First off, rather than the
admin_menu hook, you’ll use the
network_admin_menu hook to register your page. E.g.:
add_action('network_admin_menu', array($this, 'register_network_admin_pages'), 10, 0);
In your callback function, you don’t have the luxury of shortcut functions (e.g.,
add_options_page()) for registering your settings page, so you have to use
'settings.php' as your first argument. Alternatively, you can still use
add_menu_page() to create a new menu section, just as you would with the single blog admin menu.
The WordPress settings API doesn’t entirely work on network admin pages, but you can still take advantage of the
do_settings_sections() functions to register and display your settings, if appropriate. But
register_setting() is useless here.
action attribute for your settings form should point to
edit.php?action=Your_Unique_Action, for reasons we’ll soon discover.
Individual settings should be pulled from the network-wide site options table, using
Saving the Settings
Your settings form gets submitted to
edit.php. To save your settings, you need to hook into the
add_action('network_admin_edit_Your_Unique_Action, array($this, 'save_network_settings_page'), 10, 0);
register_setting() doesn’t work on admin pages, so you’ll need to sanitize, validate, and save all your options yourself. Save the settings to the network-wide site options table using
After all your settings are saved, do a redirect back to your settings page. If you don’t WordPress will automatically redirect to the network dashboard.
wp_redirect(add_query_arg(array('page' => 'Your_Page_Slug', 'updated' => 'true'), network_admin_url('settings.php')));