WordPressのSetting APIを使って設定ページを作成する方法を確認し、実際にサンプルを作成しました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
・セキュリティチェックを行ってくれ、フォーム内にnonceを手動で指定する必要がなくなる。
●主な関数
・設定の登録
register_setting()
・フィールドやセクションの追加
add_settings_field()
add_settings_section()
・オプションフォームの作成
settings_fields()
・トップレベルメニューにプラグインの設定ページを作成する。
・プラグイン設定ページの仕様
スラグ:myplg_main_menu
設定項目:Name、Email、URL
2)プラグイン設定メニューを作成
●サンプルコード全体
add_action( 'admin_menu', 'myplg_create_menu' );
function myplg_create_menu() {
add_menu_page( 'My Plugin Settings', 'My Settings',
'manage_options', 'myplg_main_menu', 'myplg_settings_page' );
add_action( 'admin_init', 'myplg_register_settings' );
}
function myplg_register_settings() {
register_setting( 'myplg-settings-group',
'myplg_options', 'myplg_sanitize_options' );
}
function myplg_sanitize_options( $input ) {
$input['option_name'] = sanitize_text_field( $input['option_name'] );
$input['option_email'] = sanitize_email( $input['option_email'] );
$input['option_url'] = esc_url( $input['option_url'] );
return $input;
}
function myplg_settings_page() {
?>
<div class="wrap">
<h2>My Plugin Options</h2>
<form method="post" action="options.php">
<?php settings_fields( 'myplg-settings-group' ); ?>
<?php $myplg_options = get_option( 'myplg_options' ); ?>
<table class="form-table">
<tr valign="top">
<th scope="row">Name</th>
<td><input type="text"
name="myplg_options[option_name]"
value="<?php echo esc_attr(
$myplg_options['option_name'] ); ?>" /></td>
</tr>
<tr valign="top">
<th scope="row">Email</th>
<td><input type="text"
name="myplg_options[option_email]"
value="<?php echo esc_attr(
$myplg_options['option_email'] ); ?>" /></td>
</tr>
<tr valign="top">
<th scope="row">URL</th>
<td><input type="text"
name="myplg_options[option_url]"
value="<?php echo esc_url(
$myplg_options['option_url'] ); ?>" /></td>
</tr>
</table>
<p class="submit">
<input type="submit" class="button-primary"
value="Save Changes" />
</p>
</form>
</div>
<?php
}
①トップレベルメニューにオプション設定ページを追加(add_menu_page())
●add_menu_page関数
add_menu_page( $page_title, $menu_title, $capability, $menu_slug, $function, $icon_url, $position )
$page_title:メニューページのタイトル。HTMLのtitleタグのテキスト。
$menu_title:管理画面に表示されるメニュー名。
$capability:メニューを見るのに必要な権限。
$menu_slug:メニューのスラッグ。
$function:メニュー設定ページを表示するコールバック関数
$icon_url:メニュー横に表示されるアイコンファイルのURL(省略時は”)。
$position:メニューの追加位置(省略時はNULL)。
function myplg_create_menu() {
add_menu_page( 'My Plugin Settings', 'My Settings',
'manage_options', 'myplg_main_menu', 'myplg_settings_page' );
add_action( 'admin_init', 'myplg_register_settings' );
}
②オプション設定ページのフォームで保存するオプションを定義(register_setting())、サニタイズ
・フォームが保存できるオプションのホワイトリストにオプションを追加/削除する。
・セキュリティのために、各オプションの値をチェックするコールバック関数を指定できる。
・register_setting関数はadmin_initアクションフックで呼び出す。このフックは他の管理ページよりも先に呼び出され、このフォームを受け取るoptions.phpよりも先に呼び出される。
●register_setting関数
register_setting( $option_group, $option_name, $sanitize_callback )
$option_group:セッティンググループ名。settings_fields()で指定する値と同じにする。
$option_name:サニタイズ、保存するオプションの名前
$sanitize_callback:オプションの値をサニタイズするコールバック関数
register_setting( 'myplg-settings-group',
'myplg_options', 'myplg_sanitize_options' );
//3つのオプションの値を一つの配列として保存
function myplg_sanitize_options( $input ) {
$input['option_name'] = sanitize_text_field( $input['option_name'] );
$input['option_email'] = sanitize_email( $input['option_email'] );
$input['option_url'] = esc_url( $input['option_url'] );
return $input;
}
③オプション設定ページ、HTMLフォームを作成
a)formタグの開始
下記のようにaction=”options.php”を指定する。
<form method=”post” action=”options.php”>
b)セッティンググループを使って上記②で定義したオプションとフォーム内のオプションをリンク
上記②のregister_setting()で指定したグループ名と同じにする。
settings_fields( ‘myplg-settings-group’ );
c)既存のオプションを取得
$myplg_options = get_option( ‘myplg_options’ )
d)フォームのフィールドを作成
<table class="form-table">
<tr valign="top">
<th scope="row">Name</th>
<td><input type="text"
name="myplg_options[option_name]"
value="<?php echo esc_attr(
$myplg_options['option_name'] ); ?>" /></td>
</tr>
3)データベースに保存されたオプションの値
mysql> select option_id,option_name from wp_options where option_name like "%prowp%" ;
select option_id,option_name,option_value from wp_options where option_name like "%myplg%" ;
| 10491 | myplg_options | a:3:{s:11:"option_name";s:5:"test1";s:12:"option_email";s:17:"test1@example.com";s:10:"option_url";s:16:"http://test1.com";} |
+-----------+---------------+------------------------------------------------------------------------------------------------------------------------------+
・既存の”表示設定”ページの下部にプラグイン設定セクションを追加する。
・プラグイン設定セクションの仕様
スラグ:myplg_main_menu
設定項目:有効のチェックボックス、名前
2)プラグイン設定セクションを既存の設定ページに追加
●サンプルの全体
<?php
add_action( 'admin_init', 'myplg_settings_init' );
function myplg_settings_init() {
//設定→表示設定ページの下部にプラグイン設定セクションを追加
add_settings_section(
'myplg_setting_section',
'My Plugin設定',
'myplg_setting_section',
'reading'
);
// 設定オプションを登録
add_settings_field(
'myplg_setting_enable_id',
'My Pluginの機能を有効にする',
'myplg_setting_enabled',
'reading',
'myplg_setting_section'
);
add_settings_field(
'myplg_saved_setting_name_id',
'名前',
'myplg_setting_name',
'reading',
'myplg_setting_section'
);
register_setting(
'reading',
'myplg_setting_values',
'myplg_sanitize_settings'
);
}
function myplg_sanitize_settings( $input ) {
$input['enabled'] = ( $input['enabled'] == 'on' ) ? 'on' : '';
$input['name'] = sanitize_text_field( $input['name'] );
return $input;
}
// 設定セクション
function myplg_setting_section() {
echo '<p>My Pluginのオプションを以下で設定</p>';
}
// チェックボックス入力のフォーム
function myplg_setting_enabled() {
$myplg_options = get_option( 'myplg_setting_values' );
echo '<input '.checked( $myplg_options['enabled'], 'on',false ).
' name="myplg_setting_values[enabled]"
type="checkbox" /> 有効';
}
// 名前入力のフォーム
function myplg_setting_name() {
$myplg_options = get_option( 'myplg_setting_values' );
echo '<input type="text" name="myplg_setting_values[name]"
value="'.esc_attr( $myplg_options['name'] ).'" />';
}
①設定セクションの追加(add_settings_section())
・設定セクションは、WordPress設定ページでヘッダを共有するいくつかの設定のまとまり。
・新規ページを作成するのではなく、既存の設定ページにセクションを追加できる。
●add_settings_section関数
add_settings_section( $id, $title, $callback, $page )
$id:タグの’id’属性に使用する文字列。
$title:設定ページに表示するセクションのタイトル。
$callback:適切な内容のセクションを出力する関数。関数は出力をechoする必要がある。
$page:セクションを表示する設定ページのタイプ(general,reading,writing,media 等)。
add_settings_section( 'myplg_setting_section', 'My Plugin設定', 'myplg_setting_section', 'reading' );
②設定フィールドを追加(add_settings_field())
・既存のページに新たな設定フィールドを追加。
●add_settings_field関数
add_settings_field( $id, $title, $callback, $page, $section = ‘default’, $args = array() )
$id:タグの ‘id’ 属性に使用する文字列。
$title:設定ページに表示するフィールドのタイトル。
$callback;フォームの一部として、適切なinputを含むフィールドを表示する関数。inputのnameとidはこの関数の$idと一致する必要がある。関数は出力をechoする必要がある。
$page:フィールドを表示する設定ページのタイプ (general, reading, writing 等)。
$section:ボックスを表示する設定ページのセクション。
$args – 追加の引数
add_settings_field( 'myplg_setting_enable_id', 'My Pluginの機能を有効にする', 'myplg_setting_enabled', 'reading', 'myplg_setting_section' );
③オプション設定ページのフォームで保存するオプションを定義(register_setting())、サニタイズ
・フォームが保存できるオプションのホワイトリストにオプションを追加/削除する。
・セキュリティのために、各オプションの値をチェックするコールバック関数を指定できる。
・register_setting関数はadmin_initアクションフックで呼び出す。このフックは他の管理ページよりも先に呼び出され、このフォームを受け取るoptions.php よりも先に呼び出される。
●register_setting関数
register_setting( $option_group, $option_name, $sanitize_callback )
$option_group:セッティンググループ名。settings_fields()で指定する値と同じにする。
$option_name:サニタイズ、保存するオプションの名前
$sanitize_callback:オプションの値をサニタイズするコールバック関数
register_setting(
'reading',
'myplg_setting_values',
'myplg_sanitize_settings'
);
function myplg_sanitize_settings( $input ) {
$input['enabled'] = ( $input['enabled'] == 'on' ) ? 'on' : '';
$input['name'] = sanitize_text_field( $input['name'] );
return $input;
}
④追加する設定項目のHTMLフォームのフィールドを作成
上記①②で指定したコールバック関数で定義。
①セクション部
function myplg_setting_section() {
echo '<p>My Pluginのオプションを以下で設定</p>';
}
②チェックボックス入力のフォーム
function myplg_setting_enabled() {
$myplg_options = get_option( 'myplg_setting_values' );
echo '<input '.checked( $myplg_options['enabled'], 'on',false ).
' name="myplg_setting_values[enabled]"
type="checkbox" /> 有効';
}
③名前入力のフォーム
function myplg_setting_name() {
$myplg_options = get_option( 'myplg_setting_values' );
echo '<input type="text" name="myplg_setting_values[name]"
value="'.esc_attr( $myplg_options['name'] ).'" />';
}