# 静的化したWordPressサイトでお問い合わせフォームを使う方法

WordPressを静的化すると、Contact Form 7のようなプラグインで作ったお問い合わせフォームは、そのままでは送信できなくなります。この記事では、なぜ動かなくなるのかという理由と、静的サイトでも動く仕組みへの置き換え方を、このサイト自身がContact Form 7からSSGformとCloudflare Turnstileへ置き換えた経験をもとに解説します。
なぜ静的化するとフォームが動かなくなるのか
なぜ静的化するとフォームが動かなくなるのかで確認すべきポイントを整理します。
Contact Form 7のようなプラグインは、送信ボタンが押されたタイミングでPHPのプログラムが動き、入力内容をメールとして送信します。この処理には、WordPress本体とデータベースが常に動いていることが前提になっています。静的化した後のサイトは、あらかじめ用意されたHTMLファイルを配信するだけなので、PHPを実行する仕組み自体が存在しません。フォームの見た目は表示されても、送信ボタンを押した瞬間に何も起こらない、という状態になります。
静的サイトでフォームを動かす2つの方向性
静的サイトでもフォームを動かす方法は大きく2つあります。ひとつは、フォームの送信処理だけを担ってくれる外部サービスを使う方法、もうひとつは、自分でサーバーレス関数のような仕組みを用意する方法です。多くのサイト所有者にとって手軽なのは前者なので、この記事でも外部サービスを使う方法を扱います。
フォーム送信サービスを選ぶときに確認すること
フォーム送信サービスを選ぶときに確認することで確認すべきポイントを整理します。
外部のフォーム送信サービスを選ぶときは、次の3点を確認しておくと選びやすくなります。
- 送信された内容をメールで通知してくれるか
- スパム対策の仕組み(Turnstileのようなbot対策)と組み合わせられるか
- 送信後にサンクスページへリダイレクトできるか
このサイトでは、SSGformというサービスを使ってこの3点を満たしています。特定のサービスが唯一の正解というわけではなく、この3つの条件を満たせるサービスであれば、他の選択肢でも同じ考え方が使えます。
フォーム送信サービスの設定
フォーム送信サービスの設定で確認すべきポイントを整理します。
サービス側での設定は、おおむね次の流れになります。まず送信先のエンドポイントを作成し、通知を受け取るメールアドレスを登録します。次に、送信完了後に表示させたいサンクスページのURLを設定します。この2つがそろえば、静的なHTMLフォームからの送信を受け取れる状態になります。
スパム対策の考え方
フォームを公開すると、人ではなく機械的なプログラムからの送信、いわゆるスパムが届くようになります。このサイトでは、画面には表示されない入力欄を用意し、そこに何か入力があった送信は自動的に無視する「ハニーポット」という仕組みと、Cloudflare Turnstileという人の操作かどうかを判定する仕組みを組み合わせています。
Cloudflare Turnstileの設置
Cloudflare Turnstileの設置で確認すべきポイントを整理します。
Cloudflare Turnstileを使うには、まずCloudflareのアカウントでサイトキーとシークレットキーを発行します。サイトキーは静的HTML側に埋め込んで表示用のウィジェットを出すために使い、シークレットキーはサーバー側での検証に使います。
静的HTML側には、Turnstileの読み込みスクリプトとウィジェットを表示するための要素を追加します。見た目は小さなチェックボックスのような形で表示され、多くの場合は利用者が意識せずに完了します。
フォーム送信サービス側でのシークレットキー登録
サイトキーをHTML側に置く一方、シークレットキーはフォーム送信サービス側の管理画面に登録し、送信内容が正しい操作を経て届いたものかどうかの検証を任せます。どちらか一方だけでは機能しないため、両方を対にして設定する必要があります。
WordPress生成元への反映で気をつけること
WordPress生成元への反映で気をつけることで確認すべきポイントを整理します。
ここが、実際に運用してみて一番つまずいたところです。静的化はWordPress側の固定ページを書き出して作られるため、WordPress側の設定を変えないままだと、次に書き出したときにまたContact Form 7のフォームへ戻ってしまいます。恒久的に直すには、WordPressの固定ページ自体を、新しいフォームのHTMLに置き換える必要があります。
このとき、貼り付ける場所を間違えると思わぬエラーが起きます。フォームのHTMLを、Contact Form 7のテンプレート編集欄にそのまま貼ると、Contact Form 7が自動的に付け足す外側の`