求人サイトの「エントリー」ボタンを押したら、応募フォームにその求人名が最初から入力されている——ユーザーの手間を減らす、よくある仕組みです。Contact Form 7でも、遷移元ページの情報をフォームに引き継げます。
結論から言うと、遷移元ページからhiddenフィールドでデータをPOST送信し、functions.phpのwpcf7_form_tagフィルターで、その値をContact Form 7のフォームタグに流し込むという流れで実現できます。この記事では、求人サイトのエントリーフォームを例に、具体的なコードを解説します。
たとえば、求職者向けのお仕事紹介サイトを制作したとします。お仕事情報をカスタム投稿(投稿タイプ名:job)で作り、そのシングルページに「エントリー」ボタンを設置します。
このボタンを押して遷移した先のエントリーフォームに、遷移元ページの「お仕事名」などを、あらかじめ入力された状態で表示する、というのが今回のゴールです。

まず、遷移元となるシングルページ(single-job.php)に、エントリーボタンを兼ねたフォームを設置します。渡したい値はhiddenフィールドに入れ、フォーム本体(/entry/ページ)へPOSTで送ります。
<form class="entry-btn" action="<?php echo home_url(); ?>/entry/" method="post">
<input type="hidden" name="entry-ttl" value="<?php the_title(); ?>">
<input type="hidden" name="entry-number" value="<?php the_field('job_number', $post->ID); ?>">
<input type="submit" value="エントリー">
</form>
この例では、カスタム投稿のタイトル(the_title())をentry-ttlに、カスタムフィールドjob_numberの値をentry-numberに入れて送っています。entry-ttl・entry-numberは、あとで設定するContact Form 7のフォームタグ名に合わせておきます。
次に、送られてきた値をContact Form 7のフォームタグにセットします。functions.phpに、wpcf7_form_tagフィルターを使った処理を追加します。
function recform_data_filter($tag)
{
if (!is_array($tag))
return $tag;
if (isset($_POST['entry-ttl'])) {
if ($tag['name'] == 'entry-ttl')
$tag['values'] = (array) $_POST['entry-ttl'];
}
if (isset($_POST['entry-number'])) {
if ($tag['name'] == 'entry-number')
$tag['values'] = (array) $_POST['entry-number'];
}
return $tag;
}
add_filter('wpcf7_form_tag', 'recform_data_filter');
entry-ttl・entry-numberは、Contact Form 7のフォームタグの名前です。フォーム側でこの名前のタグ(たとえば[text* entry-ttl])を用意しておけば、遷移してきたときに値が入った状態で表示されます。
仕組みはシンプルです。wpcf7_form_tagフィルターは、Contact Form 7が各フォームタグを生成するタイミングで呼ばれます。そのとき、タグ名($tag['name'])が渡したい項目と一致していれば、POSTで送られてきた値を$tag['values']にセットする、という流れです。
渡したい項目が増えたときは、同じifブロックを項目名を変えて追加していけば対応できます。カスタム投稿のタイトルやカスタムフィールドなど、遷移元で取得できる値であれば、基本的に何でも引き継げます。
補足として、受け取った値はフォームの初期値として表示されるため、ユーザーに編集させたくない場合は、フォームタグ側でreadonlyを指定しておくとよいでしょう。応募する求人名のように「変更されては困る情報」は、読み取り専用にしておくと安心です。また、確認画面つきのフォームと組み合わせれば、引き継いだ値をそのまま確認ページや自動返信メールにも反映できます。
1点、セキュリティ面の補足です。$_POSTの値はユーザー側から送られてくるため、そのまま扱う前にsanitize_text_field()などでサニタイズしておくと、より安全です。フォームに表示する値は、信頼せずに一度整える——この習慣を持っておくと安心です。
hiddenフィールドで値をPOST送信するfunctions.phpのwpcf7_form_tagフィルターで、フォームタグに値をセットするhiddenのnameとフォームタグ名を一致させるのがポイント$_POSTの値はサニタイズしてから扱うと安全遷移元の情報をフォームに引き継げると、ユーザーは「どの求人に応募するか」を選び直す手間がなくなり、離脱も減らせます。求人サイトに限らず、商品や店舗の問い合わせフォームなど、応用の幅が広いテクニックです。