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 add_submenu_page()
, with '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 add_settings_section()
, add_settings_field()
, and do_settings_sections()
functions to register and display your settings, if appropriate. But register_setting()
is useless here.
The 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 get_site_option()
.
Saving the Settings
Your settings form gets submitted to edit.php
. To save your settings, you need to hook into the network_admin_edit_ACTION
hook.
add_action('network_admin_edit_Your_Unique_Action, array($this, 'save_network_settings_page'), 10, 0);
Again, 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 update_site_option()
.
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'))); exit();
I got it in the end…
add_action(network_admin_edit_[your_unique_action], ….
&&
edit.php?action=[your_unique_action]
It wasn’t clear at first, but try try again, and you may succeed.
Bless you. Now Redux Framework supports network settings. http://reduxframework.com
Thanks a ton.