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

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

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

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

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

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

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

if ( class_exists( 'MW_WP_Form_Abstract_Validation_Rule' ) ) {
	class MW_WP_Form_Validation_Rule_CheckBoxCount extends MW_WP_Form_Abstract_Validation_Rule {
		protected $name = 'checkboxcount';

		public function rule( $key, array $options = array() ) {
			$value = $this->Data->get( $key );
			if ( MWF_Functions::is_numeric( $options['min'] ) || MWF_Functions::is_numeric( $options['max'] ) ) {
				$separator = $this->Data->get_separator_value( $key );
				if ( ! empty( $separator ) ) {
					$count = 0;
					if ( ! MWF_Functions::is_empty( $value ) ) {
						$values = explode( $separator, $value );
						$count = count( $values );
					}

					$defaults = array(
						'min'     => 0,
						'max'     => 0,
						'message' => '',
					);

					if ( $options['min'] === $options['max'] ) {
						$defaults['message'] = sprintf( '%d 個選択してください。', $options['min'] );
					} else if ( empty( $options['max'] ) ) {
						$defaults['message'] = sprintf( '%d 個以上選択してください。', $options['min'] );
					} else if ( 0 === (int) $options['min'] ) {
						$defaults['message'] = sprintf( '%d 個以下選択してください。', $options['max'] );
					} else {
						$defaults['message'] = sprintf( '%d 個から %d 個選択してください。', $options['min'], $options['max'] );
					}
			
					if ( $options['min'] > $count ) {
						$options = array_merge( $defaults, $options );
						return $options['message'];
					} else if ( 0 !== (int) $options['max'] && $options['max'] < $count ) {
						$options = array_merge( $defaults, $options );
						return $options['message'];
					}
				}
			}
		}

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

	function mwform_validation_rule_checkboxcount( $validation_rules ) {
		$instance = new MW_WP_Form_Validation_Rule_CheckBoxCount();
		$validation_rules[$instance->get_name()] = $instance;
		return $validation_rules;
	}

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

いずれか必須項目

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

下記コードをテーマの 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'] ) );
			array_unshift( $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->get_name()] ) && isset( $value[$this->get_name()]['target'] ) ) {
				$target = $value[$this->get_name()]['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->get_name() ); ?>][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->get_name()] = $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->get_name() ], 1 ); ?> name="<?php echo MWF_Config::NAME; ?>[validation][<?php echo $key; ?>][<?php echo esc_attr( $this->get_name() ); ?>]" value="1" />日本語を含む</label>
			<?php
		}
	}

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

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

追記

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

2021年8月12日 「最大チェック数制限チェックボックス」に最小個数の項目を追加して 「チェック数制限チェックボックス」へ変更しました。

