ちわ、WPのカスタムしてますか?
アップデートが早かったり、ぐぐってもガセネタが多かったりして、
なかなか作動しないカスタムが多いと感じる今日このごろ。
件の「フォームに自動でタイトル入力」的なコードを公開しているサイトも
数年前のものはちらほらエラーになっています・・・。
結局自分のサイトで実験するしかないですよね!
ということで今回のお題は
『商品名(ポスト名)を自動で問い合わせフォームに入力する』
です。商品ページの「購入する」リンクボタンを押すと、
自動でタイトルが入力されているあのやつです。
今回の参考:
1.フォームを表示する問い合わせページをつくる
まず、問い合わせページを作ります。このサイトの場合、「sample-contact」というスラッグを使用して
http://booksginza.phpapps.jp/sample-contact
にしました。 Contact form 7 でフォームを作成し、ショートコードをこのページに貼り付けます。
2.フォームへのリンクにGETパラメーターを仕込みます。
ミソは $_GET つまりGETパラメーターでフォームに値を渡す準備をしておくということ。フォームとパラメーターは別の名前のほうが混乱せずにいいようです。今回はフォームでは「your-subject」がフィールド名、パラメーターは「subject」としておきます。
<a class="btn btnLr" href="<?php echo esc_url(home_url('/')); ?>sample-contact/?post_id=<?php echo $post->ID; ?>&subject=<?php echo urlencode(get_the_title());?>">問い合わせる</a>
上記のコードではテンプレートに埋め込むようになってますが、投稿上で使えるようにショートコードに仕立てる方法も元ネタでは紹介してあります。
3.function.phpに「フォームのテキストフィールドへ値を渡す」コードを書く
基礎なんてやってないんでコピペとその解読 ^^;)。
// Contact form 7 商品問い合わせフォームに自動的に商品名が入るようにする
function my_tag_filter($tag){
if ( ! is_array( $tag ) )
return $tag;
if(isset($_GET['subject'])){
$name = $tag['name'];
if($name == 'your-subject') $tag['values'] = (array) $_GET['subject'];
}
return $tag;
}
add_filter('wpcf7_form_tag', 'my_tag_filter', 11);
同じことはプラグインでもできるけど、手っ取り早くfunction.phpに書き込みます。
まず新しい独自関数「my_tag_filter」をつくります。
これは
①「Contact Form 7」の関数である「wpcf7_form_tag」関数にセット(フック)する関数で、
②リクエスト(この場合リンクボタンをポチッとな)がなされた場合、フォームのテキストフィールドに格納される値「$tag」のうち、「your-subject」項に格納される値をリンクURLの中から見つけ出し、GET変数(値を格納してくれる変数)で引き渡し、
③遷移したページではフォーム内の「your-subject」項で「$_GET」で受け取る
というもの。
合ってっかな?ちなみに調べてみると「フォームからの値を格納してくれる変数」には$_GETと$_POSTと2つあるようですが、
- フォーム内で明示的に宣言しない限りはGETリクエストとなる
- GETの場合は送信内容がURLとして渡される
- GETには送信できる情報量に制限がある
- GETでは日本語などの全角文字を送信できない
という特徴があるようです。なるほど、上記のコードの意味が少しわかりました。
以上ですが。
