Settings APIを使ってワードプレスの設定画面を作る場合、
「register_setting」関数で変数(設定値)の登録とかをしますよね?
でも、さてその変数の初期値(デフォルト値)を設定しようかな、
と思っても、これがどこで設定するのかが分からない。
register_setting関数を使う場合の初期値の設定について、調べたことのメモをご紹介。
Contents
初期値の設定
register_setting関数の日本語版関数リファレンスには
初期値に関する記述がないようです。
そこで英語版の関数リファレンスを見ると、
以下のようにより細い仕様が書かれてますね。
1 |
register_setting( string $option_group, string $option_name, array $args = array() ) |
- $option_group:設定のグループ名
(settings_fields() のグループ名に同じにする) - $option_name:設定値の名前
- $args:配列(以下の5つが設定できる)
- 1)'type'
(boolean とか integer などデータタイプの設定) - 2)'description'
(データの説明) - 3)'sanitize_callback'
(無害化(サニタイズ)の関数指定) - 4)'show_in_rest'
(データをRESTAPIに含める必要があるかどうかの設定) - 5)'default'
(get_option() で呼ばれた時の初期値の設定)
- 1)'type'
参考)【英語】 関数リファレンス/register_setting(ワードプレス公式)
参考)関数リファレンス/get_option(ワードプレス公式)
なんだ、register_setting関数で初期値の設定ができるようになってるじゃん、
ということで、
register_setting関数を使う場合の変数の初期値は、
以下の3通りぐらいで設定することになりそうです。
- その1)register_setting の中で設定
- その2)add_option関数を使って設定
- その3)update_option関数を使って設定
register_setting の中で設定
まずは折角仕様で用意されているので、
register_setting関数の中で初期値を設定するパターン。
1 2 3 4 5 6 7 8 9 10 11 12 |
register_setting( 'field-group', // ① グループ名(settings_fieldsの値と同じにする) 'item', // ② 設定値の名前(inputのname要素に同じにする) array( // ③ 初期値やサニタイズ関数 'sanitize_callback => 'callback_func', 'default' => 'こんにちは' ) ); function callback_func{ // xxxxx } |
初期値は register_setting の第3引数(4行目~7行目)で
'default' にて指定すれば良いですね。
(get_option() で呼ばれた時の初期値の設定をしている)
add_option関数を使って設定
日本語の関数リファレンスにあるように、
第三引数にはコールバック関数の指定とするパターン。
(あとから add_option() を使って初期値を設定する)
1 2 3 4 5 6 7 |
register_setting( 'field-group', // ① グループ名(settings_fieldsの値と同じにする) 'item', // ② 設定値の名前(inputのname要素に同じにする) 'callback_func' // ③ サニタイズ関数 ); add_option( 'item', 'こんにちは'); // ④ 初期値を設定 |
参考)(英語)Reference / Functions / add_option()(ワードプレス公式)
add_option() は、
まだ変数(ここでは ' item')に値がセットされたことがなければ
指定した値(ここでは「こんにちは」)を初期値としてセットする。
その1)との違いは、実際にデータベースに値をセットするかどうか、
ということになるのかな?
この add_option() で初期値を設定する場合では、
一度でも何か入力されて、それが(いったんすべて削除され)空文字となっても、
すでに設定値がある(長さが0の文字列がある)ということで
何も動作しないようですね。(空文字を初期値に戻したりしない)
空文字になったら初期値に戻したい、という場合には、
以下の update_option() を使うのが良さそうです。
update_option関数を使って設定
空文字になったら初期値に戻したい場合のパターン。
1 2 3 4 5 6 7 8 9 10 |
register_setting( 'field-group', // ① グループ名(settings_fieldsの値と同じにする) 'item', // ② 設定値の名前(inputのname要素に同じにする) 'callback_func' // ③ サニタイズ関数 ); // ④ 初期値を設定 if( get_option( 'item' ) == false ){ update_option( 'item', 'こんにちは' ); } |
まず変数登録時に初期値も入れたいし、空文字になったらその初期値に戻したい、
という場合には、update_option() を使うのが良さそうです。
get_option() は 変数が 空文字列の場合には(empty:null, 空文字列、0 などの場合には)false を返すので、get_option() でます調べ、空文字だった場合には update_option() を使って、初期値(ここでは 'こんにちは')で値を上書きする、という感じ。
コールバック関数の指定だけでも良い理由
ちょっと参考までにですが
register_setting関数について日本語の関数リファレンスを見ると、
第三引数には初期値の設定は無く、コールバック関数の指定だけになっている。
1 |
<?php register_setting( $option_group, $option_name, $sanitize_callback ); ?> |
- $option_group:設定のグループ名
- $option_name:オプション(設定値)の名前
- $sanitize_callback:コールバック関数
参考)関数リファレンス/register_setting(ワードプレス公式)
関数リファレンスの元となる英語版では、
なぜか第三引数は配列で、
その中で初期値やらコールバック関数が指定できるようになってます。
1 |
register_setting( string $option_group, string $option_name, array $args = array() ) |
参考)【英語】 関数リファレンス/register_setting(ワードプレス公式)
この第三引数について、日本語版の関数リファレンスにあるように
コールバク関数の指定だけで問題なく動作するのはどうしてだろう、
もしかして何か変な動作にならないよね、
など、余計なことを考えてかなり悩んでしまいました。(あまり詳しくないのに余計なことがつい気になってしまうのだ(悪い癖 笑))
色々調べて行き着いたのが register_setting関数が定義されているソース。
( wp-includes/option.php の2265行目から)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
function register_setting( $option_group, $option_name, $args = array() ) { global $new_allowed_options, $wp_registered_settings; /* * In 5.5.0, the `$new_whitelist_options` global variable was renamed to `$new_allowed_options`. * Please consider writing more inclusive code. */ $GLOBALS['new_whitelist_options'] = &$new_allowed_options; $defaults = array( 'type' => 'string', 'group' => $option_group, 'description' => '', 'sanitize_callback' => null, 'show_in_rest' => false, ); // Back-compat: old sanitize callback is added. if ( is_callable( $args ) ) { $args = array( 'sanitize_callback' => $args, ); } |
見た感じ、19行目から22行目で、第三引数がコールバック関数名1つの場合でも「is_callable」(関数としてコールできるかどうか調べる関数)でチェックして、
それがコールできればサニタイズ関数としてセットする、となっているようです。
register_setting関数について日本語の関数リファレンスでは、
データのタイプとかテータの説明とかあまり必要がないものはバッサリ削って、
第三引数はコールバック関数としてだけ残している、
ということになるのかも。
そうなのか~、そうなんだ~