MW WP Formでフォームを作っていると、「ある項目に入力があったときだけ、別の項目を必須にしたい」という条件付きのバリデーションが必要になることがあります。たとえば「その他」を選んだら、その内容欄を必須にする、といったケースです。
結論から言うと、mwform_validation_mw-wp-form-xxxフックを使い、条件に応じてset_rule()でバリデーションを追加することで実現できます。この記事では、そのフックの使い方と実装コード、バリデーション名の使い分けを解説します。
mwform_validation_mw-wp-form-xxxは、任意の入力フィールドにバリデーションを追加できるフックです。条件分岐でルールを出し分けたいときに便利です。
フック名の末尾xxxの部分には、フックを適用したいフォームの識別子(key)が入ります。keyは、フォームの作成画面に表示されているフォーム識別子で確認できます。たとえばmwform_formkey key="7188"と表示されていれば、xxxは7188です。
functions.phpに、次のようなコードを追加します。入力項目1に値があるとき、入力項目2を必須にする例です。
/**
* my_validation_rule
* @param object $Validation
* @param array $data
* @param MW_WP_Form_Data $Data
* $Validation::set_rule の引数は name属性値, バリデーション名, オプション
*/
function my_validation_rule($Validation, $data, $Data) {
if ($data['入力項目1']) {
$Validation->set_rule('入力項目2', 'noEmpty', array('message' => '未入力です'));
}
return $Validation;
}
add_filter('mwform_validation_mw-wp-form-xxxx', 'my_validation_rule', 10, 3);
if ($data['入力項目1'])で「入力項目1に値があるか」を判定し、値があるときだけset_rule()で入力項目2にバリデーションを設定しています。set_rule()の引数は「name属性値」「バリデーション名」「オプション」の3つで、オプションのmessageでエラー時の文言を指定できます。入力項目1・入力項目2には、実際のフォームのname属性を入れてください。
コールバックが受け取る3つの引数のうち、$dataには送信された各項目の値が入っています。$data['項目名']で個別の値を参照できるため、これを条件に使います。$Validationはバリデーションを管理するオブジェクトで、set_rule()でルールを追加する役割です。
応用として、たとえば「お問い合わせ種別」で『その他』が選ばれたときだけ『その他の内容』欄を必須にする、といった制御もできます。ifの条件をif ($data['種別'] === 'その他')のように書き換えれば、「値があるとき」だけでなく「特定の選択肢が選ばれたとき」という条件でも必須化できます。
必須にする項目の種類によって、指定するバリデーション名が変わります。
noEmptyrequiredテキスト欄なのにrequiredを指定したり、その逆にしたりすると、うまくバリデーションがかからないことがあります。項目のタイプに合わせて選ぶのがポイントです。
MW WP Formは、現在は開発・サポートが終了しています。既存サイトの保守では引き続き使う場面がありますが、新規構築では、Contact Form 7などほかのフォームプラグインもあわせて検討するとよいでしょう。今回のような条件付きバリデーションは、既存のMW WP Form案件を引き継いだときに役立つはずです。
mwform_validation_mw-wp-form-xxxフックで実装するxxxにはフォーム識別子(key)を入れるifで条件を判定し、set_rule()でバリデーションを追加するnoEmpty、ラジオ・チェックボックスはrequired「入力があったら別の項目も必須にする」という制御は、フォームの入力ミスを防ぐうえで効果的です。条件分岐のバリデーションを押さえておけば、複雑な入力要件にも柔軟に対応できます。