通常の問い合わせフォームは届くのに、診断の結果コンテンツの中に置いたフォームだけ送信が通らない。これは診断とContact Form 7(以下CF7)のどちらが悪いという話ではなく、回答 → 結果の表示 → フォームの描画 → CF7の送信処理 → メール送信という一本の経路の、どこかが切れているだけです。
やっかいなのは、どこで切れていても訪問者からは同じ「送れない」に見えること。ただ、画面に出ているものは段階ごとに違います。上から順に「ここまで来ていれば何が見えるはずか」を当てていけば、切れた箇所は絞れる。頻度が高いのは両端に近い2つで、結果コンテンツ自体が出ていないか、内容ベースのスパム判定に弾かれているかです。
結果が出ていないなら、フォームの話はまだ始まっていない
最初に見るのはフォームではなく結果のほうです。診断シミュレーションProの結果はページ遷移なし(AJAX)で同じ画面に差し込まれるので、結果コンテンツが表示されていなければ、その中のフォームもページ上に存在しません。送信できないのではなく、押すものが無い。
この段階を通過していれば、最後の設問に答えた直後、同じページに結果の見出しと本文が現れているはずです。何も出ないなら診断の設置側の問題なので、診断が表示されないときの対処から切り分けてください。診断そのものは出ているのに結果だけ空振りする場合は、回答マトリクスの条件がきつすぎる可能性があります。結果ごとに設定した条件はAND判定なので、条件を足すほど一致しにくくなる。条件を1〜2問に絞って残りを不問にすれば、たいてい出るようになります。
フォームが見えている時点で、連携設定はまだ関係ない
結果の中に入力欄と送信ボタンが見えているなら、そこまでの経路は通っています。CF7のショートコードが解釈され、フォームのHTMLが結果と一緒に差し込まれ、CF7のJS/CSSもそのページに来ている、ということ。
ここで先に潰しておきたい誤解があります。プラグイン側のCF7連携を有効化しなくても、結果コンテンツ内の エラー: コンタクトフォームが見つかりません。 は表示も送信もできます。 連携がオフだから送れない、ではありません(理由と連携設定の役割はContact Form 7だけで診断は作れるかに書きました)。
スパム対策のウィジェットについては、作っている側から中身を出しておいたほうが切り分けが速くなります。結果を差し込んだあと、こちらで2つのことをやっています。1つは、注入されたCF7のフォームに対してCF7自身の初期化をもう一度走らせること。reCAPTCHAGoogleが提供する、フォームの送信者が人間か自動プログラムかを判定する仕組み。スパム対策としてContact Form 7などと組み合わせて使う。はこの初期化にぶら下がっているので、これで動きます。もう1つがTurnstileで、こちらは読み込みのときにしかページを走査しない作りなので、明示的に描画し直しています。
つまりこの段階で見えるはずのものは、送信ボタンと、設定していればreCAPTCHAのバッジかTurnstileのチェック欄。バッジもチェック欄も出ていないなら、送信しても弾かれる可能性が高い。押す前にここを見ておくと、あとの切り分けが1段減ります。
なお、結果を描き終えたタイミングで mqs:results:rendered というイベントを結果の領域から投げています。自前のスクリプトや他プラグインの初期化を結果の中で走らせたい場合は、これを拾ってください。
押したあとに出る文言が、いちばん確かな手がかり

送信ボタンを押すと、CF7はフォームの下に必ず何かを返します。無反応なのか、赤い枠が出るのか、メッセージが出るのか。ここが経路のどこまで進んだかを示す一番の材料になります。
| 押したあとの見え方 | 通過した段階 | 次に見る場所 |
|---|---|---|
| 何も起きない(枠の色も変わらない) | 描画まで | CF7のJSが動いていない。ページ内の他スクリプトのエラーを疑う |
| 入力欄が赤くなる | 検証の手前 | 必須項目やメール形式。送信処理には入っていない |
| スパムの疑いという主旨のメッセージ | 送信処理まで | 内容ベースのスパム判定。次の節へ |
| CAPTCHAに関するエラー | 送信処理まで | reCAPTCHA / Turnstile側の設定。救済モードは効かない |
| 送信できたと出るのにメールが来ない | 全部 | 診断側は通過済み。CF7とサーバーのメール送信の設定 |
最後の行は経路の外です。「ありがとうございます」的な完了メッセージが出ているなら、診断も結果もフォームも送信処理も全部通っている。届かない理由は結果コンテンツに置いたことと無関係なので、そこからはCF7の宛先設定やサーバーのメール送信を見ることになります。
スパム判定で止まっているときだけ、救済モードを使う

診断結果用のフォームは、長い結果の説明文と同じ画面に乗ります。そのぶんAkismetやWordPress標準のコメント禁止リストといった内容ベースのスパム判定に引っかかることがある。通常の問い合わせフォームは届くのに結果の中のフォームだけ弾かれる、という偏り方をしていたら、ここを疑う番です。
そのための逃げ道が「誤判定救済モード」で、有効化は2段階になっています。
- プラグインの設定で「Contact Form 7連携」をオンにする
- 対象フォームの編集画面に出る「診断シミュレーション連携」パネルで、「診断結果コンテンツ内で使用する」をオンにする
2つめを省くと効きません。診断結果用だと明示したフォームの送信に限って、内容ベースの判定をスキップする仕組みだからです。サイト全体のスパム判定を緩めるスイッチではない、と考えてください。
通らないままにしてある送信もある

救済モードを入れても状況が変わらない、というときは、そもそも対象外の判定に弾かれています。
救済するかどうかの判断は、CF7が残したスパム判定の記録を1件ずつ見て決めています。そこに wpcf7 recaptcha turnstile stripe のいずれかが含まれていたら、救済せずに拒否のまま通す。CAPTCHAがスコア不足で正しく弾いた送信も、ここに入るので通りません。加えて、どこが弾いたのか分からない記録も、救済せずそのまま拒否にしています。 サードパーティ製のスパム対策を救済の対象に加えたい場合は mqs_cf7_spam_preserve_agents フィルタで一覧を差し替えられますが、既定では「素性の分からない判定は尊重する」側に倒してあります。
判定元を見ずに全部通すスイッチにしなかったのは、それを常時オンにしたサイトで、後から本当にスパムが増えたときに原因を切り分けられなくなるからです。救済モードは最初からオンにしておくものではなく、上の表で「スパムの疑い」に当たったときに初めて触る設定になります。
ここまでで当たらないなら、バージョンの前提を確認する
経路のどこにも当てはまらないときは、前提のほうを見ます。診断シミュレーションPro自体はWordPress 6.0以上・PHP 7.4以上で動き、CF7が入っていなくても診断は普通に動きます。
要件が増えるのは、結果の中でCF7を使うと決めた時点から。必要なのはContact Form 7 6.0以上です。 そのうえで、CF7側が要求するWordPressのバージョンは版によって変わります。6.0系はWordPress 6.6以上、6.1系は6.7以上。入れようとしている版のRequires at leastを見て、WordPress側が足りているかを先に確かめてください。前の節で書いた「連携なしでも動く」は、CF7 6.x の読み込みの挙動に乗っかった話なので、CF7が古いままだと前提から崩れる。バージョンだけが原因のときは症状が「フォームがそもそも出ない」に寄りやすいので、この記事の1つめの節に戻ることになります。
送信できるようになったあと、どの結果から送られたかを残す設定やフォームの項目数の話は診断結果から問い合わせにつなげる設計にまとめました。動作環境と機能の一覧は診断シミュレーションProで確認できます。
