我正在编写一个插件来创建和处理一个简单的表单。这是我目前的做法,但事实证明它有一些主要缺陷:
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;
}
?>