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を弄ぶのはちょっとなあ・・・
コメント