お問い合わせフォームを PHP なしで動かす|Cloudflare Workers で作り直す流れ
WordPress のお問い合わせフォームは PHP で動いている。サイトを Cloudflare に移すときに、フォームを PHP なしで作り直す流れと、迷惑投稿・個人情報の注意点をまとめた。
お問い合わせフォームを PHP なしで動かす|Cloudflare Workers で作り直す流れ
- フォームの見た目は HTML のまま。受け取る所だけを小さなプログラム(Cloudflare Workers)にする
- 受け取ったら、入力を確かめ、保存し、担当者にメールで知らせる
- 迷惑投稿は、ロボット確認(Turnstile)と送りすぎの制限で防ぐ
- 個人情報を扱うので、保存の期間と、見られる人を決めておく
今のフォームはどう動いているか
WordPress のフォームは、だいたい次の流れで動いている
- 見る人がフォームに書いて「送信」を押す
- サーバーの PHP が内容を受け取る
- PHP がメールを組み立てて、担当者に送る(自動返信も PHP が送る)
作り直したあとのしくみ
- フォームの見た目:今と同じ HTML(静的サイトの1ページ)
- 受け取る・確かめる:Cloudflare Workers
- ロボットか確かめる:Cloudflare Turnstile(画像を選ばせない確認)
作り直す流れ
- 今のフォームの項目・必須の項目・送り先・自動返信の文を書き出す
- 同じ見た目のフォームを HTML で作る
- 受け取るプログラム(Workers)を作り、ロボット確認と入力の確認を入れる
サイトを置くだけの形(静的サイト)にして Cloudflare に移すとき、一番の山になるのがお問い合わせフォームだ。WordPress の Contact Form 7 などは、送られた内容を PHP で受け取ってメールにしている。PHP をなくすなら、この部分を別の仕組みで作り直す必要がある。
- フォームの見た目は HTML のまま。受け取る所だけを小さなプログラム(Cloudflare Workers)にする
- 受け取ったら、入力を確かめ、保存し、担当者にメールで知らせる
- 迷惑投稿は、ロボット確認(Turnstile)と送りすぎの制限で防ぐ
- 個人情報を扱うので、保存の期間と、見られる人を決めておく
今のフォームはどう動いているか
WordPress のフォームは、だいたい次の流れで動いている。
- 見る人がフォームに書いて「送信」を押す
- サーバーの PHP が内容を受け取る
- PHP がメールを組み立てて、担当者に送る(自動返信も PHP が送る)
PHP をなくすと、2と3を行う所がなくなる。そこで、この2つだけを Cloudflare Workers という小さなプログラムに任せる。
作り直したあとのしくみ
| 役割 | 何で行うか |
|---|---|
| フォームの見た目 | 今と同じ HTML(静的サイトの1ページ) |
| 受け取る・確かめる | Cloudflare Workers |
| ロボットか確かめる | Cloudflare Turnstile(画像を選ばせない確認) |
| 保存する | Cloudflare D1(データベース) |
| 担当者に知らせる | 決めておいた宛先へのメール |
Workers のプログラムは、フォームを受け取るだけなので短い。中身が短いほど、穴が入り込む余地も少なく、確かめるのも楽になる。
受け取るプログラムの例
受け取る所の中身は、たとえば次のくらいの長さになる(説明のために短くしている)。
export default {
async fetch(request, env) {
if (request.method !== "POST") return new Response("", { status: 405 });
const form = await request.formData();
// 長すぎる入力は受け取らない
const name = String(form.get("name") || "").slice(0, 100);
const email = String(form.get("email") || "").slice(0, 200);
const message = String(form.get("message") || "").slice(0, 3000);
if (!name || !/^[^@\s]+@[^@\s]+$/.test(email)) return new Response("入力を確かめてください", { status: 400 });
// ロボット確認(Turnstile)の結果を確かめてから保存する
await env.DB.prepare("INSERT INTO inquiries (name, email, message) VALUES (?, ?, ?)")
.bind(name, email, message).run();
return Response.redirect("https://example.com/thanks", 303);
},
};
保存するときは、入力をそのまま SQL の文に混ぜず、? の場所に後から入れる(プリペアドステートメント)。こうすると、SQL インジェクションを防げる。考え方は PHP の PDO と同じだ。
作り直す流れ
- 今のフォームの項目・必須の項目・送り先・自動返信の文を書き出す
- 同じ見た目のフォームを HTML で作る
- 受け取るプログラム(Workers)を作り、ロボット確認と入力の確認を入れる
- 保存先(D1)と、担当者へのメールの宛先を決める
- 新しいフォームから試しに送り、届くこと・保存されることを確かめる
- サイトを切り替えたあと、本物の問い合わせが届いているか、数日見守る
フォームが動いていないことに、何週間も気づかないことがある。切り替えたあとは、自分で週に1回送ってみるか、届いた件数を見る画面を用意しておく。
気をつけること
迷惑投稿
フォームは、機械による迷惑投稿の的になりやすい。ロボット確認(Turnstile)を入れ、同じ相手からの送りすぎを止める。メールの本文にリンクがたくさんあるものを弾く、といった工夫もある。
自動返信
お客さんへの自動返信メールは、送り先が毎回変わる。担当者への通知とは別に、メールを送るサービスを組み合わせる。送る元のドメインには SPF・DKIM・DMARC を設定しておかないと、迷惑メールに振り分けられやすい。
添付ファイル
ファイルを受け取るフォームは、作りが重くなる。乗っ取りの入口にもなりやすい(PHP のアップロードの脆弱性と同じ考え方)。どうしても要るなら、受け取れる種類と大きさを絞り、保存先も分ける。
個人情報
- 保存しておく期間を決め、過ぎたら消す
- 管理画面で見られる人を決め、2段階認証を使う
- プライバシーポリシーに、何のために使い、いつまで持つかを書く
よくある質問
今の Contact Form 7 は、そのまま使えませんか?
Contact Form 7 は PHP で動くので、PHP をなくすと使えなくなります。
見た目は同じにして、受け取る所だけを作り直します。
迷惑投稿は増えませんか?
ロボット確認(Turnstile)と、同じ相手からの送りすぎの制限を入れれば、WordPress のときより減ることが多いです。
お客さんへの自動返信もできますか?
できます。
担当者への通知とは別に、メールを送るサービスを組み合わせます。
送る元のドメインに SPF・DKIM・DMARC を設定しておくと、迷惑メールに入りにくくなります。
参考にした情報
- Cloudflare Workers(英語)
- Cloudflare D1(英語)
- Cloudflare Turnstile(英語)
- Cloudflare Email Routing:Send emails from Workers(英語)
2026年10月22日時点の公開情報にもとづく。脆弱性の情報や各サービスの機能は変わることがあるので、最新は公式のページを確認すること。Cloudflare は Cloudflare, Inc. の商標で、PHPチェッカーは Cloudflare の公式のサービスではない。
今のフォームの項目と送り先を確かめてから、PHP なしで動かす形と費用を伝える。見積もりは無料。
無料で移行を相談する