コメント

  • MW WP Form のバリデーションルールについて教えてください。 現在、名前、ふりがななど全てバリデーションルールをつけて必須にしています。
    未入力のまま送信した場合は、赤字で未入力と出るのですが、 たくさん問い合わせがきて何かのタイミングで、赤字が出ない時があります。そうなると、名前等を入れても送信できなくなります。 その時はMW WP Formの作成フォームから更新をおすと、未入力もしっかり出て送信もできるのですが、
    何かの不具合でしょうか?
    わかる範囲でも構わないので教えていただければと思います

  • 日本語の必須項目について、活用させて頂きました。
    ありがとうございました!!

  • MW WP Form のバリデーションルールについて質問があります。

    例えば「当HPをどちらで知りましたか?」の項目があり、
    「広告媒体(チラシ・はがき等)」・「インターネット・ラジオなど」・「案内・紹介」のそれぞれにチェックボックスがあったとします。
    それぞれのカテゴリーのチェックボックスのnameはバラバラの場合、エラーチェック時に3つまとめてエラー判別をする事は可能ですか?

    ↓このようなイメージ
    【広告媒体(チラシ・はがき等)】name=”type01″
    └□1
    └□2
    └□3

    【インターネット・ラジオなど】name=”type02″
    └□a
    └□b

    【案内・紹介】name=”type03″
    └□あ
    └□い

    • こんにちは、コメントありがとうございます。
      「いずれか必須項目」でできると思いますが、できませんか?
      バリデーションルールの例)
      バリデーション適用: type01
      いずれか必須項目: type02,type03

      • 試してみたのですが、エラー文が3つ表示されました

        type01・type02・type03のどこかにチェックが入っていたらエラーを出さず、
        どこにもチェックが入ってなかったらエラーを出すというイメージです

        ↓↓エラーあり↓↓
        【広告媒体(チラシ・はがき等)】name=”type01″
        └□1
        └□2
        └□3

        【インターネット・ラジオなど】name=”type02″
        └□a
        └□b

        【案内・紹介】name=”type03″
        └□あ
        └□い
        ※いずれかにチェックを入れてください。

        ↓↓エラーなし↓↓
        【広告媒体(チラシ・はがき等)】name=”type01″
        └□1
        └□2
        └□3

        【インターネット・ラジオなど】name=”type02″
        └□a
        └■b←チェック状態

        【案内・紹介】name=”type03″
        └□あ
        └□い

          • 「type02, type03, type01 のいずれも未入力です。」
            この順番を1・2・3に変更できますか?

          • 言われてみれば対象フィールドは先頭のほうがいいですね。
            「いずれか必須項目」のコードを変更しましたので、再度コピペして試してみてください。

  • 海外のメールを除外するために検索で飛んできました。

    「日本語を含む PHP」などで検索するとだいたいどこのサイトも
    preg_match(“/^[ぁ-んァ-ン一-龠]+/u” , $value )
    ▲こう紹介しているのですが、1文字でも英語が含まれるとfalseが返されてしまうので困っていました。

    日本語の必須項目の中の
    preg_match( ‘/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]/u

    これで日本語と英語が混在していても通るようになりました。
    これからまだ検証しますが、取り急ぎお礼申し上げます。ありがとうございました!

  • 日本語の必須項目を利用させていただいてますがPCではバリデーションが効くのですがスマホ(ios・Android共)ではすり抜けてしまいます。何か設定が違うのでしょうか?

    • はじめまして、こんにちは。
      現象を再現することができませんでした。原因もまったく思いつきません。
      お役に立てず、すみません。m(__)m

  • はじめまして。MW WP Formから海外スパムが大量に来ていた関係で頭を悩ませておりましたが、「日本語の必須項目」のバリデーション追加につきまして大変有用でした。だいたいのスパムを弾けるようになり、本当にありがとうございました。(ご返信不要です)

  • いつもとても助かっています。

    デバッグモードで440エラー出てしまい、
    $validation_rules[$instance->getName()] = $instance;
     ↓
    $validation_rules[$instance->get_name()] = $instance;
    にしたらエラーは消え、動作も大丈夫でした。

    他、$value[$this->getName()]の部分の「getName」も、「get_name」に変更した方がいいのでしょうか?

    • はじめまして、こんにちは。
      $this->getName() の方も、get_name() の方がいいようです。
      この度はありがとうございました。
      ※ 記事のコードは修正しました。

  • コメント失礼いたします◎
    「いずれか必須項目」について活用させていただきました。
    これについて質問なのですが、
    セレクトボックスの場合、valueが空になるよう設定した
    「:選択してください」が確認画面のみ表示されてしまいます。
    自動返信メールには反映されていません。
    確認画面で「選択してください」を非表示、もしくは
    「未選択」のように表示させることは可能でしょうか?
    ご教授いただけると幸いですm(__)m

      • サンプルコードを上げておきます。

        function my_mwform_post_content_raw( $content, $data ) {
        	if ( 'confirm' == $data->get_view_flg() ) {
        		$content = str_replace( '選択してください', '未選択', $content );
        	}
        	return $content;
        }
        add_filter( 'mwform_post_content_raw_mw-wp-form-683', 'my_mwform_post_content_raw', 10, 2 );

コメントを残す

メールアドレスが公開されることはありません。

日本語でコメントを入力してください。(スパム対策)