管理メニュー

PHP

【WordPress】管理画面に追加した項目の値を検証してエラー出力する方法

更新日:2023/02/02

WordPressの管理画面で入力した値を検証して、正しくない値のときエラー表示する方法をお伝えします。

 

入力値の検証例

管理画面で入力された値は、"pre_update_option_{$option_name}"フィルターで検証します。

$option_name = 'my_option_item';
register_setting( 'my_option_page', $option_name );

add_filter( "pre_update_option_{$option_name}"
	, function( $value, $old_value, $option){

		if( preg_match('/^[a-zA-Z]+$/',$value) ) return $value;

		add_settings_error($option, $option, 'アルファベットのみを指定', 'error');
		return $old_value;
	},10,3 );

この例では、入力された値にアルファベット以外の文字が含まれていたら、エラーと判断して登録をキャンセルしています。
また、エラーの内容を管理画面に表示しています。

 

解説

入力値の登録は、update_option()で行われます。
この関数は、入力値とデータベース上の値が同じときにデータベースの上書きがキャンセルされます。

つまり、値を検証して正しくないと判断した時は、入力値をデータベース上の値と同じ値に変更する必要があります。

入力値の検証方法として、register_setting()の第三引数を利用する方法を紹介しているケースがあります。
しかし、この方法では上手くいきません。

register_setting()の第三引数ではダメ

register_settingの第三引数はコールバック関数を指定でき、この関数の結果は入力値と置き換えられます。

しかし、このコールバックは入力値をサニタイズ(値の無害化)するためのものです。
そのためか、データベース上の値はコールバック関数内に渡されません。

つまり、データベース上の値を返すことができないのです。
結果として上書きをキャンセルできません。

phpでは、関数が何も値を返さないときはnull値が返ったとみなされます。
つまりデータベースには、null値が登録されます。

入力値のフィルターフックを利用

そこで、"pre_update_option_{$option_name}"フィルターを使用します。
これは入力値をフィルターするフックで、前項のコールバックが呼び出された後に、呼び出されます。

このフィルターは3つの引数をコールバック関数に渡します。

  • 第一引数 $value: 入力された値
  • 第二引数 $old_value: 現在(データベース上)の値
  • 第三引数 $option_name: オプションの名前

フィルターフックで$old_valueを返すことで、データベースへの登録をキャンセルできます。

管理画面のメッセージ表示

add_settings_error()を呼び出すことで、管理画面に表示するメッセージを登録しています。

add_settings_error()については、次のページを読んでみてください。
【WordPress】管理画面上部にadd_settings_error()でメッセージを表示する

 

メッセージが表示されない時の対象法

デフォルトでは『設定』の各サブメニューと一部のメニューのみ、add_settings_error()で登録されたメッセージを表示しています。

その他の管理画面でメッセージを表示するときは、settings_errors()を実行する必要があります。

詳しくは、次のページを読んでみてください。

WordPressはHTMやCSSの知識も必要。総合的な知識を身につけよう。

更新日:2023/02/02

書いた人(管理人):けーちゃん

スポンサーリンク

記事の内容について

null

こんにちはけーちゃんです。
説明するのって難しいですね。

「なんか言ってることおかしくない?」
たぶん、こんなご意見あると思います。

裏付けを取りながら記事を作成していますが、僕の勘違いだったり、そもそも情報源の内容が間違えていたりで、正確でないことが多いと思います。
そんなときは、ご意見もらえたら嬉しいです。

掲載コードについては事前に動作確認をしていますが、貼り付け後に体裁を整えるなどをした結果動作しないものになっていることがあります。
生暖かい視線でスルーするか、ご指摘ください。

ご意見、ご指摘はこちら。
https://note.affi-sapo-sv.com/info.php

 

このサイトは、リンクフリーです。大歓迎です。