2026年7月22日
2026年7月22日
WordPressにreCAPTCHA v3を設定する方法|キーの作成・Contact Form 7・コメント欄への導入
reCAPTCHA v3 は、Google が提供するボット判定の仕組みです。チェックボックスや画像選択を出さず、ページ上での操作をもとに 0.0〜1.0 のスコアを返します。1.0 に近いほど人間らしく、0.0 に近いほどボットらしいという判定です。サイト側はこのスコアを見て、フォームの送信を受け付けるかどうかを決めます。
この記事では、2026年10月時点の手順で、キーを作り、WordPress のお問い合わせフォーム(Contact Form 7)とコメント欄に reCAPTCHA v3 を入れる方法を説明します。
reCAPTCHA v3の仕組みと注意点
- ブラウザ側で
grecaptcha.execute()を呼ぶとトークン(使い捨ての文字列)が発行され、フォームと一緒にサーバーへ送ります - サーバー側はトークンを Google の検証 API(
https://www.google.com/recaptcha/api/siteverify)に送り、スコアと「どの操作で発行されたか」(action)を受け取ります - トークンの有効期限は2分で、検証できるのは1回だけです。ページを開いたときではなく、送信ボタンを押したときに発行します
- Google の説明では、しきい値は 0.5 から始めることが案内されています。スコアが低い送信をすぐ拒否するのではなく、管理者の確認に回すといった使い方もできます
キーを作成する(2026年10月時点)
Google は reCAPTCHA のキーを Google Cloud のプロジェクトで管理する方式に移しました。Google Cloud のドキュメント(2026年10月時点)によると、従来の管理画面(https://www.google.com/recaptcha/admin)で作る「Classic」キーは新規に作れなくなっており、既存の Classic キーも Google Cloud のプロジェクトへの移行が進められています。新しくキーを作る場合は Google Cloud コンソールを使います。
- Google Cloud コンソールにログインし、プロジェクトを選びます(なければ作成します)
- 「Fraud Defense」(reCAPTCHA の管理画面)を開き、「Keys」タブで「Create key」をクリックします
- 「Display name」に分かりやすい名前を入れ、「Application type」で「Web」を選びます
- 「Add a domain」でサイトのドメイン(例:
example.com)を追加します。サブドメインは親ドメインに含まれます - 種類はスコア方式(score-based)が既定です。そのまま「Create key」をクリックします
画面の表記は英語表示のものです。作成したキーの「サイトキー」はブラウザに埋め込む公開用の値です。
WordPressのプラグイン用に旧シークレットキーを取り出す
WordPress のプラグインの多くは、従来の検証 API(siteverify)を使い、「シークレットキー」を入力する方式です。Google Cloud で作ったキーにも、こうしたプラグイン向けの旧シークレットキー(legacy secret key)が用意されています。
- 「Fraud Defense」の「Keys」タブで、作成したキーをクリックします
- 「Key details」画面の「Integration」タブで「Use legacy key」(または「Integrate with a third-party service or plugin」)をクリックします
- 表示された旧シークレットキーをコピーします
シークレットキーはサーバー側だけで使う値です。テーマの JavaScript など、ブラウザに渡る場所には書かないでください。また、プラグインが対応しているのが v2 か v3 かを確認し、作ったキーの種類(v3 はスコア方式)と合わせます。
無料枠を超えたときの動き
Google Cloud のドキュメント(2026年10月時点)では、無料で使えるのは月10,000回の判定までで、それを超えるにはプロジェクトの請求設定が必要です。請求設定がないまま上限を超えると、siteverify は「成功・スコア 0.9」を返し、エラーメッセージで上限超過を伝える動きになります。つまり、上限を超えるとボットも通ってしまいます。アクセスの多いサイトでは、Google Cloud コンソールで使用量を確認してください。
Contact Form 7に設定する
Contact Form 7 は reCAPTCHA v3 との連携機能を標準で持っています。Contact Form 7 6.2 で確認した手順です(関連記事:Contact Form 7にreCAPTCHAを設定する方法)。
- 管理画面の「お問い合わせ」→「インテグレーション」を開きます
- reCAPTCHA の欄で「インテグレーションのセットアップ」をクリックします
- 「サイトキー」と「シークレットキー」(前の手順で取り出した旧シークレットキー)を入力し、「変更を保存」をクリックします
設定するとフォームのタグを書き換えなくても有効になり、送信時にトークンが自動で付きます。動きは次のとおりです。
- reCAPTCHA のスクリプトは、フォームのないページも含めてサイトのすべてのページで読み込まれます(ページ閲覧も判定の材料にするため)
- スコアがしきい値 0.50 より高ければ送信を受け付け、それ以下ならスパムとして扱います
- しきい値は
wpcf7_recaptcha_thresholdフィルターで変えられます
しきい値を変える例です。テーマの functions.php か、独自のプラグインに書きます。
<?php
// Contact Form 7 の reCAPTCHA v3 のしきい値を 0.3 に下げる(既定は 0.50)
add_filter( 'wpcf7_recaptcha_threshold', function () {
return 0.3;
} );
しきい値を上げるとボットを止めやすくなりますが、人間の送信もスパム扱いされやすくなります。正しい問い合わせが届かないという連絡があれば、値を下げます。
コメント欄に自作で入れる
コメント欄やログイン画面に reCAPTCHA を入れるプラグインもありますが、仕組みを理解するために、コメント欄へ自作で入れる例を示します。WordPress 標準のコメントフォーム(comment_form() で出力されるフォーム)を対象にしています。
まず、キーを wp-config.php に定数で書きます(「That's all, stop editing!」の行より上)。
<?php
define( 'MY_RECAPTCHA_SITE_KEY', 'ここにサイトキー' );
define( 'MY_RECAPTCHA_SECRET', 'ここに旧シークレットキー' );
次に、wp-content/mu-plugins/comment-recaptcha.php を作って次のコードを保存します(mu-plugins フォルダーがなければ作ります。ここに置いたファイルは自動で有効になります)。
<?php
/**
* Plugin Name: Comment reCAPTCHA v3
* Description: コメント投稿時に reCAPTCHA v3 のスコアを確認する
*/
// 1. 投稿ページで reCAPTCHA のスクリプトを読み込み、送信時にトークンを付ける
add_action( 'wp_enqueue_scripts', function () {
if ( ! defined( 'MY_RECAPTCHA_SITE_KEY' ) || ! is_singular() || ! comments_open( get_queried_object_id() ) ) {
return;
}
wp_enqueue_script(
'my-recaptcha',
'https://www.google.com/recaptcha/api.js?render=' . rawurlencode( MY_RECAPTCHA_SITE_KEY ),
array(),
null,
array( 'in_footer' => true )
);
$js = <<<'JS'
(function () {
var form = document.getElementById('commentform');
if (!form) { return; }
form.addEventListener('submit', function (e) {
if (form.dataset.recaptchaDone) { return; }
e.preventDefault();
grecaptcha.ready(function () {
grecaptcha.execute(myRecaptchaSiteKey, { action: 'comment' }).then(function (token) {
form.querySelector('input[name="my_recaptcha_token"]').value = token;
form.dataset.recaptchaDone = '1';
HTMLFormElement.prototype.submit.call(form);
});
});
});
})();
JS;
wp_add_inline_script( 'my-recaptcha', 'var myRecaptchaSiteKey = ' . wp_json_encode( MY_RECAPTCHA_SITE_KEY ) . ';', 'before' );
wp_add_inline_script( 'my-recaptcha', $js );
} );
// 2. コメントフォームにトークンを入れる隠し項目を追加する
add_action( 'comment_form', function () {
echo '<input type="hidden" name="my_recaptcha_token" value="">';
} );
// 3. コメントを保存する前にトークンを検証する
add_action( 'pre_comment_on_post', function () {
if ( ! defined( 'MY_RECAPTCHA_SECRET' ) ) {
return;
}
$token = isset( $_POST['my_recaptcha_token'] ) ? sanitize_text_field( wp_unslash( $_POST['my_recaptcha_token'] ) ) : '';
$ok = false;
if ( '' !== $token ) {
$response = wp_remote_post(
'https://www.google.com/recaptcha/api/siteverify',
array(
'timeout' => 10,
'body' => array(
'secret' => MY_RECAPTCHA_SECRET,
'response' => $token,
),
)
);
if ( ! is_wp_error( $response ) && 200 === wp_remote_retrieve_response_code( $response ) ) {
$data = json_decode( wp_remote_retrieve_body( $response ), true );
$ok = ! empty( $data['success'] )
&& isset( $data['action'], $data['score'] )
&& 'comment' === $data['action']
&& (float) $data['score'] >= 0.5;
}
}
if ( ! $ok ) {
wp_die(
'コメントを送信できませんでした。ページを再読み込みしてから、もう一度お試しください。',
'送信エラー',
array(
'response' => 403,
'back_link' => true,
)
);
}
} );
コードのポイントです。
pre_comment_on_postは、サイトのコメントフォーム(wp-comments-post.php)から送信されたときだけ動くフックです。管理画面からの返信は対象になりません- 標準のコメントフォームは送信ボタンの
nameがsubmitのため、form.submit()がボタン要素を指してしまいます。そのためHTMLFormElement.prototype.submit.call(form)で送信しています - 検証では
successだけでなく、actionがcommentであることとスコアを確認します。他のページで発行されたトークンを使い回されるのを防ぐためです - 検証 API に接続できない場合も送信を拒否します(安全側に倒しています)
設置後は、ログアウトした状態(別のブラウザなど)でコメントを送信し、投稿できることを確認します。隠し項目を空にして送ると、エラー画面が出ることも確かめておきます。
バッジの表示とプライバシー
reCAPTCHA v3 を読み込むと、画面の右下に reCAPTCHA のバッジが表示されます。Google の FAQ では、利用者の目に入る場所に「This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.」という表記(プライバシーポリシーと利用規約へのリンク付き)を出す場合に限り、CSS でバッジを隠してよいとしています。
.grecaptcha-badge { visibility: hidden; }
reCAPTCHA は訪問者の操作情報を Google に送ります。サイトのプライバシーポリシーに、reCAPTCHA を使っていることを書いておきます。
うまく動かないとき
- すべての送信がスパム扱いになる:サイトキーとシークレットキーの組み合わせが違う、キーの種類が v3(スコア方式)ではない、キーに登録したドメインとサイトのドメインが違う、のどれかを確認します
- サーバーが Google に接続できない:サーバーから
https://www.google.comへの通信がファイアウォールなどで止められていると、検証できません(WordPressで「Could not connect to reCAPTCHA」と表示される原因と対処) - しばらく開いていたページから送ると失敗する:Contact Form 7 と上のコードは、送信時にトークンを発行します。ページを開いたときだけトークンを発行する作りのプラグインやコードでは、2分を過ぎてから送信すると検証 API が
timeout-or-duplicateのエラーを返します - Content Security Policy を設定している:
script-srcにhttps://www.google.com/recaptcha/とhttps://www.gstatic.com/recaptcha/、frame-srcにhttps://www.google.com/recaptcha/とhttps://recaptcha.google.com/recaptcha/、connect-srcにhttps://www.google.com/recaptcha/を許可します
まとめ
- 2026年10月時点では、reCAPTCHA のキーは Google Cloud コンソールの「Fraud Defense」で作る。WordPress のプラグインには、キー詳細の「Integration」タブから取り出した旧シークレットキーを使う
- Contact Form 7 は「お問い合わせ」→「インテグレーション」でキーを入れるだけで v3 が有効になる。しきい値は
wpcf7_recaptcha_thresholdで変えられる - 自作する場合は、送信時にトークンを発行し、サーバー側で
success・action・スコアを確認する - 無料枠(月10,000回)を超えて請求設定がないと、ボットも通るようになるため使用量を確認する
関連記事: