我将WordPress作为CMS运行。我整理了一个简单的多部分表单,效果很好,可以从前端发布。它分为两部分,第一部分是他提交数据的地方,第二部分是他预览刚提交的数据的地方。提交的数据按预期在wp中创建了一个不错的草稿帖子。
这是表单页面模板中的第一部分代码,用于显示表单。在代码的下部,您会注意到一个PREVIEW一节(阅读代码中的注释),其中显示了刚刚提交的数据。所有这些工作都非常好,提交后,我什至能够检索图像。
<?php
global $wpdb;
$this_page = $_SERVER['REQUEST_URI'];
$page = $_POST['page'];
if ( $page == NULL ) { ?>
<form method="POST" id="test_form" name="test_form" enctype="multipart/form-data" action="">
<div>LOCATION : <input type="text" name="location" id="location"/></div>
<div>DESCRIPTION : <textarea id="details" cols="80" rows="10 maxlength="600" name="details" rows="20"></textarea></div>
<div>UPLOAD IMAGE : <input type="file" name="loc-image" id="loc-image" tabindex="25" /></div>
<input type="hidden" value="1" name="page" />
<input type="hidden" name="action" value="post_action" />
<input type="submit" name="submit" id="submit" value="PROCEED"/>
</form>
<?php
} else if ( $page == 1 ) { ?>
<?php include_once('validate_first_step.php'); ?>
<?php if (isset($_POST['submit']) && (!empty($error))) { ?>
<h3>Submission Failed. Errors highlighted below.</h3><br/>
<a href="javascript:history.go(-1)">GO BACK</a><br/><br/>
<?php echo $error . '</br>';
} else { ?>
<?php echo 'h2>'.'YOUR SUBMISSION IS ACCEPTED. PREVIEW.'. '</h2>';?>
<?php //PREVIEW SECTION OF THE FORM BEGINS
$location=$_POST['location'];
$description=$_POST['details'];
?>
<?php
echo 'Location : ' . $location . '</br>';
echo 'Details : ' . $description . '</br>';
?>
<?php echo wp_get_attachment_image( $newupload,'medium' ); ?>
<?php //PREVIEW ENDS
}
}
?>
这是处理表单的方式。实际的代码非常复杂,我刚刚在这里输入了传达想法的必要条件。用于插入wordpress的相当标准的东西。
if( 'POST' == $_SERVER['REQUEST_METHOD'] && !empty( $_POST['action'] ) && $_POST['action'] == "post_action") {
// Do some minor form validation to make sure there is content
if (isset($_POST['submit'])) {
$error = "";
if ($_POST['details'] != null) {
$description = trim(strip_tags($_POST['details']));
} else {
$error .= 'Put description.</br>';
}
if ($_POST['location'] != null) {
$location = trim(strip_tags($_POST['location']));
} else {
$error .= 'Put location.</br>';
}
}
if (empty($error)) {
$new_post = array( //insert form inputs, set var and define array
'post_title' => $location,
'post_content' => $description,
'post_status' => 'draft',
'post_author' => '2',
'post_type' => 'post'
// assigning tags and categories are no issue
);
$pid = wp_insert_post($new_post);
//attachment helper function
function insert_attachment($file_handler,$post_id,$setthumb='false') {
if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK){ return __return_false();
}
require_once(ABSPATH . "wp-admin" . '/includes/image.php');
require_once(ABSPATH . "wp-admin" . '/includes/file.php');
require_once(ABSPATH . "wp-admin" . '/includes/media.php');
$attach_id = media_handle_upload( $file_handler, $post_id );
//set post thumbnail
if ($setthumb) update_post_meta($post_id,'_thumbnail_id',$attach_id);
return $attach_id;
}
//INSERT OUR MEDIA ATTACHMENTS
if ($_FILES) {
foreach ($_FILES as $file => $array) {
$newupload = insert_attachment($file,$pid);
}
}
} //end of if empty error
}
问题:这是我在测试表格时注意到的问题。在我处于“预览”部分时提交表单后,当我刷新页面时,数据将按预期正确显示,但是将同一数据再次提交到wordpress中,从而创建了重复的草稿。
尝试过的事情:我知道重定向解决方案,并且能够使用wp_redirect,但是重定向并不是我想要的,因为我需要向他们展示预览。我已经花了几个小时寻找解决方案和替代方案,并且仍在继续。
请求:请让我知道如何阻止这种情况的发生。我不能指望人们不要单击刷新,他们基本上会做他们想做的事。因此,我想使用服务器端php来代替javascript通知。即使禁用了javascript,它也会执行,其余的代码也会执行。基本上,我需要一种解决方案,该解决方案在提交后完全忽略刷新。请给我建议代码或正确方向的提示,以使之成为可能。非常感谢。
更新:正如@ user2758004所建议的,我尝试了比较方法,它起作用了。我将以下代码放在处理器顶部。
$location=$_POST['location'];
$args = array(
'post__not_in'=> array($id),
'post_type' => 'post',
'post_status' => array('publish','pending','draft','future','private'),
'meta_query' => array(
'relation' => 'AND',
array(
'key' => 'location',
'value' => $location,
'compare' => '='
),
)
);
现在在处理器中,我检查meta_key'full_name'的meta_value是否已经存在。如果确实如此,则表单将显示错误并仅停止该过程。希望它能帮助某人。
$existingMeta = get_posts( $args );
if(!empty($existingMeta)){
$error .= 'Bummer, ' .$location. ' is already in database.</br>';
return;
}
else {
//check for rest of the errors
}
可能有两种方法:
在将表单数据添加到数据库之前,请检查用户最后提交的表单数据,将它们进行比较(如果它们相同),然后拒绝。
使用jquery的ajax帖子将数据提交到特定的处理脚本,然后即使用户刷新,浏览器也不会显示“您是否想再次提交?” 小费。(我目前正在使用此技巧,并且效果很好)
PS。第一个解决方案很容易提出,但并不是完美的,当用户不小心刷新页面时,丑陋的“您想再次提交吗?” 仍然显示,我认为最好将这两种方法结合起来以增加安全性。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句