質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

解決済

2回答

2894閲覧

contactform7で顧客ごとのパラメータを加えたサンクスページへ遷移させる

退会済みユーザー

退会済みユーザー

総合スコア0

WordPress

WordPressは、PHPで開発されているオープンソースのブログソフトウェアです。データベース管理システムにはMySQLを用いています。フリーのブログソフトウェアの中では最も人気が高く、PHPとHTMLを使って簡単にテンプレートをカスタマイズすることができます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

リダイレクト

プログラムの入力元や出力先を通常とは別の場所に転送させることをリダイレクトと呼びます。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2019/12/12 02:19

編集2019/12/16 09:06

前提・実現したいこと

wordpressのプラグインcontactform7で顧客ごとのパラメータを加えたサンクスページへ遷移させる

詳細

現在ContactForm7を使っておりフォームを入力していただくと固定のサンクスページに自動でリダイレクトします。

フォーム入力後、メール送信前(wpcf7_before_send_mail)に入力された値を別サービスにAPIを使ってPOSTしております。
POST後Json形式で識別コードが返されるのですが、その値をURLにパラメータとして付与してサンクスページへ遷移させたいのですがどうにもうまくいきません。

WPもPHPも勉強し始めたばかりなのでお力をお貸していただけないでしょうか。

該当のソースコード

php

1//サンクスページ移動 2add_action( 'wp_footer', 'redirect_thanks_page' ); 3function redirect_thanks_page() { 4 global $thanks;//サンクスページのスラッグ 5 6 ?> 7 <script> 8 document.addEventListener( 'wpcf7mailsent', function( event ) { 9 location = '<?php echo home_url('/'.$thanks); ?>'; 10 }, false ); 11 </script> 12 <?php 13}

php

1//APIでPOST 2add_action( 'wpcf7_before_send_mail', 'my_conversion' ); 3function my_conversion( $cf7 ) 4{ 5//フォームの入力値の取得、整形は省略 6$context = stream_context_create($opts); 7$response = file_get_contents( 8 $base_url . $post_string//URLとクエリパラメータ 9 ,false 10 ,$context 11 ); 12$result = json_decode($response,true); 13 $hashcode = $result->{'キー名'}; 14$user_data = array( 15 'status' => $result['status'], 16  'hashcode' => $result['message']['customer[hashcode]'] 17); 18//echo $user_data[hashcode]; 19$hashcode = $user_data[hashcode]; 20 //サンクスページのURL+'?パラメータ名='+$hashcodeに遷移出来たらOK 21} 22return $cf7; 23}

試したこと

サンクスページ移動のコードでは固定ページなので、APIでPOSTのコードのレスポンスになる変数$hashcodeをグローバル変数にしたらと思いましたが、関数の中の変数なのでグローバル化できないようでした。
APIでPOSTのコードでリダイレクトさせようとしたのですが、サンクスページ移動の内容や’location =’を使っても反応しないor <div class="ajax-error">Unexpected token H in JSON at position 0</div>と出て処理が止まります。
多分Ajaxの非同期処理が原因でフォーム入力後の戻り値を受け取れずにリダイレクトしているのかと思ったのですがその回避方法がわからないのと何か根本的にやり方が間違っているような気がして今回質問しました。

補足情報(FW/ツールのバージョンなど)

WP・CF7ともに最新です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

全然違う方法ですが
wpcf7_ajax_json_echoを使うこと出来ました。

投稿2019/12/20 11:01

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

wp_footerアクションの実行タイミングがwpcf7_before_send_mailよりも
早いためだと思います。

https://wpdocs.osdn.jp/%E3%83%97%E3%83%A9%E3%82%B0%E3%82%A4%E3%83%B3_API/%E3%82%A2%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E3%83%95%E3%83%83%E3%82%AF%E4%B8%80%E8%A6%A7

myconversion()の中でredirectするアプローチで変更されると良いと思います。

追記
送信完了時のアクションにフック

PHP

1function my_mail_sent($contact_form) { 2//$resultの処理やリダイレクト 3} 4add_action('wpcf7_mail_sent', 'my_mail_sent', 10, 1)

投稿2019/12/16 06:28

編集2019/12/17 06:07
madone99

総合スコア1855

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/12/16 07:30

ご回答ありがとうございます。 そうなのですね、仰る通り$hashcodeをグルーバル変数にしても値は空でした。 しかしながら >myconversion()の中でredirectするアプローチで変更されると良いと思います。 この方法がわからないでの困っている現状です…
退会済みユーザー

退会済みユーザー

2019/12/16 08:21

wp_safe_redirect() wp_redirect() header('Location: ') などを試してみたのですが、 <div class="wpcf7-response-output wpcf7-display-none" style="display: none;"></div> <div class="ajax-error">Unexpected token < in JSON at position 0</div> 上記のエラーが出現し送信されなくなってしまいます。 phpよりWPやCF7の何か制約があることは何となくわかるのですが解決策が見当もつきません、
madone99

2019/12/16 08:34

そうなんですね、$responseには正常な値が入っているのでしょうか? まずそこをクリアしないとダメなようですね。
退会済みユーザー

退会済みユーザー

2019/12/16 09:08

おそらく正常だと思うのですが、myconversion()の中でechoやprint、JSのconsolelogを使うと悉く先述のエラーが出てくるので確認は出来ていません…
退会済みユーザー

退会済みユーザー

2019/12/17 03:52

自動送信メールに$response要素を含ませることはできたので、確認したところやはり正常な値を取得できていました…
madone99

2019/12/17 06:08

コードを追記しました。 wpcf7_mail_sentで各種処理をやられてはいかがでしょうか。
退会済みユーザー

退会済みユーザー

2019/12/18 00:28

ご助言ありがとうございます。 wpcf7_mail_sentでもやはりajaxのエラーが出ました。 少し調べてみたところajaxは動的にページ内のコンテンツを作用させる仕組みなのでリダイレクトの様な操作と干渉するのは当然なのかもしれません。 グルーバル変数で定義しても値が空なのもサーバー側(php)で値を持っているのでフロント側(ajax(javascript))で呼び出しようがないのかもしれません。 ですのでサーバー側でhtmlの要素として書き込んでフロント側でそれを呼び出すという方法で迂回してみようかと思います。(それも出来るのかわからないのですが)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問