使用插件创建和处理表单的最佳实践?

时间:2010-11-10 作者:MathSmath

我正在编写一个插件来创建和处理一个简单的表单。这是我目前的做法,但事实证明它有一些主要缺陷:

1) 在插件激活时,在mysite上为表单创建一个空白页面。com/form,以及另一个用于在mysite处理表单的空白页。com/processform。(它们需要是具有不同URL的独立页面,以便通过谷歌分析跟踪提交的内容。否则,我只能通过AJAX来完成所有这些。我知道,我知道……这不是我的决定。)

2) 在“wp”操作中,查看我们所在的页面。

2a)如果是我的表单页面,请添加一个“the\\u content”过滤器来呈现表单(它需要一些动态隐藏元素,如nonce,这就是我最初创建表单页面时不只是包含表单标记的原因)。

2b)如果是我的processform页面,请添加“the\\u content”过滤器来处理帖子并提供任何反馈。

主要问题是我的邮件处理。我将它挂接到“the\\u content”过滤器(因为我需要它来提供反馈),但这个过滤器有时在页面加载过程中会运行多次,导致帖子被多次处理。

我已经包括了下面的内容,但我忍不住认为我的方法完全走错了方向。如果您需要使用插件创建和处理表单以获得成功的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;

    }

?>

1 个回复
最合适的回答,由SO网友:hakre 整理而成

这只是一个快速的反馈:使用一个短代码将表单插入到内容中。这些都很灵活。对于处理后的表单需要另一个URL,您可以添加一个重写端点,如/form/processed/you可以在提交后进行检查。这可能更加模块化。

最终阻止你处理the_content 过滤,因为您可以处理短代码回调中的任何内容。

这只是一个粗略的建议,但可能对你有用。

结束

相关推荐

找不到cForms操作处理程序页

我在任何地方都找不到cforms插件的操作处理程序页面。我想使用post值在cforms插件的action handler页面中编写一些函数。