WordPressプラグインThrows SPAM Awayを使ってMW WP FormにNGワード指定などのバリデーションを追加する方法

## WordPressで使える超ステキなメールフォーム MW WP Form
すでに超有名ですので私の説明はいらないですね。
[MW WP Form](https://wordpress.org/plugins/mw-wp-form/)

公式サイト
[MW WP Formの使い方](http://2inc.org/manual-mw-wp-form/)

WordPressでメールフォーム作る時、私はこの一択です。

なんといっても柔軟！
デザインが犠牲にならない！

## WordPressのコメントスパム対策プラグインといえば・・・Throws SPAM Away
手前ミソですみません。

Throws SPAM Away というプラグインは「WordPressへの海外からのスパムコメントを排除する」目的で作られた純国産のプラグインで・・・私が作りました。

WordPressプラグインページ
[Throws SPAM Away](https://wordpress.org/plugins/throws-spam-away/)

公式サイト
[Throws SPAM Away](https://gti.co.jp/throws-spam-away)

# この２つを使って作れるメールフォーム用 NGワード バリデーション
今回、このプラグインのバージョン2.7をリリースするにあたりスパム判定メソッドを整理し外部から利用出来るようにいたしました。
※今回のサンプルはバージョン2.7からでのみ動作します。

そこで、その利用方法として使うことが多いだろうメールフォームへの転用をサンプルとして作ってみました。

NGワードというのは結構しんどいバリデーションではないでしょうか。
登録する管理画面も作るならばなおさらです。

今回のサンプルはNGワードをソース内で指定してバリデーションを行うようになっていますが
Throws SPAM Awayの設定画面から行った設定を活かすことも可能です。

IPアドレスのバリデーションは別メソッドですが可能なのでついでに掲載しました。

前提条件として上述の２つのプラグインをWordPressにインストールして有効化しておいてください。

## MW WP Formのフックを利用し作成しました。
今回利用したフックの詳細です。

### 任意の入力フィールドへのバリデーションを追加できるフック
[mwform_validation_mw-wp-form-xxx](http://plugins.2inc.org/mw-wp-form/filter-hook/mwform_validation/)

### バリデーションルールを追加する
[mwform_validation_rules](http://plugins.2inc.org/mw-wp-form/filter-hook/mwform_validation_rules/)

この２つを使ってMW WP Formへ Thows SPAM Awayの機能を利用したバリデーションを追加したサンプルです。

今回、テーマのfunctions.phpに追記してみました。

```lang:functions.php
/**
 * my_validation_mw
 * @param object $Validation
 * @param array $data
 * 
 * $Validation::set_ruleの引数は name属性値, バリデーション名, オプション
 */
function my_validation_mw( $Validation, $data ) {

        // set_ruleの引数は バリデーションをかけるエレメント名 , バリデーション名 となります。
	$Validation->set_rule( '内容', 'ngwords' ); // ※サンプルでは「内容」という名のエレメントに対してバリデーションを追加します

	return $Validation;
}
// mwform_validation_mw-wp-form-xxx の xxx は MW WP Formで作成したフォームのIDを入れる
add_filter( 'mwform_validation_mw-wp-form-xxx', 'my_validation_mw', 10, 2 );

/**
 * my_validation_rule
 * @param array $validation_rules バリデーションルールオブジェクトの配列
 * @param string $key フォーム識別子
 */
function my_validation_rule( $validation_rules, $key ) {

    // 追加するバリデーションルールのオブジェクトは MW_Validation_Rule クラスを継承している必要があります。
    $validation_rules['ngwords'] = new MW_WP_Form_Validation_Rule_Ngwords( $key );
    return $validation_rules;
}
// MW WP Formのバリデーションルールに独自ルールを追加する
add_filter( 'mwform_validation_rules', 'my_validation_rule', 10, 2 );

/**
 * MW WP Formに NGワード禁止 のバリデーションを追加するためのクラス
 * MW_WP_Form_Validation_Rule_Ngwords
 */
class MW_WP_Form_Validation_Rule_Ngwords extends MW_WP_Form_Abstract_Validation_Rule {

	/**
	 * バリデーションルール名を指定
	 * @var string
	 */
	protected $name = 'ngwords';

	/**
	 * バリデーションチェック
	 *
	 * @param string $key name属性
	 * @param array $option
	 * @return string エラーメッセージ
	 */
	public function rule( $key, array $options = array() ) {
		include_once( WP_PLUGIN_DIR.'/throws-spam-away/throws_spam_away.class.php');

		$throwsSpamAway = new ThrowsSpamAway();

		$args = array(
			  'post_id' => NULL,
			  'tsa_on_flg' => 0,	// 日本語利用していなくても可
			  // 下の行がなければThrows SPAM Awayで設定されたNGワードが禁止文字として有効になります。
			  'tsa_ng_keywords'	=>	"私はたわし,馬鹿"	// NGワード指定（カンマ区切りでいくつでも可）
			);
		$value = $this->Data->get( $key );
		$chk_result = $throwsSpamAway->validate_comment( "", $value, $args);
		if ( !MWF_Functions::is_empty( $value ) ) {

			// IPアドレスチェック（ついでに出来てしまうので一応・・・サンプル）
			$ip = $_SERVER['REMOTE_ADDR'];
			// ip_checkでの判定はThrows SPAM Awayの設定画面で登録されているIPアドレスにあればNGということになります。
			$chk_ip = $throwsSpamAway->ip_check( $ip );
			if ( ! $chk_ip ) {
				// 不正IPはそのままリダイレクトさせたり出来ます。
				header( 'Location: http://www.yahoo.co.jp' );
				die;
			}

			// validate_commentの返却値がFALSEならエラーがある
			if ( !$chk_result ) {
				// エラータイプを取得
				$error_type = $throwsSpamAway->error_type;
				$message_str = "";
				// エラーの種類によりエラーメッセージを変更する
				switch ( $error_type ) {
					case "ng_word":
						$message_str = "NGキーワードが含まれているため送信できません ";
						break;
					default:
						$message_str = "エラーが発生しました:".$error_type;
				}
				$defaults = array(
					'message' => $message_str
				);
			}
			$options = array_merge( $defaults, $options );
			return $options['message'];
		}
	}

	/**
	 * 設定パネルに追加
	 *
	 * @param numeric $key バリデーションルールセットの識別番号
	 * @param array $value バリデーションルールセットの内容
	 */
	public function admin( $key, $value ) {
	}
}
```

この他にも今回のサンプルではわざと外していますが、「日本語のみ」というのももちろん出来ます。
他のパターンや他のフォームでも出来たらまたアップします。