inc2734 / mw-wp-form

69 stars 46 forks source link

完了画面 URL を入力すると「直接アクセスできません」になる? #84

Open inc2734 opened 6 years ago

inc2734 commented 6 years ago

https://teratail.com/questions/145450

soundweaver commented 4 years ago

上記teratailの質問のように完了画面だけ別ページに設定をして使っていてたのですが、バージョンアップ時に同じ現象になり、とりあえず以下のような感じで簡易的に設定して現在使っています。

mwform_redirect_url_mw-wp-form-xxフィルターフックを使って完了画面だけ別ページにする形で す。

$Data->get_view_flg()でページの状態(input,'confirm,complete)が確認できるので、完了の際別ページのURL(thanksページ)に飛ばしています。

管理画面の設定として、MW WP Formの管理画面の各URLの入力欄は全部空白にして、完了画面のページにはショートコードを入れます。

functions.phpには、

function contact_form_redirect_url($url,$Data) {
  if($Data->get_view_flg() === 'complete') {
    $complate_url = home_url('') . '/thanks/';
    return esc_url($complate_url);
  } elseif(($Data->get_view_flg() === null || $Data->get_view_flg() === 'input') && (strpos($url,'thanks') !== false)) {
    return esc_url(home_url(''));
  }
  return $url;
}
add_action( 'mwform_redirect_url_mw-wp-form-[ナンバー]', 'contact_form_redirect_url', 10, 2 );

などと設定しています。

これで、完了画面だけ別ページ(thanksページ)にすることができました。

しかし、確認画面を別ページ(confirmページ)にしたい場合は、修正ボタンで戻るときに元のページではなく、confirmページのURLのまま入力欄が表示されます(当たり前ですが)。

class.redirected.phpの43行目あたりの

if ( 'back' === $post_condition ) {
    if ( $is_valid ) {
        $this->url = $input;
    } 

$this->urlの値をなんとかできれば可能かなと思ったのですが、どうでしょうか。

今後どうしても確認画面も別URLという場合は、力技ですがsessionを使って入力元のURLを覚えさせて、mwform_redirect_url_mw-wp-form-xxフィルターフックで飛ばすという方法で対応しようかと考えています。