9

When I use the settings API in a multisite installation and the options page sits at the network level, posting the options to options.php does not work, because the administration page sits at wp-admin/network and WP expects the page to be at wp-admin.

I added a function that checks whether this WP installation is a multsite installation (via the constant) and if it is, it changes the form's action value to ../option.php. This saves the options OK, but the default message "Settings saved." is missing (however, the query string does include settings-updated=true).

Any thoughts on how to get the message to appear?

2 Answers 2

12

For network option pages the correct form action URL is:

wp-admin/network/edit.php?action=your_option_name

Then you have to register a callback:

add_action( 
    'network_admin_edit_your_option_name', 
    'your_save_network_options_function' 
);

In that callback function inspect the $_POST data, prepare the values, then save them:

update_site_option( $this->option_name, $this->option_values );

And then you have to create the redirect without further help:

// redirect to settings page in network
wp_redirect(
    add_query_arg(
        array( 'page' => 'your_options_page_slug', 'updated' => 'true' ),
        (is_multisite() ? network_admin_url( 'admin.php' ) : admin_url( 'admin.php' ))
    )
);
exit;

On the options page check $_GET['updated'], and add an admin notice if you found that parameter.

3
  • So the Settings API is not available on network admin pages? And what @NightHawk had originally done, was actually saving options to the main blog of the network and not saving them site-wide, right?
    – Parham
    Commented Jan 14, 2014 at 21:45
  • @Parham I haven’t seen his code, but I know most parts of the Settings API are either not available on network pages, or they behave in strange ways. There is no need to use that.
    – fuxia
    Commented Jan 14, 2014 at 21:50
  • As of WordPress v5.6, I am using the settings api in conjunction with this code and it works perfectly.
    – Talha Imam
    Commented Feb 17, 2021 at 13:47
0

I've been using @toscho's answer which works great, however in certain wordpress install paths the hard-coded form action URL won't work. Here @birgire states how to build the correct URL:

When referring to urls within the network-admin, you should consider the network_admin_url(). core function, that falls back to admin_url() for non-multisite setups.

echo esc_url( 
    add_query_arg( 
       'action', 
       'your_option_name', 
       network_admin_url( 'edit.php' ) 
    )
);

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