【WordPress】MW WP Formで他の項目と同じ入力があったらエラーにする入力チェックを追加する

【WordPress】MW WP Formで他の項目と同じ入力があったらエラーにする入力チェックを追加する

セミナーやイベントの予約であったり、施設見学や面接の日程のようないくつか希望日を入力するフォームを作る際に、「同じ日付が入力されたらエラーにする」という入力チェックをMW WP Formに追加する方法のメモです。

独自入力チェックの追加方法

MW WP Formではフォームの入力チェックを「バリデーションルール」で設定できます。

用意されたルールの他にPHPカスタマイズで独自ルールを追加することもできます。
独自バリデーションルール追加の流れはこちらを参考にしてください▼

同じ日付が入力されていたらエラーにするルールの追加

PHP側のカスタマイズ

「特定の項目と一致したらエラー」としたいので、「特定の項目と一致していない場合にエラー」とするMW_WP_Form_Validation_Rule_Eqを参考にクラスを作ります。

if ( class_exists( 'MW_WP_Form_Abstract_Validation_Rule' ) ) {
	class MW_WP_Form_Validation_Rule_Not_Eq_Date extends MW_WP_Form_Abstract_Validation_Rule {

		protected $name = 'not_eq';

		private $field_names = array(
			'date1' => '予約希望日1',
			'date2' => '予約希望日2'
		);
	
		public function rule( $name, array $options = array() ) {
			$value = $this->Data->get( $name );
	
			if ( is_null( $value ) ) {
				return;
			}

			$defaults = array(
				'target'  => '',
			);
			$options = array_merge( $defaults, $options );
			$targets = explode( ',', $options['target'] );
			foreach ( $targets as $target ) {
				$target_value = $this->Data->get( trim( $target ) );
				if ( ! is_null( $target_value ) && ( string ) $value === ( string ) $target_value ) {
					if ( isset( $this->field_names[ $target  ] ) ) {
						return $this->field_names[ $target  ] . 'と違う日付を入力してください。';
					} else {
						return '他の希望日と違う日付を入力してください。';
					}
				}
			}
		}
	
		public function admin( $key, $value ) {
			$target = '';
			if ( is_array( $value[ $this->getName() ] ) && isset( $value[ $this->getName() ]['target'] ) ) {
				$target = $value[ $this->getName() ]['target'];
			}
			?>
			<table>
				<tr>
					<td>一致したらエラーにする希望日項目名(カンマ区切り)</td>
					<td><input type="text" value="<?php echo esc_attr( $target ); ?>" name="<?php echo MWF_Config::NAME; ?>[validation][<?php echo $key; ?>][<?php echo esc_attr( $this->getName() ); ?>][target]" /></td>
				</tr>
			</table>
			<?php
		}
	}
	
	function mwform_validation_rule_not_eq_date( $validation_rules ) {
		$instance = new MW_WP_Form_Validation_Rule_Not_Eq_Date();
		$validation_rules[$instance->getName()] = $instance;
		return $validation_rules;
	}
	add_filter( 'mwform_validation_rules', 'mwform_validation_rule_not_eq_date' );
}

バリデーションルールの設定

コードが追加できたら、バリデーションルールを設定します。

MW WP Formで日付選択の重複チェックを追加

今回の例では第3希望日まで入力できて、全て別々の日付を入力してもらう想定です。

入力チェック確認

▲実際の入力チェックの表示です。

画像ではすべて同じ日付が入っているので「予約希望日1と違う日付を入力してください。」が表示されていますが、予約希望日2と予約希望日3だけ同じ日付にした場合では「予約希望日2と違う日付を入力してください。」が表示されます。

まとめ

今回は日付の入力でしたが、日付以外でも活用できると思いますので必要に応じて適宜カスタマイズしてみてください。

ではまた。

WordPressカスタマイズ入門に最適な書籍を執筆しました!

WordPress 5.x 対応!Gutenbergを使った投稿の作成方法からWordPressブログをかっこよくカスタマイズするためのポイントを紹介した書籍を執筆しました!

詳しく見る