メールフォームのスパム対策として、最近は Google reCAPTCHA を導入することがあります。制限はありますが(2024年4月1日に月100万回から1万回と大幅に縮小された)、無料で利用できるので。

WordPress のメジャーなメールフォームプラグイン Contact Form 7 では、標準で Google reCAPTCHA を連携できるようになっています。Contact Form 7 のサブメニュー「インテグレーション」から「reCAPTCHA (v3)」の「インテグレーションのセットアップ」で、取得したサイトキーとシークレットキーを入力するだけでよいのですが、ここで設定するとサイト全体に reCAPTCHA バッジが表示されてしまいます。

このバッジをフォーム画面だけに表示するには、functions.php に以下のようなコードを書くことで設定できます。(といくつかの紹介されています)

function load_recaptcha_js() {
 if ( ! is_page( 'contact' ) ) {
  wp_deregister_script( 'google-recaptcha' );
 }
}
add_action( 'wp_enqueue_scripts', 'load_recaptcha_js',100 );

2行目でフォームを設置したページのスラッグを指定するのですが、複数のフォームがあるサイトや今後もフォームが増える可能性があるサイトでは、ページが増える毎にスラッグをいちいち追記しなければなりません。

そこで、別のプラグイン Invisible reCaptcha を利用することであっさりと解決しました。

これを利用する場合は、Contact Form 7 での reCAPTCHA の設定は不要ですので既に設定している場合は削除し、Invisible reCaptcha の設定でサイトキーとシークレットキーを入力します。

さらにこのプラグインは、WordPress 標準のログインフォームやコメント欄、WooCommerce や他のいくつかの問い合わせフォームにも対応しており、バッジの位置もデフォルトの右下だけでなく、左下、インラインのオプションがあります。

そして、私が最も感動したのは、マルチサイトではサイトネットワーク管理で設定すればよいということです。マルチサイトの場合、それぞれのサイトでいちいち設定をしなければならないプラグインが多いのですが、Invisible reCaptcha はサイトネットワーク管理のメニューに「Invisible reCaptcha」があり、ここで設定すれば全てのサイトに適用されます。
なお、シングルサイトでは「設定」メニューの中にありますが、マルチサイトでは各サイトの「設定」にはありません。

(以下、2025年1月14日追記)

Invisible reCaptcha でログインフォームに reCAPTCHA を適用すると、ログインができないという現象が発生することがわかりました。よく見たら、このプラグインは5年以上更新されてなく、最新の WordPress に対応してないですね。

というわけで、これを使い続けるわけにはきませんでので他のプラグインを探してみると、reCaptcha by BestWebSoft というプラグインが Invisible reCaptcha の代替となりそうです。早速インストールして設定しようとしたのですが、Contact From 7 などの外部プラグインに対応させるためには年間 $24 の Pro バージョンを購入する必要がありました。残念…

ちなみに、Invisible reCaptcha と違い、reCaptcha by BestWebSoft はマルチサイトの場合でも個々のサイトについて設定する必要があるようです。

さて、どうしたものかと再度ググってみると、以下の記事が見つかりました。
【CONTACT FORM7】フォームがなければreCAPTCHAを非表示にするカスタマイズ – 株式会社bridge

//ショートコードが存在しなければreCAPTCHAの読み込みをキャンセルする
add_action( 'wp_enqueue_scripts', function (){
	
	global $post;
	$valid_recaptcha = false;
	$content = get_post()->post_content;
	
	if($content != null){
		if(has_shortcode($content, 'contact-form-7')) {
			$valid_recaptcha = true;	 
		}		
	}
	
	if($valid_recaptcha == false){
		wp_deregister_script( 'google-recaptcha' );
	}
	
}, 100);

こちらの方法で、Contact Form 7 以外のプラグインに頼ることなく実現することができました。ありがとうございます。