解決】Contact Form 7(コンタクトフォーム)で、日本語以外のお問い合わせをエラーにする方法。海外からスパム投稿を防ぐ。
Contact Form 7、便利なのですが、出回ってるだけあって自動でスパムを送信する方法も確立されてるそうです。
一度、スパマーにサイトが見つかると、延々とスパムメールや、踏み台にして他の人にスパム行為を繰り返します。
なので「お問い合わせ内容欄」に日本語がふくまれていなければエラーとすることにしました。
お問い合わせ欄(your-message)に日本語が含まれないをどう判断するか?
「日本語が含まれない」というのをプログラムで判定するのは中々難しいです。
なので単純に「英数字だけだったらエラー」とすることにしました。
実装はこんな感じです。
ワードプレスのテーマのfunctions.phpに記述すれば、お問い合わせ欄が英数字のみならエラーにしてくれます。
「お問い合わせ欄」は、任意項目(必須じゃない)場合が多いので、その場合は、お問い合わせ内容が入っているかどうか?のチェックも必要です。
function wpcf7_validate_extend_mycheck( $result) {
if( $_POST['your-message'] ) ){
if( preg_match( "/^[0-9A-Za-z]*$/" , $_POST['your-message'] ) ){
$result->invalidate( 'your-message', 'お問い合わせ内容は日本語でお願いします。');
}
}
return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_extend_mycheck', 20, 2 );
これだとウムラウト(ö、ü)がすり抜ける
これ、ウムラウト(ö、ü)のような文字だとすり抜けました。
なので、
function wpcf7_validate_extend_mycheck( $result) {
if( $_POST['your-message'] ) ){
if (!preg_match("/[ぁ-ん]+|[ァ-ヴー]+|[一-龠]/u", $_POST['your-message'] )) {
$result->invalidate( 'your-message', 'お問い合わせは日本語にてお願いいたします。');
}
}
return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_extend_mycheck', 20, 2 );
に変更しました。