サポート » プラグイン » 他のフォームから値をContact Form 7へ:nameに”[“がある場合

  • あるフォームから、Contact Form 7へ値を渡したいと思っています。

    よくわからないまま、functions.phpに下記のように書いているのですが、
    うまく動かず、その原因がnameに[]が使われていることではと考えています。

    ‘booking[client][name]’を’bookingclientname’のように[]を外せばうまく受け取れるのですが、
    他のプラグインが生成するフォームでそちらでも利用しているため変更することができません。

    この状況を解決する方法はありませんでしょうか。

    どなたか、お教えいただけましたら幸いです。よろしくお願いいたします。

    
    function my_form_tag_filter($tag){
      if ( ! is_array( $tag ) )
      return $tag;
    
      if(isset($_POST['booking[client][name]'])){
        $name = $tag['name'];
        if($name == 'booking[client][name]')
          $tag['values'] = (array) $_POST['booking[client][name]'];
      }
    
      return $tag;
    }
    
    add_filter('wpcf7_form_tag', 'my_form_tag_filter', 11);
    • このトピックはryama22が7年、 6ヶ月前に変更しました。
12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック投稿者 ryama22

    (@ryama22)

    中途半端な書き方になっていたのに気が付きました。

    Contact Form 7に
    [booking[client][name]]と書いても出力結果が「]name ]」このようになってしまって、
    ここをうまく出力できれば良いことなのか、

    それとも「$_POST[‘booking[client][name]’]」と書くことがそもそもダメなのか、
    そのあたりの切り分け自体もできておりません。

    booking[client][name]でPOSTするとPHPでは$_POST['booking']['client']['name']に格納されます。

    var_dump($name);
    とか
    var_dump($_POST[‘booking[client][name]’]);
    とかを入れて、それぞれどのような値が入っているかチェックしてみてはどうでしょうか。

    つまりどの時点で意図しないデータが入っているかです。

    $_POST[‘booking’][‘client’][‘name’] に保存されるということなら、

    $tag[‘values’] = $_POST[‘booking’][‘client’][‘name’];
    とかではダメなのでしょうか。ちょっと全体像がよくわからないので、回答がつけがたいと思います。
    > 他のプラグインが生成するフォームでそちらでも利用しているため
    が絡むため、もっとそこも含めた全体コードがないのと良くわからないですね。

    トピック投稿者 ryama22

    (@ryama22)

    Hinaloeさま、kimipoohさま、ありがとうございます。

    formは、このようになっています(抜粋)。

    <input id="client-name" name="booking[client][name]" value=" " type="text">
    <button type="submit" name="reserve_action" value="validate">予約確認</button>

    この”booking[client][name]”のvalueを、登録完了のページにつけたContact Form 7に渡したいのです。

    booking[client][name]でPOSTするとPHPでは
    $_POST[‘booking’][‘client’][‘name’]に格納されます。

    とのことですので、今のmy_form_tag_filterでは取れていない、ということはよくわかりました。

    なお、var_dump($name);、var_dump($_POST[‘booking[client][name]’]);、いずれもNULLとなりました。

    $_POST[‘booking’][‘client’][‘name’]の[をエスケープしたりはできないものなのでしょうか。

    ん?どういうこと?

    これが最適解かはさておき

    
    function my_form_tag_filter($tag){
      if ( ! is_array( $tag ) )
      return $tag;
    
      if(isset($_POST['booking']['client']['name'])){
        $name = $tag['name'];
        if($name == 'booking[client][name]')
          $tag['values'] = (array) $_POST['booking']['client']['name'];
      }
    
      return $tag;
    }
    
    add_filter('wpcf7_form_tag', 'my_form_tag_filter', 11);
    
    

    ……あ、これだとダメな気がする……

    他のプラグインが生成するフォームでそちらでも利用しているため変更することができません。

    をもう少し詳しく示してください。そのプラグインがどのタイミングに影響してくるかで対応が変わってくる気がするので。

    例えば「他のプラグイン」の入力がこのフォームに渡ってきて、以後そのプラグインに対してPOSTするのでなければフォームのキーを帰れば済む話だと思うので。(あわせてif($name == 'booking[client][name]')の右辺もそれに対応させるのかな)

    トピック投稿者 ryama22

    (@ryama22)

    ありがとうございます。
    壮大な勘違い、もしくは完全な説明不足の気もしてまいりましたが…
    「他のプラグイン」の名称も記載したほうがよいですか?

    他のプラグインが生成するフォームでそちらでも利用しているため変更することができません。

    というのは、下記1.および2.のフォームは他のプラグインが生成するもので私には変更できない、という意味です。

    3.が表示された時点で予約は完了しており、そのプラグインにPOSTすることはありません。nameを変えることもまったく問題ありません。
    3.は予約上必須ではないオプション項目を入力してもらうために設けるフォームで、予約者の名前を間違えないようにこちらのフォームでも名前を入れておきたいのです。

    下記で説明足りますでしょうか。

    ■1.元のフォーム(入力画面・抜粋)

    <form method="post">
    <input id="client-name" name="booking[client][name]" value=" " type="text">
    <button type="submit" name="reserve_action" value="validate">予約確認</button>
    </form>

    ■2.元のフォーム(確認画面・抜粋)1.と同じURL

    <form method="post">
    ryama22
    <input name="booking[client][name]" value="ryama22" type="hidden">
    <button type="submit" value="validate">予約する</button>
    </form>

    ■3.元のフォームの完了画面 2.からリダイレクト

    このページにContact Form 7のフォームを置いてmy_form_tag_filter($tag)をつかい、
    2.元のフォーム確認画面にある”booking[client][name]”のvalue”ryama22″を渡したい。
    もしくはフォームでなくても受け取った値を表示させるだけでも。

    <form method="post">
    <input class="wpcf7-form-control wpcf7-text" name="your-name" value="" type="text">
    <input class="wpcf7-form-control wpcf7-submit" value="送信" type="submit">
    </form>
    • この返信は7年、 6ヶ月前にryama22が編集しました。

    であれば、上に書いた通りCF7のnameを変えるのが手っ取り早そうですね。(ところで上で示した例は試しましたか?)

    トピック投稿者 ryama22

    (@ryama22)

    ありがとうございます。

    はい、試してみたのですが違っていたようです。
    投稿がうまくできず(URLをきさいしていたからでしょうか)なんどか書き直しているうちにご報告を消してしまったようです。

    ただ、そのnameを書き換える、という意味がよくわかっていません。ごめんなさい。

    なお、プラグインの開発者の方に連絡が取れて伺ったところ、完了ページをリダイレクトしているので$_POSTでは値は渡せないよ、
    「GETパラメータであれば渡すことは可能です」とおっしゃっているのですが、これは$_GETしなさい、という意味合いになるでしょうか。

    (なかなかそこまではサポートいただけないので、甘えてしまっております)

    プラグイン同士の連携は、互いがそういう実装をしておく必要があります。今回それができないのであれば、素直に Contact Form 7でフォームを作成するのがよいと思います。

    それがダメな理由がよく分かりませんが(問題を複雑にしている)、 GETパラメーターで値をわたしてもらえるなら、それを拾って Contact Form 7へ橋渡しするプログラムを書けばよいと思います。

    トピック投稿者 ryama22

    (@ryama22)

    kimipoohさま
    恐れ入ります。

    Contact Form 7へ値を渡せなくとも、新たに作ったフォームを設置したページに値が表示されればよい、とは思っています。

    連続して2つのフォームに入力してもらうことになるので、同じ情報を2度入力する手間を省くためです。
    まず登録していただいて、そのあと詳細を、ということです。
    問題を複雑にしているのですね、申し訳ありませんでした。

    GETパラメーターで渡せるように変更はできないので、どうやらもともと無理なことを私ができそうだと勘違いしていたようです。

    みなさま、お手間をとって助けていただきまして、ありがとうございました。

    Contact Form 7には引数で情報を引き渡すことができます
    http://blog.s-giken.net/105.html

    という情報もあるので、Contact Form 7側については GETやPOSTから情報を受け取って値を入れ込むことはできそうです。

    トピック投稿者 ryama22

    (@ryama22)

    何度も情報をいただいてありがとうございます。
    こちらも参考にしながらもう少し検討してみます。

    感謝いたします!

12件の返信を表示中 - 1 - 12件目 (全12件中)
  • トピック「他のフォームから値をContact Form 7へ:nameに”[“がある場合」には新たに返信することはできません。