教文館の社内ナレッジベースです。

ちわ、WPのカスタムしてますか?

アップデートが早かったり、ぐぐってもガセネタが多かったりして、

なかなか作動しないカスタムが多いと感じる今日このごろ。

件の「フォームに自動でタイトル入力」的なコードを公開しているサイトも

数年前のものはちらほらエラーになっています・・・。

結局自分のサイトで実験するしかないですよね!

ということで今回のお題は

『商品名(ポスト名)を自動で問い合わせフォームに入力する』

です。商品ページの「購入する」リンクボタンを押すと、

自動でタイトルが入力されているあのやつです。

今回の参考:

「 Contact form 7 商品問い合わせボタン 」

  Contact Form 7 よくあるカスタマイズ

 

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つあるようですが、

  1. フォーム内で明示的に宣言しない限りはGETリクエストとなる
  2. GETの場合は送信内容がURLとして渡される
  3. GETには送信できる情報量に制限がある
  4. GETでは日本語などの全角文字を送信できない

という特徴があるようです。なるほど、上記のコードの意味が少しわかりました。

以上ですが。