Як додати поле для нової опції на сайті на екрані мережевих налаштувань?


15

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

Для першої проблеми (додавання полів), як правило, я використовую API налаштувань, зокрема зареєструвати_настроювання та add_settings_field, щоб додати білий список нової опції, а потім вставити поле на відповідну сторінку параметрів. Але я не можу ніде знайти інформацію про те, чи можна використовувати add_settings_field, щоб додати поле на сторінку "Налаштування" в новому розділі Менеджер адміністратора, якщо є альтернативна функція, яка робить те, що відбувається для сторінок Мережевого адміністратора, або якщо ви просто потрібно ввести HTML вручну. (Ви можете зробити це вручну, записавши функцію, що відлунюється в полі, а потім підключити цю функцію до дії "wpmu_options", яка запускається наприкінці сторінки "Налаштування" в Мережевому адміністраторі. Але тоді вам також доведеться мати справу з думками. і все інше вручну.)

Друга проблема, ймовірно, полягає у пошуку дії, яка виконується, коли користувач натискає "Зберегти" на сторінці "Налаштування мережевого адміністратора", але я досі не зміг її знайти. Будь-які ведучі будуть дуже вдячні.

Отже - думки? Чи є елегантний спосіб дозволити керування параметрами для загального веб-сайту для плагіна через нову область Мережевого адміністратора? Якщо так, як це робиться?

Відповіді:


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

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. Якщо потрібно, я можу надати більш детальний приклад, просто дайте мені знати.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.