6
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

WordPressで使える超ステキなメールフォーム MW WP Form

すでに超有名ですので私の説明はいらないですね。
MW WP Form

公式サイト
MW WP Formの使い方

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

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

WordPressのコメントスパム対策プラグインといえば・・・Throws SPAM Away

手前ミソですみません。

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

WordPressプラグインページ
Throws SPAM Away

公式サイト
Throws SPAM Away

この2つを使って作れるメールフォーム用 NGワード バリデーション

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

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

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

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

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

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

MW WP Formのフックを利用し作成しました。

今回利用したフックの詳細です。

任意の入力フィールドへのバリデーションを追加できるフック

mwform_validation_mw-wp-form-xxx

バリデーションルールを追加する

mwform_validation_rules

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

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

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 ) {
    }
}

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
6
Help us understand the problem. What are the problem?