最近、怪しいリンクを開かせようとする迷惑メールが多いと感じませんか。お問い合わせフォームから届くと、「仕事の相談かもしれない」と思って文面を確認しますよね。そのたびに、返信すべき連絡なのか、リンクを開いて大丈夫なのかを見極めるのは手間がかかります。
そこで、運用しているContact Form 7のお問い合わせフォームに、本文に漢字とひらがながそれぞれ含まれるかを確かめる入力チェックを追加しました。導入後、このフォームではそれまで届いていたスパムが届かなくなりました。
ここでは、英語や中国語だけの投稿を弾く仕組みと、特定のフォームに絞って使えるPHPコードを紹介します。元の正規表現では、句点の「。」があるだけで漢字側の条件を通る場合もあったので、その修正版も用意しました。
英語や中国語だけの迷惑投稿を弾く仕組み
チェックするのは、本文に漢字とひらがながそれぞれ1文字以上あるかです。英字だけの投稿にはこの2種類の文字がなく、漢字で書かれた中国語の投稿も、ひらがながなければエラーになります。日本語の文章に英単語や数字が混じっていても、両方の条件を満たせば通ります。
Contact Form 7の送信時に動くPHPの入力検証を使います。条件を満たさない場合は「お問い合わせ内容」の欄にエラーを表示し、送信を止めます。フォームIDと項目名の両方を指定するので、同じ項目名を使う別のフォームにはこのルールを適用しません。 Contact Form 7公式のカスタム検証
「。」だけで漢字側の判定を通る理由
元のコードは、漢字側に \p{Han}、ひらがな側に [ぁ-ゖ] を使っています。PCRE2 10.40以降では、\p{Han} は漢字と一緒に使われる一部の記号にも一致します。ローカルのPHPで比較すると、「おみつもりをおねがいします。」は、漢字がなくても句点で条件を満たしました。 PCRE2公式の文字種判定の仕様
修正版では漢字側を \p{Unified_Ideograph} に変えます。UnicodeのCJK統合漢字に絞るので、「。」や「、」を漢字として数えません。この条件では「々」や「〇」も数えません。以下の表はサンプルの正規表現を比較した結果で、冒頭の実運用の結果とは別です。 Unicodeの文字プロパティ仕様
| お問い合わせ内容の作例 | 元の判定 | 修正版 |
|---|---|---|
| 制作費のお見積もりをお願いします。 | 通過 | 通過 |
| Please open the link. [URL省略] | エラー | エラー |
| 请点击链接。[URL省略] | エラー | エラー |
| 請點擊連結。[URL省略] | エラー | エラー |
| おみつもりをおねがいします。 | 通過 | エラー |
| 見積希望 | エラー | エラー |
| Please open the link. 漢あ | 通過 | 通過 |
特定のフォームにだけ適用するPHPコード
このサンプルは、数値のフォームIDが 22 で、項目名が your-message のテキストエリアだけを検証します。日本語で受け付けるフォームかを確認してから、次の手順で試してください。
- WordPress管理画面の「お問い合わせ」で対象フォームを編集します。編集画面のURLにある
post=の後ろの数字で、コードの22を置き換えます。ショートコードのIDがハッシュ形式でも、ここで使うのは数値の投稿IDです。 Contact Form 7のフォームIDの仕様 - 「フォーム」タブで本文欄の項目名を確認します。
[textarea* your-message]ならそのまま使えます。別の項目名なら、コードの'your-message'を書き換えます。 - WordPressが動くサーバーのPHPでPCRE2のバージョンを確認します。この例はPCRE2 10.40以降が前提です。サーバーでCLIを使える場合は
php -r 'echo PCRE_VERSION, PHP_EOL;'で確認できます。CLIとサイト側が同じPHPを使っているかも確認してください。 PHPのPCRE2同梱バージョン - 検証環境で、下のコードを
wp-content/mu-plugins/cf7-japanese-message.phpとして保存します。ディレクトリがなければ作成します。この場所のPHPは自動で読み込まれます。停止する場合はファイルをこのディレクトリから外します。 WordPress公式のMUプラグイン解説
<?php
/**
* Plugin Name: Contact Form 7 お問い合わせ内容の文字チェック
*/
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
add_filter( 'wpcf7_validate_textarea', 'yomowebb_cf7_validate_japanese_message', 20, 2 );
add_filter( 'wpcf7_validate_textarea*', 'yomowebb_cf7_validate_japanese_message', 20, 2 );
function yomowebb_cf7_validate_japanese_message( $result, $tag ) {
$form = WPCF7_ContactForm::get_current();
// 22 は対象フォームの数値ID、your-message は項目名です。
if ( ! $form || 22 !== (int) $form->id() || 'your-message' !== $tag->name ) {
return $result;
}
$value = $_POST[ $tag->name ] ?? null;
$message = is_string( $value ) ? wp_unslash( $value ) : '';
$has_kanji = 1 === preg_match( '/\p{Unified_Ideograph}/u', $message );
$has_hiragana = 1 === preg_match( '/[ぁ-ゖ]/u', $message );
if ( ! $has_kanji || ! $has_hiragana ) {
$result->invalidate(
$tag,
'お問い合わせ内容には、漢字とひらがなをそれぞれ1文字以上含めてください。'
);
}
return $result;
}
任意の [textarea] にもこのチェックを追加しているため、空欄では送れません。本来は空欄でも送れるようにしたい場合は、本文を必須にするかどうかを決めてから適用してください。 Contact Form 7のフォームタグ仕様
導入前に試しておきたい送信
英語だけ・中国語だけの作例が止まることに加えて、実際の利用者が入力しそうな文章で、問い合わせが届くことまで確認します。
- 「制作費のお見積もりをお願いします。」で送信し、メールが届く。
- 英語だけ、ひらがなを含まない中国語、空欄で、対象欄にエラーが表示される。
- 別のフォームでは、今まで受け付けていた入力が引き続き送れる。
入力欄の近くには「漢字とひらがなをそれぞれ1文字以上含めてください(例:制作費のお見積もりをお願いします)」と添えると、送信前に条件が伝わります。英語や中国語でも正当な問い合わせを受け付ける窓口なら、この文字条件をかけると、その問い合わせまで弾きます。
よくある質問
不審なリンクが入っていれば、必ず止まりますか?
漢字とひらがなを含む本文は、リンクが入っていても文字チェックを通ります。届いたリンクが不審なら開かず、実在するサービスを名乗っている場合は、普段使っている公式サイトなどから確認してください。 IPAの日常における情報セキュリティ対策
多言語で問い合わせを受け付ける場合は?
言語を問わず受け付けたいフォームでは、文字条件を付けず、Contact Form 7が案内しているTurnstileやAkismetなどを検討できます。 Contact Form 7公式のスパム対策





