PR

【WordPress】register_settingで初期値を設定する方法は?add_optionを使うの?

Settings APIを使ってワードプレスの設定画面を作る場合、
「register_setting」関数で変数(設定値)の登録とかをしますよね?

でも、さてその変数の初期値(デフォルト値)を設定しようかな、
と思っても、これがどこで設定するのかが分からない。

register_setting関数を使う場合の初期値の設定について、調べたことのメモをご紹介。

⇒「Settings APIの使い方まとめ」に戻る

初期値の設定

register_setting関数の日本語版関数リファレンスには
初期値に関する記述がないようです。

そこで英語版の関数リファレンスを見ると、
以下のようにより細い仕様が書かれてますね。

PHP
register_setting(
    string $option_group,
    string $option_name,
    array $args = []
);
Jin Simple Code Block
  • $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() で呼ばれた時の初期値の設定)

参考)【英語】 関数リファレンス/register_setting(ワードプレス公式)
参考)関数リファレンス/get_option(ワードプレス公式)

なんだ、register_setting関数で初期値の設定ができるようになってるじゃん、
ということで、
register_setting関数を使う場合の変数の初期値は、
以下の3通りぐらいで設定することになりそうです。

  • その1)register_setting の中で設定
  • その2)add_option関数を使って設定
  • その3)update_option関数を使って設定

register_setting の中で設定

まずは折角仕様で用意されているので、
register_setting関数の中で初期値を設定するパターン。

PHP
register_setting(
	'field-group',	// ① グループ名(settings_fieldsの値と同じにする)
	'item',			// ② 設定値の名前(inputのname要素に同じにする)
	array(			// ③ 初期値やサニタイズ関数
		'sanitize_callback' => 'callback_func',
		'default' 			=> 'こんにちは'
	) 
);

function callback_func() {
	// xxxxx
}
Jin Simple Code Block

初期値は register_setting の第3引数(4行目~7行目)で
'default' にて指定すれば良いですね。
(get_option() で呼ばれた時の初期値の設定をしている)

add_option関数を使って設定

日本語の関数リファレンスにあるように、
第三引数にはコールバック関数の指定とするパターン。
(あとから add_option() を使って初期値を設定する)

PHP
register_setting(
	'field-group',	// ① グループ名(settings_fieldsの値と同じにする)
	'item',			// ② 設定値の名前(inputのname要素に同じにする)
	array(
		'sanitize_callback' => 'callback_func' // ③ サニタイズ関数
	)
);

add_option( 'item', 'こんにちは');	// ④ 初期値を設定
Jin Simple Code Block

参考)(英語)Reference / Functions / add_option()(ワードプレス公式)

add_option() は、
まだ変数(ここでは ' item')に値がセットされたことがなければ
指定した値(ここでは「こんにちは」)を初期値としてセットする。

その1)との違いは、実際にデータベースに値をセットするかどうか、
ということになるのかな?

この add_option() で初期値を設定する場合では、
一度でも何か入力されて、それが(いったんすべて削除され)空文字となっても、
すでに設定値がある(長さが0の文字列がある)ということで
何も動作しないようですね。(空文字を初期値に戻したりしない)

空文字になったら初期値に戻したい、という場合には、
以下の update_option() を使うのが良さそうです。

update_option関数を使って設定

空文字になったら初期値に戻したい場合のパターン。

PHP
register_setting(
	'field-group',
	'item',
	array(
		'sanitize_callback' => 'callback_func'
	)
);

function callback_func( $input ) {
	// 入力値が空文字(ユーザーがフォームを空にして保存した)の場合に初期値を返す
	if ( $input === '' ) {
		return 'こんにちは';
	}
	return $input;
}
Jin Simple Code Block

まず変数登録時に初期値も入れたいし、空文字になったらその初期値に戻したい、
という場合には、update_option() を使うのが良さそうです。

get_option() は、データが未登録のときは false を返しますが、一度保存されて「空の文字列」になっている場合は、そのまま空文字列(")を返します。

そのため、設定画面の読み込み時に判定すると、ユーザーが意図して空欄にしたい場合にも強制的に上書きされてしまう問題が起きます。

「空文字で保存されたら初期値に戻す」を安全に実現するには、保存直前に実行されるサニタイズ関数の中で入力値が空(")かどうかを調べ、空だった場合に初期値(ここでは 'こんにちは')を返してデータベースに保存させる、という感じですね。

⇒「Settings APIの使い方まとめ」に戻る

早期退職して海外で奮闘する JIN のメールマガジン

時間や場所に縛られず稼いだJINが教える

~ 最短で月収10万円稼げるようになる方法 ~

お名前/ニックネーム

隣のあの人にも、思わず教えたくなる秘密

配信停止は、いつでもできます

迷惑メールは一切配信されませんので、ご安心くださいね

自らの手で未来を変える力を手に入れる!

コメント