admin管理画面に項目を追加(2)

admin画面に項目を追加するもう一つの方法は、
register_setting()と
setting_fields()を使う方法

register_setting()はadmin_initにフックして、まずどういう項目を保存したいかを登録する

    add_action('admin_init', 'ozh_sampleoptions_init' );
    function ozh_sampleoptions_init(){
        register_setting( 'ozh_sampleoptions_options', 'ozh_sample' );
    }

setting_fieldは、フォーム内で使う。
例えば、以下のコードはadd_theme_pageなどにフックさせてオプションページを生成する関数だが、

これを入れておく事により、nonceやら必要な処理を一切請け負ってくれる。
formのポスト先は例によってoptions.phpである。
もうひとつ忘れては行けないのがname属性の付け方。
register_settingの第2パラメータが’ozh_sample’ならば
name=”ozh_sample[option1]”
name=”ozh_sample[option2]”

となる。値はシリアライズされて第1パラメータであるところの、’ozh_sampleoptions_options’
の中にぶち込まれる。取り出す時は普通に、
$options = get_option(‘ozh_sample’);
で出して来て、
$options[‘option1’]
などと展開すれば良い。


function ozh_sampleoptions_do_page() {
    ?>
    <div class="wrap">
        <h2>Ozh's Sample Options</h2>
        <form method="post" action="options.php">
            <?php settings_fields('ozh_sampleoptions_options'); ?>
            <?php $options = get_option('ozh_sample'); ?>
            <table class="form-table">
                <tr valign="top"><th scope="row">A Checkbox</th>
                    <td><input name="ozh_sample[option1]" type="checkbox" value="1" <?php checked('1', $options['option1']); ?> /></td>
                </tr>
                <tr valign="top"><th scope="row">Some text</th>
                    <td><input type="text" name="ozh_sample[sometext]" value="<?php echo $options['sometext']; ?>" /></td>
                </tr>
            </table>
            <p class="submit">
            <input type="submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
            </p>
        </form>
    </div>
    <?php   
}

実は、register_settingは第3パラメータまであって、これはデータのサニタイズや
バリデーションのためのコールバック関数の指定だ。

register_setting( 'ozh_sampleoptions_options', 'ozh_sample', 'ozh_sampleoptions_validate' );

function ozh_sampleoptions_validate($input) {
// 何らかのフィルタリング
return $input;
}

ただ、これは、間違いが有った時に元のページへ戻って再入力を促すという高度な
ことは出来ないようだ。要は内容をフィルタリングするだけ。

これで、オプションページは楽に処理出来る事は分かった。
問題は、ファイルアップロードなど特殊な型式の場合、どうするかである。普通に$_FILESを弄ぶのはちょっとなあ・・・

コメント

タイトルとURLをコピーしました