如何在“网络设置”屏幕上为新的站点范围选项添加字段?


15

我正在开发一个插件,其中的一部分涉及设置适用于WordPress网络中所有网站的选项值。我知道有关add_site_optionget_site_option函数的信息这些函数使您可以将值保存到wp_sitemeta表中,但是我不知道如何将字段放置在WordPress后端的适当位置,以及如何拦截站点范围的保存值,以便在发生这种情况时插入add_site_option调用。

对于第一个问题(添加字段),通常使用设置API,特别是register_settingadd_settings_field,将新选项列入白名单,然后将其字段插入相应的选项页面。但是我无法在任何地方找到有关是否可以使用add_settings_field将字​​段添加到后端的新“网络管理”部分中的“设置”页面的信息,如果有替代功能可以对网络管理页面执行的操作,或者只需手动注入HTML。(您可以通过编写回显该字段的函数然后将该函数连接到“ wpmu_options”操作手动进行操作,该操作在Network Admin的“设置”页面的末尾运行。但是然后,您还必须处理随机数以及其他所有手动操作。)

第二个问题可能涉及找到一个操作,该操作在用户在“网络管理员设置”页面上单击“保存”时运行,但我还找不到。任何线索将不胜感激。

那么-有想法吗?是否有一种优雅的方法可以通过新的Network Admin区域管理插件的站点范围选项?如果是这样,怎么做?

Answers:


11

有一项wpmu_options操作可让您在“网络设置”页面上附加更多HTML。

如果要将自己的子菜单/页面添加到“设置”父菜单:

add_action('network_admin_menu', 'add_my_netw_settings_page');
function add_my_netw_settings_page() {
  add_submenu_page(
       'settings.php',
       'Co za asy',
       'Co za asy',
       'manage_network_options',
       'my-netw-settings',
       'your_form'
  );    
}

function your_form(){
  $options = get_site_option('your_plugin');

  ?>
  <form action="<?php echo admin_url('admin-post.php?action=update_my_settings'); ?>" method="post">
    <?php wp_nonce_field('your_plugin_nonce'); ?>

    ...fields go here...

  </form>
  <?php
}

保存处理程序:

add_action('admin_post_update_my_settings',  'update_my_settings');
function update_my_settings(){     
  check_admin_referer('your_plugin_nonce');
  if(!current_user_can('manage_network_options')) wp_die('FU');

  // process your fields from $_POST here and update_site_option

  wp_redirect(admin_url('network/settings.php?page=my-netw-settings'));
  exit;  
}

如果选择使用上述操作,请保留保存处理程序,然后将表单挂接到该操作。


1
这是一篇描述基本相同方法的文章:xplus3.net/2011/07/13/wordpress-network-admin-pages
mltsy 2012年

1

基本上,如果您不想创建自己的网络管理员设置页面,则需要使用另外两个答案中分别提到的两个挂钩:

add_filter( 'wpmu_options' , 'show_network_settings' );
add_action( 'update_wpmu_options', 'save_network_settings' );

function save_network_settings() {
  // checkbox example
  if( isset( $_POST['my_network_checkbox'] ) )
    update_site_option( 'my_network_checkbox', '1' );

  // textfield example
  if( isset( $_POST['my_network_textfield'] ) )
    update_site_option( 'my_network_textfield', sanitize_text_field($_POST['my_network_textfield']) );
}

function show_network_settings() {
    $checkbox = get_site_option('my_checkbox'); 
    $text = get_site_option('my_text'); 
    ?>
    <h3><?php _e('My Network Settings','my-plugin'); ?></h3>
    <table class="form-table">
        <tbody>
            <tr>
                <th scope="row"><?php _e('My Checkbox','my-plugin'); ?></th>
                <td>
                    <label>
                        <input type='checkbox' name='my_checkbox' value='1' <?php checked( $checkbox, '1' ); ?> /> 
                    <?php _e('Check my box.','my-plugin'); ?>
                    </label>
                </td>
            </tr>
            <tr>
                <th scope="row"><label for="my_text"><?php _e('My Text','my-plugin'); ?></label></th>
                <td>
                        <input type='text' name='my_text' value='<?php echo $text; ?>' />
                </td>
            </tr>
        </tbody>
    </table>
    <?php
}

有关非常清晰的说明和有用的代码示例,请参见http://zao.is/2013/07/adding-settings-to-network-settings-for-wordpress-multisite/


0

恐怕我所知道的唯一方法是您提到的手动注入html并自行处理选项更新的方法。您需要用于保存选项的操作是update_wpmu_options。如果需要,我可以提供更详细的示例,请告诉我。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.