在 wordpress 中编码时防止双重表单提交

Posted

技术标签:

【中文标题】在 wordpress 中编码时防止双重表单提交【英文标题】:Prevent double form submission when coding in wordpress 【发布时间】:2013-01-10 04:39:01 【问题描述】:

我目前正在使用 wordpress 3.5 并创建自己的页面模板。我在该模板中有自己的表单,当我单击提交按钮时,它已成功将数据保存到我的数据库中。不幸的是,当我点击浏览器上的 F5 或刷新按钮时,它会提示一个警告,提示如果我继续,将会有双重表单提交。

通常我通过使用“提交后重定向到同一页面”技术来防止这种情况。但我不能使用 header("location: ") 重定向,因为它会生成错误:警告:无法修改标头信息 - 标头已由发送。可能在其他 wordpress 文件上有回显,阻止重定向。

有谁知道如何解决这个问题?或者有人知道除重定向之外的其他技术来防止双重表单提交吗?

【问题讨论】:

【参考方案1】:

我总是用 javascript 来做这个:

<?php if(isset($_POST['submit_flag'])) ?>

<script type='text/javascript'>
    window.location='URL';
</script>

<?php  ?>

但现在我想了想,您可以轻松地在您的主题中的某个位置创建另一个 PHP 页面,该页面不包含在您的主题的其余部分中,以处理表单数据并重定向回您的表单。

我也有大约 98% 的把握,您可以通过简单地要求“wp-blog-header.php”来包含 $wpdb 而无需发送标头。

【讨论】:

这是个好主意。我创建了一个 PHP 页面并将表单操作添加到该页面。然后新页面只是使用元重定向将其重定向回我的页面。非常感谢【参考方案2】:

除了在您的模板文件中没有输出。那会是什么?查看您网站的源代码,它只是您告诉 Wordpress 创建的内容。

首先:您可以在首先调用的模板文件的顶部使用 header("Location: ")。通常是 header.php。

其次,您可以(通常应该)使用钩子来处理表单。例如:

add_action( 'init', function()  
    // Handle stuff
 );

但也许有不同的钩子(我不记得有任何最佳实践)。这里和那里的教程会给你建议。在这种情况下,您肯定会在有任何输出之前调用 header("Location: " )。你的主题还没有涉及到。

【讨论】:

以上是关于在 wordpress 中编码时防止双重表单提交的主要内容,如果未能解决你的问题,请参考以下文章

用于防止双重提交的纯 Java/JSF 实现

Ajax 和防止双重“提交”

防止表单提交字段输入键keydown? [复制]

Wordpress 联系表 7 插件提交到特定页面

在 iframe 中双重提交值表单

防止在后端ASP.NET Core 3中提交双重形式的提交。*