Bagaimana cara menambahkan bidang untuk opsi situs-lebar baru pada layar Pengaturan Jaringan?

15

Saya sedang mengerjakan sebuah plugin, dan sebagian darinya melibatkan pengaturan nilai opsi yang berlaku untuk semua situs di jaringan WordPress. Saya tahu tentang fungsi add_site_option dan get_site_option yang memungkinkan Anda menyimpan nilai ke dalam tabel wp_sitemeta, tetapi apa yang saya tidak tahu adalah bagaimana menempatkan bidang di tempat yang tepat di backend WordPress, dan bagaimana mencegat penghematan di seluruh situs. nilai untuk memasukkan panggilan add_site_option ketika itu terjadi.

Untuk masalah pertama (menambahkan bidang), saya biasanya menggunakan API Pengaturan, khususnya register_setting dan add_settings_field, untuk membuat daftar putih opsi baru dan kemudian memasukkan bidang untuknya ke halaman opsi yang sesuai. Tetapi saya tidak dapat menemukan informasi di mana pun tentang apakah Anda dapat menggunakan add_settings_field untuk menambahkan bidang ke halaman Pengaturan di bagian Admin Jaringan baru di backend, jika ada fungsi alternatif yang melakukan apa yang dilakukan untuk halaman Admin Jaringan, atau jika Anda cukup menyuntikkan HTML secara manual. (Anda dapat melakukannya secara manual dengan menulis fungsi yang menggema bidang dan kemudian menghubungkan fungsi itu ke tindakan "wpmu_options", yang dijalankan pada akhir halaman Pengaturan di Admin Jaringan. Tetapi kemudian Anda juga harus berurusan dengan nonces dan yang lainnya secara manual.)

Masalah kedua mungkin melibatkan menemukan tindakan yang berjalan ketika pengguna menekan "Simpan" di halaman Pengaturan Admin Jaringan, tetapi saya belum dapat menemukannya. Petunjuk apa pun akan sangat dihargai.

Jadi - pikiran? Apakah ada cara yang elegan untuk memungkinkan pengelolaan opsi seluruh situs untuk plugin melalui area Admin Jaringan yang baru? Jika demikian, bagaimana kabarnya?

jalefkowit
sumber

Jawaban:

11

Ada wpmu_optionstindakan yang memungkinkan Anda menambahkan lebih banyak HTML pada halaman Pengaturan Jaringan.

Jika Anda ingin menambahkan sub-menu / halaman Anda sendiri ke menu induk Pengaturan:

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
}

save handler:

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

Simpan save handler jika Anda memilih untuk menggunakan tindakan yang saya sebutkan di atas, dan kaitkan formulir ke tindakan itu.

onetrickpony
sumber
1
Berikut ini sebuah artikel yang menggambarkan pendekatan yang sama: xplus3.net/2011/07/13/wordpress-network-admin-pages
mltsy
1

Pada dasarnya, jika Anda tidak ingin membuat halaman pengaturan admin jaringan Anda sendiri, Anda harus menggunakan kedua kait yang disebutkan secara terpisah di dua jawaban lainnya:

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
}

Untuk penjelasan yang sangat jelas dan contoh kode yang bermanfaat lihat http://zao.is/2013/07/adding-settings-to-network-settings-for-wordpress-multisite/

RavanH
sumber
0

Saya khawatir bahwa satu-satunya metode yang saya tahu adalah metode yang Anda sebutkan menyuntikkan html secara manual dan berurusan dengan pembaruan opsi sendiri. Tindakan yang perlu Anda gunakan untuk menyimpan opsi Anda adalah update_wpmu_options. Jika perlu saya bisa memberikan contoh yang lebih rinci, beri tahu saya.

BjornW
sumber