MW WP Form のカスタムバリデーションルール

MW WP Form プラグインは、確認画面付きのメールフォームを作成することができる WordPress のプラグインです。

このプラグインは、デフォルトで入力データを検証するためのルール(バリデーションルール)が豊富に用意されていて、基本的な問い合わせフォームなどのバリデーションを簡単に実装することができます。また、複雑な処理が必要な独自のバリデーションルールも簡単に追加することができます。

そこで、ここでは独自のバリデーションルールをいくつか紹介します。

最大チェック数制限チェックボックス

チェックボックスで最大チェック数を制限するバリデーションルールです。

下記コードをテーマの functions.php に追記します。

if ( class_exists( 'MW_WP_Form_Abstract_Validation_Rule' ) ) {
	class MW_WP_Form_Validation_Rule_MaxCheckBox extends MW_WP_Form_Abstract_Validation_Rule {
		protected $name = 'maxcheckbox';

		public function rule( $key, array $options = array() ) {
			$value = $this->Data->get( $key );
			if ( ! MWF_Functions::is_empty( $value ) ) {
				$separator = $this->Data->get_separator_value( $key );
				$values = explode( $separator, $value );
				if ( MWF_Functions::is_numeric( $options['max'] ) && count( $values ) > $options['max'] ) {
					$defaults = array(
						'max' => 0,
						'message' => sprintf( '最大 %d 個まで', $options['max'] )
					);
					$options = array_merge( $defaults, $options );
					return $options['message'];
				}
			}
		}

		public function admin( $key, $value ) {
			$max = '';
			if ( is_array( $value[$this->getName()] ) && isset( $value[$this->getName()]['max'] ) ) {
				$max = $value[$this->getName()]['max'];
			}
			?>
			<table>
				<tr>
					<td>最大チェック数</td>
					<td><input type="text" value="<?php echo esc_attr( $max ); ?>" size="3" name="<?php echo MWF_Config::NAME; ?>[validation][<?php echo $key; ?>][<?php echo esc_attr( $this->getName() ); ?>][max]" /></td>
				</tr>
			</table>
			<?php
		}
	}

	function mwform_validation_rule_maxcheckbox( $validation_rules ) {
		$instance = new MW_WP_Form_Validation_Rule_MaxCheckBox();
		$validation_rules[$instance->getName()] = $instance;
		return $validation_rules;
	}

	add_filter( 'mwform_validation_rules', 'mwform_validation_rule_maxcheckbox' );
}

いずれか必須項目

複数の項目(テキストやチェックボックスなど)のいずれかを必須とするバリデーションルールです。

下記コードをテーマの functions.php に追記します。

if ( class_exists( 'MW_WP_Form_Abstract_Validation_Rule' ) ) {
	class MW_WP_Form_Validation_Rule_AnyRequired extends MW_WP_Form_Abstract_Validation_Rule {
		protected $name = 'anyrequired';

		public function rule( $key, array $options = array() ) {
			$value = $this->Data->get( $key );

			if ( empty( $this->Data->gets() ) ) {
				return;
			}

			$targets = array_map( 'trim', explode( ',', $options['target'] ) );
			$targets[] = $key;

			$count = 0;
			foreach ( $targets as $target ) {
				$target_value = $this->Data->get( $target );
				if ( ! empty( $target_value ) || ! MWF_Functions::is_empty( $target_value ) ) {
					$count++;
				}
			}
			if ( $count == 0 ) {
				$defaults = array(
					'target' => null,
					'message' => sprintf( '%s のいずれも未入力です。', implode( ', ', $targets ) )
				);
				$options = array_merge( $defaults, $options );
				return $options['message'];
			}
		}

		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]" />
						<span class="mwf_note">(カンマ区切り)</span>
					</td>
				</tr>
			</table>
			<?php
		}
	}

	function mwform_validation_rule_anyrequired( $validation_rules ) {
		$instance = new MW_WP_Form_Validation_Rule_AnyRequired();
		$validation_rules[$instance->getName()] = $instance;
		return $validation_rules;
	}

	add_filter( 'mwform_validation_rules', 'mwform_validation_rule_anyrequired' );
}

日本語の必須項目

日本語文字(ひらがな、カタカナ、漢字)を含むことを必須とするバリデーションルールです。

下記コードをテーマの functions.php に追記します。

if ( class_exists( 'MW_WP_Form_Abstract_Validation_Rule' ) ) {
	class MW_WP_Form_Validation_Rule_Japanese extends MW_WP_Form_Abstract_Validation_Rule {
		protected $name = 'japanese';

		public function rule( $key, array $options = array() ) {
			$value = $this->Data->get( $key );
			if ( is_null( $value ) ) {
				return;
			}
			if ( preg_match( '/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]/u', $value ) ) {
				return;
			}
			$defaults = array(
				'message' => '日本語で入力してください。'
			);
			$options = array_merge( $defaults, $options );
			return $options['message'];
		}

		public function admin( $key, $value ) {
			?>
			<label><input type="checkbox" <?php checked( $value[ $this->getName() ], 1 ); ?> name="<?php echo MWF_Config::NAME; ?>[validation][<?php echo $key; ?>][<?php echo esc_attr( $this->getName() ); ?>]" value="1" />日本語を含む</label>
			<?php
		}
	}

	function mwform_validation_rule_japanese( $validation_rules ) {
		$instance = new MW_WP_Form_Validation_Rule_Japanese();
		$validation_rules[$instance->getName()] = $instance;
		return $validation_rules;
	}

	add_filter( 'mwform_validation_rules', 'mwform_validation_rule_japanese' );
}

追記

2019年9月25日 「いづれか必須項目」における、バリデーションを適用する項目がチェックボックスの場合に動作しない不具合を修正しました。