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

1)在插件激活上,在mysite.com/form上为表单创建一个空白页,另一个空白页在mysite.com/processform上处理表单。 (它们需要是具有不同URL的独立页面,以便可以通过Google Analytics(分析)跟踪提交。否则,我只会通过Ajax完成所有这些。我知道,我知道...不是我的决定。)

2)在“ WP”操作上,检查我们打开的页面。

2a)如果是我的表单页面,请添加一个“ the_content”过滤器来渲染表单(它需要一些动态的隐藏元素,例如nonce,这就是为什么我最初创建表单页面时不仅包含表单标记)。

2b)如果是我的过程形式页面,请添加一个“ the_content”过滤器来处理帖子并呈现任何反馈。

主要问题是我的帖子处理。我将其连接到“ the_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;

    }

?>
有帮助吗?

解决方案

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

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

这只是一个粗略的建议,但可能会为您完成这项工作。

许可以下: CC-BY-SA归因
scroll top