最近このブログの問い合わせフォームから「ヴィトンを買ってください!安いですよ!」的な英文メールが届くようになりました。 ぼくヴィトンよりプラダの方が好みですし、そもそもこんなメールはお断りしたいところ。 CAPTCHA(ぐにゃぐにゃの画像のヤツ)を使うのはなんか屈した気がします。 そこで、Japanese Onlyなサイトには鉄板の方法「本文に日本語が含まれていない時はエラーを返す」ようにしました。

実装方法

functions.phpに以下を記述するだけ。
add_filter( 'wpcf7_validate_textarea', 'wpcf7_text_validation_filter_extend_kana', 11, 2 );
add_filter( 'wpcf7_validate_textarea*', 'wpcf7_text_validation_filter_extend_kana', 11, 2 );
function wpcf7_text_validation_filter_extend_kana( $result, $tag ) {
  // ひらがなが含まれているかチェック
  if ('textarea' == $tag['type'] && !preg_match('/[ぁ-ん]+/u', $_POST[$tag['name']])) {
    $result['valid'] = false;
    $result['reason'][$tag['name']] = '入力エラーです。';
  }
  return $result;
}
日本語といってもカタカナのない文章は十分ありえますし、幼女からのメッセージには漢字がないかもしれません。なので「ひらがながなければエラーを返す」ようにしました。 (カタカナだけとか昭和な宇宙人的な考えはやめてくださいね)

編集箇所

5行目:’textarea’ と 7行目:’入力エラーです。’ の2箇所を適切変更します。

7行目:’入力エラーです。’

日本語が含まれていなかった時に表示されるメッセージです。シングルクォーテーションを入力するとエラーになりますので気をつけて。

5行目:’textarea’

フォームのレイアウト設定のところで確認してください。 たとえばこのブログなら…
<div class="wpcf7_box">
<div class="wpcf7_label">メッセージ本文</div>
[textarea your-message] ← これのtextarea の部分
</div>
といった具合。

まとめてきな

まだ効果のほどは測っていませんが、減ればいいなぁと。しばし様子みます。 そしてデフォルトのフォームだと有効になっていないのですが、おなじみのスパムフィルタ、Akismetを有効にするのはかなり有効ですよと。 WordPressにデフォルトでインストールされているAkismetプラグインと連携しているので、そっちのAPIの設定さえ終わっていれば、フォーム編集画面のタグの作成でもAkismet (オプション)にチェックを入れてタグを再設定するだけで簡単にスパムフィルタリングが行えます。
Special Thanksてきな