add_action( 'admin_menu', array( &$this, '_settings_menu' ) );
add_action( 'network_admin_menu', array( &$this, '_settings_menu' ) );
我使用[admin_menu]和[network_admin_menuu]操作来为我的插件创建一些选项页面,而保存操作在WordPress Multiete Blogs中运行良好。
但在网络管理级别[
/WP-ADMIN/newets.php?page =plugin_settings] 不是 [/blog-1/wp-admin/admin.php?page =plugin_settings] 将页面重定向到[/wp-admin/network/options.php]后,出现以下错误,当然不会保存测试值。 找不到对象!在此服务器上找不到请求的URL。参考页面上的链接似乎是错误或过时的。请告知该页面的作者有关错误的信息。如果您认为这是服务器错误,请联系网络管理员。
插件在网络下被激活
WordPress多站点不会自动处理使用
register_settings
创建的字段,您必须自己创建一个更新功能,例如:
在您的菜单创建的页面的回调中,表单操作是这样定义的,
options.php
用于单个站点:
<?php
$action = is_network_admin() ? 'edit.php?action=' . self::SLUG . '-update' : 'options.php';
?>
<form action="<?php echo $action; ?>" method="POST">
<?php
settings_fields( self::SLUG . '-page' );
do_settings_sections( self::SLUG . '-page' );
submit_button();
?>
</form>
update()方法如下:
public function update() {
check_admin_referer( self::SLUG . '-page-options' );
if ( isset( $_POST[ self::SLUG ] ) ) {
update_site_option( self::SLUG, $_POST[ self::SLUG ] );
}
wp_safe_redirect(
add_query_arg(
array(
'page' => self::SLUG . '-page',
'updated' => 'true',
),
network_admin_url( 'settings.php' )
)
);
exit;
}
这是行动中所有事物的最小例子:
class Settings_API_Multisite {
const SLUG = 'base-for-multisite';
public function __construct() {
add_action('plugins_loaded', [$this, 'setup']);
}
public function setup() {
add_action( 'admin_init', [$this, 'init'] );
if (is_multisite()) {
add_action('network_admin_menu', [$this, 'admin_menu']);
add_action('network_admin_edit_' . self::SLUG . '-update', [$this, 'update']);
}
}
public function init() {
if (is_network_admin()) {
add_settings_section(
'network-section',
__('Working with the Settings API', ''),
'__return_false',
self::SLUG . '-page'
);
add_settings_field(
'the_key',
__('Your Key', ''),
[$this, 'render_txt_field'],
self::SLUG . '-page',
'network-section',
[
'label_for' => 'the_key',
'description' => '',
'class' => '',
'placeholder' => 'Fill your key',
]
);
register_setting(self::SLUG . '-page', self::SLUG);
}
}
public function admin_menu() {
if (is_multisite()) {
$hook = add_submenu_page(
'settings.php',
'My Multisite',
'My Multisite',
"manage_network_options",
self::SLUG . '-page',
[$this, 'create_page']
);
// add_action("admin_print_styles-$hook", [$this, 'styles']);
}
}
public function create_page() {
$capabil = is_network_admin() ? 'manage_network_options' : 'manage_options';
if (!current_user_can($capabil)) return;
$action = is_network_admin() ? 'edit.php?action=' . self::SLUG . '-update' : 'options.php';
?>
<?php if (isset($_GET['updated'])) : ?>
<div id="message" class="updated notice is-dismissible">
<p><?php esc_html_e('Options Saved', ''); ?></p>
</div>
<?php endif; ?>
<div class="wrap">
<h1><?php echo esc_attr(get_admin_page_title()); ?></h1>
<form action="<?php echo $action; ?>" method="POST">
<?php
settings_fields(self::SLUG . '-page');
do_settings_sections(self::SLUG . '-page');
submit_button();
?>
</form>
</div>
<?php
}
public function update() {
check_admin_referer(self::SLUG . '-page-options');
if (isset($_POST[self::SLUG])) {
update_site_option(self::SLUG, $_POST[self::SLUG]);
}
wp_safe_redirect(
add_query_arg(
[
'page' => self::SLUG . '-page',
'updated' => 'true',
],
network_admin_url('settings.php')
)
);
exit;
}
public function render_txt_field($args) {
$value = is_network_admin() ? get_site_option(self::SLUG) : get_option(self::SLUG);
$option = $args['label_for'];
$val = isset($value[$option]) ? $value[$option] : '';
$class = !empty($args['class']) ? " class='{$args['class']}'" : '';
$extra = !empty($args['extra']) ? wp_kses_post($args['extra']) : '';
$placeholder = !empty($args['placeholder']) ? " placeholder='{$args['placeholder']}'" : '';
echo '<input type="text" name="' . self::SLUG . '[' . $option . ']" value="' . esc_attr($val) . '" ' . $class . $placeholder . ' />' . $extra;
}
}
new Settings_API_Multisite();