【スパム対策】フォームで日本語以外の入力制限を行う

使用しているフォームはWordPressのContact form7です。

以下2点に関して書いていきます。

  • functions.phpに記述する内容
  • 例外

functions.phpに記述する内容

これで、都道府県の欄に日本語以外を入力した場合に「日本語で入力してください」というエラーメッセージが表示されます。

function wpcf7_validate_anti_spam_prefectures( $result, $tag ) {
	$value = str_replace(array(PHP_EOL,' '), '', esc_attr($_POST['your-pref']));
	if (!empty($value)) {
		if (preg_match('/^[!-~]+$/', $value)) {
			$result['valid'] = false;
			$result['reason'] = array('your-pref' => '日本語で入力してください');
		}
	}
	return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_anti_spam_prefectures', 10, 2 );

都道府県の入力欄のinput要素のname属性は、your-prefです。

他の入力欄に適応させたい場合は、your-prefの部分を該当のname属性に変更します。

例えば、住所という入力欄のname属性が、your-addressの場合、以下のようになります。

function wpcf7_validate_anti_spam_address( $result, $tag ) {
	$value = str_replace(array(PHP_EOL,' '), '', esc_attr($_POST['your-address']));
	if (!empty($value)) {
		if (preg_match('/^[!-~]+$/', $value)) {
			$result['valid'] = false;
			$result['reason'] = array('your-address' => '日本語で入力してください');
		}
	}
	return $result;
}
add_filter( 'wpcf7_validate', 'wpcf7_validate_anti_spam_address', 10, 2 );

例外

上記の方法では、ラテン語を防ぐことができませんでした。

ラテン語の対策をするときは、こちらの記事に書いてある以下のコードを参考にしていくのが良いと思います。

//メールフォームの textarea にひらがなが無ければ送信できない(contact form7)
add_filter('wpcf7_validate_textarea', 'wpcf7_validation_textarea_hiragana', 10, 2);
add_filter('wpcf7_validate_textarea*', 'wpcf7_validation_textarea_hiragana', 10, 2);
 
function wpcf7_validation_textarea_hiragana($result, $tag)
{
    $name = $tag['name'];
    $value = (isset($_POST[$name])) ? (string) $_POST[$name] : '';
 
    if ($value !== '' && !preg_match('/[ぁ-ん]/u', $value)) {
        $result['valid'] = false;
        $result['reason'] = array($name => 'エラー / この内容は送信できません。');
    }
 
    return $result;
}

1点注意したいのが、この方法だと漢字のみの場合も弾いてしまうので、
ひらがなが必ず含まれるであろう「テキスト入力欄」に使用するのが望ましいです。

WordPressの記事一覧

CPT UIのカスタム投稿タイプの設定項目
Easy Table of Contentsでスクロールの高さを調整するには?
記事内リンクを別タブで開くようにする方法
カスタムフィールドの出力方法
出力する記事を指定する