Как добавить поле для новой опции для всего сайта на экране настроек сети?

15

Я работаю над плагином, и часть его включает установку значения параметра, которое применяется ко всем сайтам в сети WordPress. Я знаю о функциях add_site_option и get_site_option, которые позволяют сохранять значение в таблице wp_sitemeta, но я не могу понять, как разместить поля в соответствующем месте в бэкэнде WordPress и как перехватить сохранение в другом месте. значения, чтобы вставить вызов add_site_option, когда это произойдет.

Для первой проблемы (добавление полей) я обычно использовал бы API настроек, в частности, register_setting и add_settings_field, чтобы добавить новый параметр в белый список, а затем вставить поле для него на соответствующую страницу параметров. Но я нигде не могу найти информацию о том, можете ли вы использовать add_settings_field для добавления поля на страницу «Настройки» в новом разделе «Сетевой администратор» бэкэнда, если есть альтернативная функция, которая делает то же, что и для страниц сетевого администратора, или если вы просто нужно ввести HTML вручную. (Вы можете сделать это вручную, написав функцию, которая отображает поле, а затем подключив эту функцию к действию "wpmu_options", которое запускается в конце страницы настроек в Network Admin. Но тогда вам также придется иметь дело с одноразовыми номерами а все остальное вручную.)

Вторая проблема, вероятно, связана с поиском действия, которое запускается, когда пользователь нажимает «Сохранить» на странице настроек сетевого администратора, но я пока не смог его найти. Любые выводы будут с благодарностью.

Итак - мысли? Существует ли элегантный способ управления опциями для всего плагина через новую область администрирования сети? Если так, как это сделано?

jalefkowit
источник

Ответы:

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;  
}

Сохраните обработчик сохранения, если вы решите использовать то действие, которое я упоминал выше, и подключите форму к этому действию.

onetrickpony
источник
1
Вот статья, описывающая в основном тот же подход: xplus3.net/2011/07/13/wordpress-network-admin-pages
mltsy
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/

RavanH
источник
0

Я боюсь, что единственный известный мне метод - это метод, который вы упомянули, вручную вводить html и самостоятельно обрабатывать обновления опций. Действие, которое вам нужно использовать для сохранения ваших опций - update_wpmu_options. При необходимости я могу привести более подробный пример, просто дайте мне знать.

BjornW
источник