使用插件创建和处理表格的最佳实践?
-
16-10-2019 - |
题
我正在编写一个创建和处理简单表单的插件。这是我的方法,但事实证明它有一些主要缺陷:
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
过滤,因为您可以处理短代码回调中的任何内容。
这只是一个粗略的建议,但可能会为您完成这项工作。