ワードプレス(WordPress)

WordPressのコンタクトフォーム7で日本語を含まない文章の送信をさせないように「functions.php」をカスタマイズ

この記事は約5分で読めます。

「functions.php」をカスタマイズWordPressのコンタクトフォーム7は優秀なプラグインである。しかし、最近とくに英文のみのスパムメールが急増して困っていた。「Akismet」を使えばスパム問題を解決できそうだが、商用サイトでは無料で使えない。Googleの「reCAPTCHA」を使う方法もよさそうだったが、自分のサイトでない場合には設定が面倒そうである。
そこで、今回はWordPressの「functions.php」をカスタマイズして日本語のひらがなを含まない文章の場合は送信ができないようにした。

スパム送信対策のカスタマイズ

「functions.php」をカスタマイズする

WordPressの「functions.php」は、
/wp-content/themes/********/functions.php
というように、テーマのフォルダに入っています。「********」の部分はテーマ名になっていることが多いです。たいていのワードプレスには複数のテーマが入っているので、修正したい「functions.php」が入っているテーマを間違えないように注意しましょう。

また、「functions.php」は重要なファイルで、誤って削除したり間違った修正をすると、ワードプレスが動かなくなってしまうことがあります。カスタマイズする場合は必ずバックアップをとってから行うようにしてください。

「functions.php」をカスタマイズして「ひらがな」を含まない文章は送信できなくする

エディタで「functions.php」を開き、最末尾に以下のソースを貼り付け、FTPでアップロードするだけでOK。

カスタマイズは以下のようにした。

contact7kaizouengng.jpg

▼実際に使用したソース

//– Contact Form 7 英語のみの投稿は送信できない
add_filter(‘wpcf7_validate_textarea’, ‘ktzw3’, 10, 2);
add_filter(‘wpcf7_validate_textarea*’, ‘ktzw3’, 10, 2);
function ktzw3($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;
}

英文だけで入力し「送信」をクリックすると、「日本語で入力おねがいします」と警告が表示される。さらにフォーム下部に「入力内容に問題があります。確認して再度お試しください。」と表示され、送信することができなくなる。

▼実装テストをしたコンタクトフォーム
https://sindan.org/contactform/
※現在はこの方法ではなくリキャプチャを使う方法に変更しています

参考にした記事は以下のとおり

Akismet によるスパムフィルタリング | Contact Form 7 [日本語]
Contact Form 7 スパムメールの3つの対策(Akismet不要)とメリットデメリットまとめ。 | KodoCode
WordPressプラグイン「コンタクトフォーム」は便利だが、海外からのSPAMメール対策は必須。 サイト/ブログを運営する場合、問い合わせフォームが必要な場合は多いです(Goog...

https://tomozo-music.net/html/2019/スパム対策-contact-form-7-英語のみ、日本語が含まれていな/

今のところうまくいっているようである。しばらくこれで様子を見ることにする。

「functions.php」をカスタマイズして「日本語」を含まない文章は送信できなくする

別の方法も試してみました。

上記の方法だと「ひらがなを含まない」ということなので、漢字やカタカナだけの場合も判定されてしまいます。そこで、ひらがなだけでなく漢字やカタカナも含んだ「日本語を含まない」という判定方法も試してみました。対象とするのは本文(内容)の欄だけです。

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

この方法は
https://kodocode.net/wordpress-plugin-contactform-secure/
を参考にしました。

ただし「your-subject」の部分を「your-message」に変更しています。
「your-subject」だと題名部分なので、題名部分をフォームに入れていない場合は効果がないので、本文内容にあたる「your-message」に変更しました。変更箇所が2箇所あるのでご注意を。

spammailcheckfunctionsphp640.jpg

オリジナルのデザインテーマを利用しているワードプレスサイトで試したところうまくいきました。

注意>ワードプレスのテーマをアップデートした場合は再設定が必要です

なお、このWordPressの「functions.php」をカスタマイズする方法には欠点があります。
それはワードプレスのテーマを最新版にアップデートすると「functions.php」が上書きされることがあるからです。

その場合は、上記の設定はすべて消えますので、あらためて設定してください。
バックアップファイルは時系列で保存しておきましょう、ということですね。