WordPressを利用している方は、Contact Formを導入している人が多いと思います。設定も設置も簡単なお問い合わせフォームのプラグインです。
このContact Formのデメリットは、スパムメールが大量に送られてくることです。開設直後でPVがほとんどないブログでさえ、毎日10件以上のスパムが……スパム対策プラグイン「Akismet」を入れてみても変わりませんでした。
Contact Formのスパム対策には他にGoogleのreCAPTCHAを使う方法や、Contact Formに送信確認のチェックボックスを入れる方法もあります。これだと会員登録の手間や、ユーザーの利便性が下がるなどのデメリットがあります。
そこで今回はコピペでOK、会員登録も不要で、お問い合わせしてくれる人の利便性も下がらないスパム対策を紹介します。
スパム対策の仕組みと対象サイト
スパムメールのほとんどは海外からのメールです。本文に日本語が含まれていないメールを弾けば多くのスパムを排除することができます。
これは日本人をターゲットにしているサイトのみ有効な手段です。外国からのメールも受け付けたい場合は使えませんので、reCAPTCHA等他のスパム対策を利用してください。
スパム対策のやり方
スパム対策用のコードをfunction.phpに貼り付けます。本文にひらがなが含まれているかどうかをチェックしています。Contact Form側の設定は特に変えなくて大丈夫です。
//コメントスパム
function wpcf7_check_spam( $result, $tag ) {
$str = str_replace(array(PHP_EOL,' '), '', esc_attr($_POST['your-message']));
if (!empty($str)) {
if (!preg_match( '/[ぁ-ん]/u', $str)) {
$result['valid'] = false;
$result['reason'] = array('your-message' => '日本語で入力してください');
}
}
return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_check_spam', 10, 2 );

ひらがなが含まれていない場合に「日本語で入力してください」というメッセージが表示されるようになります。他のメッセージに変えたい場合は修正してください。
最初はアルファベットのみで構成されたメールを弾く方法を紹介している記事を参考にしてみたのですが、全角のロシア語メールが送られてきて上手くいきませんでした。最終的に、ひらがなチェックをするというシンプルな方法に行きつきました。日本語のチェックロジックは下記のページを参考にしました。