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 コンソールを使います。

  1. Google Cloud コンソールにログインし、プロジェクトを選びます(なければ作成します)
  2. 「Fraud Defense」(reCAPTCHA の管理画面)を開き、「Keys」タブで「Create key」をクリックします
  3. 「Display name」に分かりやすい名前を入れ、「Application type」で「Web」を選びます
  4. 「Add a domain」でサイトのドメイン(例:example.com)を追加します。サブドメインは親ドメインに含まれます
  5. 種類はスコア方式(score-based)が既定です。そのまま「Create key」をクリックします

画面の表記は英語表示のものです。作成したキーの「サイトキー」はブラウザに埋め込む公開用の値です。

WordPressのプラグイン用に旧シークレットキーを取り出す

WordPress のプラグインの多くは、従来の検証 API(siteverify)を使い、「シークレットキー」を入力する方式です。Google Cloud で作ったキーにも、こうしたプラグイン向けの旧シークレットキー(legacy secret key)が用意されています。

  1. 「Fraud Defense」の「Keys」タブで、作成したキーをクリックします
  2. 「Key details」画面の「Integration」タブで「Use legacy key」(または「Integrate with a third-party service or plugin」)をクリックします
  3. 表示された旧シークレットキーをコピーします

シークレットキーはサーバー側だけで使う値です。テーマの 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を設定する方法)。

  1. 管理画面の「お問い合わせ」→「インテグレーション」を開きます
  2. reCAPTCHA の欄で「インテグレーションのセットアップ」をクリックします
  3. 「サイトキー」と「シークレットキー」(前の手順で取り出した旧シークレットキー)を入力し、「変更を保存」をクリックします

設定するとフォームのタグを書き換えなくても有効になり、送信時にトークンが自動で付きます。動きは次のとおりです。

  • 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回)を超えて請求設定がないと、ボットも通るようになるため使用量を確認する

関連記事:

お気軽にご相談ください

お見積りへ お問い合わせへ
▲