web-dev-qa-db-ja.com

[ネットワーク設定]画面に新しいサイト全体のオプションのフィールドを追加する方法

私はプラグインに取り組んでいます、そしてそれの一部はWordPressネットワークのすべてのサイトに適用されるオプション値を設定することを含みます。値をwp_sitemetaテーブルに保存できる add_site_optionget_site_option 関数については知っていますが、WordPressバックエンドの適切な場所にフィールドを配置する方法はわかりません。それが起こったときにadd_site_option呼び出しを挿入するためにサイト全体の値の保存を傍受する方法。

最初の問題(フィールドの追加)では、通常、Settings API、具体的には register_setting および add_settings_field を使用して新しいオプションをホワイトリストに追加し、そのフィールドを適切なオプションページに挿入します。しかし、ネットワーク管理ページに対して機能する別の機能がある場合、またはあなたが追加の機能を使用する場合、add_settings_fieldを使用してバックエンドの新しいNetwork AdminセクションのSettingsページにフィールドを追加できるかどうかについての情報は見つかりません。 HTMLを手動で注入するだけです。 (フィールドをエコーアウトする関数を書き、その関数を「ネットワーク管理」の「設定」ページの最後で実行される「wpmu_options」アクションに接続することで手動で行うことができます。手動で他のすべてのもの。

2番目の問題は、おそらくユーザーが[ネットワーク管理者設定]ページで[保存]をクリックしたときに実行されるアクションを見つけることですが、私はまだそれを見つけることができませんでした。任意のリードは大歓迎です。

だから - 考え?新しいネットワーク管理領域を通じてプラグインのサイト全体のオプションを管理できるようにする優雅な方法はありますか?もしそうなら、それはどうですか?

14
jalefkowit

ネットワーク設定ページにさらにHTMLを追加できるwpmu_optionsアクションがあります。

あなたがあなた自身のサブメニュー/ページを設定親メニューに加えたいならば:

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

上記のアクションを使用することを選択した場合は保存ハンドラを保持し、フォームをそのアクションにフックします。

10
onetrickpony

基本的に、あなたがあなた自身のネットワーク管理者設定ページを作成したくない場合は、他の2つの答えで別々に言及されている両方のフックを使用する必要があります。

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/ を参照してください。

1
RavanH

私が知っている唯一の方法はあなたが手動でhtmlを注入してあなた自身でオプションの更新を処理するというあなたが述べた方法であることを恐れています。オプションを保存するために必要なアクションはupdate_wpmu_optionsです。必要ならば、私はもっと詳細な例を提供することができます、ちょうど私に知らせてください。

0
BjornW