web-dev-qa-db-ja.com

プラグインを使用してフォームを作成および処理するためのベストプラクティス

単純なフォームを作成して処理するプラグインを書いています。これは私のやり方ではありませんでしたが、いくつかの大きな欠陥があることがわかりました。

1)プラグインの有効化時に、mysite.com/formでフォーム用の空白ページを作成し、mysite.com/processformでフォームを処理するための別の空白ページを作成します。 (Googleアナリティクスで投稿を追跡できるようにするには、個別のURLを含む個別のページにする必要があります。そうでなければ、AJAXを使用してこれをすべて実行します。私の判断ではありません。)

2) "wp"アクションで、どのページにいるのかを確認します。

2a)私のフォームページの場合は、フォームをレンダリングするための "the_content"フィルタを追加します(nonceのような動的な隠し要素が必要なので、フォームページを最初に作成したときにフォームマークアップを含めなかったのです)。

2b)それが私のprocessformページである場合、POSTを処理してフィードバックを表示するための "the_content"フィルタを追加します。

主な問題は私のPOSTの取り扱いにあります。私はそれを "the_content"フィルタに結びつけています(フィードバックを提供する必要があるからです)が、このフィルタはページロード中に複数回実行され、POSTが複数回処理されることがあります。

私は自分の下に持っているものを含めました、しかし私は私のアプローチで私が完全に間違った軌道に乗っていると考えるのを助けることができません。成功したURLにアクセスするのに必要な場合(つまり、AJAX経由ではない場合)、プラグインを使用してフォームをどのように作成および処理しますか?

私のコード:

<?php

    // On activation, create the blank pages
    function my_form_install() {

        // CREATE THE FORM PAGE
        $page_markup = '';

        $arr_page_options = array(
            'post_status' => 'publish',
            'post_type' => 'page',
            'post_author' => 1,
            'post_title' => 'Form',
            'post_content' => $page_markup,
            'comment_status' => 'closed'
        );

        // CREATE THE FORM PROCESSING/SUCCESS PAGE
        $success_page_markup = '';

        $arr_success_page_options = array(
            'post_status' => 'publish',
            'post_type' => 'page',
            'post_author' => 1,
            'post_title' => 'Form Process',
            'post_content' => $success_page_markup,
            'comment_status' => 'closed'
        );

    }
    register_activation_hook(__FILE__,'my_form_install');


    // On the wp action, check to see if this is one of our pages. If so, add our filters.
    function check_current_page($obj_wp) {

        if(isset($obj_wp->query_vars["pagename"])) {
            $page_name = $obj_wp->query_vars["pagename"];

            switch($page_name) {

                case "form":
                    add_filter('the_content', 'my_render_form');
                    break;

                case "form-process":
                    add_filter('the_content', 'my_process_form');
                    break;

            }   

        }

    }
    add_action('wp', 'check_current_page');

    // Function to render the form
    function my_render_form($page_markup) {


        $page_markup .= '<form method="post" action="/form-process">
        <input type="text" name="some_input_field" />
        <input type="submit" value="submit" />
        </form>';

        return $page_markup;

    }

    // Function to process the form
    function my_process_form($page_markup) {

        if($_POST) {

            // Do the form processing. This would involve many possible returns, 
            // but I've just included one to simplify thigns.
            $page_markup .= 'Your form has been processed.';

        }

        return $page_markup;

    }

?>
2
MathSmath

これは簡単なフィードバックです。ショートコードを使用してフォームをコンテンツに挿入します。それらはかなり柔軟です。そして、処理されたフォームが別のURLを持つ必要がある場合は、/ form/processed /のような書き換えエンドポイントを追加することができます。そして送信後に確認できます。それはおそらくもっとモジュラーです。

結局、ショートコードコールバックの中で何かを扱うことができるので、the_contentフィルタを扱うことができなくなります。

それは大まかな提案だけですが、おそらくあなたのために仕事をします。

2
hakre