Jak dodać pole dla nowej opcji dla całej witryny na ekranie ustawień sieciowych?

15

Pracuję nad wtyczką, a jej część wiąże się z ustawieniem wartości opcji, która ma zastosowanie do wszystkich witryn w sieci WordPress. Wiem o funkcjach add_site_option i get_site_option, które pozwalają zapisać wartość w tabeli wp_sitemeta, ale nie potrafię wymyślić, jak umieścić pola w odpowiednim miejscu w backendzie WordPressa i jak przechwycić zapisywanie całej strony wartości, aby wstawić wywołanie add_site_option, gdy tak się stanie.

W przypadku pierwszego problemu (dodanie pól) normalnie użyłbym interfejsu API ustawień, w szczególności register_setting i add_settings_field, aby dodać nową opcję do białej listy, a następnie wstawić jej pole na odpowiedniej stronie opcji. Ale nigdzie nie mogę znaleźć informacji o tym, czy można użyć pola add_settings_field, aby dodać pole do strony Ustawienia w nowej sekcji Administratora sieci backendu, jeśli istnieje alternatywna funkcja, która robi to, co robi dla stron Administratora sieci, lub jeśli wystarczy ręcznie wstrzyknąć HTML. (Możesz to zrobić ręcznie, pisząc funkcję, która wypowiada echo pola, a następnie łącząc tę ​​funkcję z akcją „wpmu_options”, która uruchamia się na końcu strony Ustawienia w Administratorze sieci. Ale wtedy musisz również radzić sobie z nonces i wszystko inne ręcznie.)

Drugi problem prawdopodobnie dotyczy znalezienia działania, które uruchomi się, gdy użytkownik kliknie „Zapisz” na stronie Ustawienia administratora sieci, ale jeszcze go nie znalazłem. Wszelkie opinie byłyby bardzo mile widziane.

Więc - myśli? Czy istnieje elegancki sposób na zarządzanie opcjami ogólnodostępnymi wtyczki za pośrednictwem nowego obszaru Administratora sieci? Jeśli tak, jak to zrobić?

jalefkowit
źródło

Odpowiedzi:

11

Istnieje wpmu_optionsakcja, która pozwala dodać więcej HTML na stronie Ustawienia sieci.

Jeśli chcesz dodać własne podmenu / stronę do menu nadrzędnego Ustawienia:

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
}

moduł obsługi zapisu:

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

Zachowaj moduł obsługi zapisywania, jeśli zdecydujesz się użyć tej akcji, o której wspomniałem powyżej, i podpisz formularz do tej akcji.

onetrickpony
źródło
1
Oto artykuł opisujący w zasadzie to samo podejście: xplus3.net/2011/07/13/wordpress-network-admin-pages
mltsy
1

Zasadniczo, jeśli nie chcesz tworzyć własnej strony ustawień administratora sieci, musisz użyć obu haków wymienionych osobno w dwóch pozostałych odpowiedziach:

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
}

Bardzo jasne wyjaśnienie i przydatny przykładowy kod można znaleźć na stronie http://zao.is/2013/07/adding-settings-to-network-settings-for-wordpress-multisite/

RavanH
źródło
0

Obawiam się, że jedyną znaną mi metodą jest wspomniana metoda ręcznego wstrzykiwania kodu HTML i samodzielnego radzenia sobie z aktualizacjami opcji. Akcją, której należy użyć do zapisania opcji, jest update_wpmu_options. W razie potrzeby mogę podać bardziej szczegółowy przykład, daj mi znać.

BjornW
źródło