サポート » 使い方全般 » テーマ内でのリダイレクト方法について

  • はじめまして。
    WPを使用し、商品の申し込みサイトを作成しようとしております。
    ざっくりとしたイメージは、以下のとおりです。
    1.ログイン画面
    2.商品選択画面
    3.申込者情報入力画面(住所等)
    4.入力内容確認画面
    5.完了画面
    入力された申込情報は、WP内のDBに保管されます。

    初めてのWPで、全て手探り状態ですが、
    とりあえず、特別なプラグインを使わない場合、子テーマにてPHPの記述を行い、
    入力チェックや登録処理などを、行っていくのだと理解しております。(間違っていたら指摘願います。)
    そこで、実際にコーディング作業を進めており、
    子テーマにて、入力チェック類は行えているのですが、
    実際入力チェックでエラーが合った際、普通のPHPの記述でありがちな、
    リダイレクトを使用し、元の画面に戻そうとした際、
    ページ自体は元の画面に戻るのですが、テーマが適用されない、
    functionsで定義した関数が機能していないなどの問題が生じております。
    該当箇所の記述としては、下記の通りです。
    固定ページ:

    <form id="form1" name="form1" method="post" action="http://10.82.142.194/wordpress/?page_id=195" >
            <div style="margin-bottom:20px;">
              <div class="Textfield">
                <input name="textfield1" type="text" id="textfield" maxlength="4" value="[getPost('textfield1')]" />
              </div>
              <div class="Textfield">- </div>
              <div class="Textfield">
                <input name="textfield2" type="text" id="textfield2" maxlength="4" />
              </div>
              <div class="Textfield">- </div>
              <div class="Textfield">
                <input name="textfield3" type="text" id="textfield3" maxlength="4" />
              </div>
              <div class="Textfield">- </div>
              <div class="Textfield">
                <input name="textfield4" type="text" id="textfield4" maxlength="4" />
              </div>
            </div>
            <div>
              <input type="submit" name="button" id="button" value="送信ボタン" />
            </div>
          </form>

    page-itemselect.php(page_id=195テンプレート):

    if (isset($_POST['textfield1']) && isset($_POST['textfield2']) && isset($_POST['textfield3']) && isset($_POST['textfield4'])){
    	// ダミー
    } else {
    	// 元のページに戻る
    	$page = get_page_by_path('login');
            wp_safe_redirect( get_permalink( $page->ID ), 307 );
    	exit();
    }

    WPの処理順序を把握していないが故の問題かと思いますが、
    何か対応方法はございますでしょうか。
    また、そもそもの理解が間違っている場合は、その点ご指摘頂ければと思います。

    以上、宜しくお願い致します。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • 入力チェックは、Ajax を使うか、JavaScript だけを使って、画面遷移せずにユーザに注意を促すのがわかりやすいと思います。仕様として、JavaScript が使えないということなら、どうしようもありませんが… リダイレクトすると、1項目だけの不備でも、全て再入力となって、ちょっとイラっとされちゃうかもです。

    リダイレクトについては、template_redirect というのがあります。WordPress の全てのオブジェクトがインスタンス化されていて、かつ、サーバにはまだ何も送られていない段階のフックなので、いわば、リダイレクトの last resort です。wp_safe_redirect を使っても動作します。

    add_action('template_redirect', 'my_redirect_callback');
    function my_redirect_callback() {
        if (!is_user_logged_in() &&
            is_page(195) &&
            !isset($_POST['textfield1']) &&
            etc...) {
            wp_redirect(home_url('/login/'));
            exit();
        }
    }

    ついでですが、wp_nonce_field くらいは使った方がいいと思います。

    トピック投稿者 jyoi2727

    (@jyoi2727)

    kjmtsh様
    返答有り難うございます。

    入力チェックについて、Ajaxでの処理はクールでやってみたいんですが、当方のノウハウと納期の兼ね合い上、JavaScriptとPHPのサーバーサイドチェック処理の併用を予定しております。

    add_actionの使い道がよく解っていなかったのですが、なるほどこのような使い方をするのですね…!確かに、このやり方は便利そうです。
    ちなみに、この記述はfunctions.phpに行うんですよね。こういった、各固定ページ毎の入力チェックも、全てfunctions.phpからページ毎に枝分かれさせて行う方法がWPでは一般的なのでしょうか。現在は、入力チェックが必要なページについては、子テーマ(page-itemselect.php等)を用意し、そこの先頭で入力チェックを実施、エラーの場合はリダイレクトし、問題無ければpage.phpをインクルードすることで表示しております。

    wp nonce fieldは便利そうですね。イマイチ使い方が解りませんが、使ってみます。

    はい、その通りです。テーマディレクトリにある、functions.php に記述してください。

    全てfunctions.phpからページ毎に枝分かれさせて行う方法がWPでは一般的なのでしょうか。

    あまり一般的ではないと思います。最後の手段として、仕方なしにやっているという感じでしょうか。プラグイン作者たちは、Ajax を使うことが多いような気がします。

3件の返信を表示中 - 1 - 3件目 (全3件中)
  • トピック「テーマ内でのリダイレクト方法について」には新たに返信することはできません。