我尝试使用操作使用具有以下标记的表单admin-post.php
<form method=\'post\' action=\'admin-post.php\'>
我在用动作钩suggested by Wordpress 继续$\\u POST参数,它工作正常。然而,在执行之后,我得到了一个空白页面,没有重定向回插件页面。当然,我可以使用referer设置自定义重定向,但这是正常行为吗?解决方法是使用action=""
并在我的普通插件代码中获取请求。
我尝试使用操作使用具有以下标记的表单admin-post.php
<form method=\'post\' action=\'admin-post.php\'>
我在用动作钩suggested by Wordpress 继续$\\u POST参数,它工作正常。然而,在执行之后,我得到了一个空白页面,没有重定向回插件页面。当然,我可以使用referer设置自定义重定向,但这是正常行为吗?解决方法是使用action=""
并在我的普通插件代码中获取请求。
也许有点晚了,但我发现这一点时,我遇到了一些问题,所以我想我会把我的发现提供给未来的人。
我发现基本原则是有一个名为action
它的值是一个自定义集标识符。例如
<input name=\'action\' type="hidden" value=\'custom_form_submit\'>
使用此输入,并且窗体操作指向admin-post.php
可以设置操作。我们使用admin_post_custom_form_submit
.为了使事情更复杂,我们可以使用wp_nonce_field
我认为这是一个基本的安全问题。基本上,它会添加一个随机的$\\u POST值。很公平。
接下来,我们要这样设置我们的操作:
add_action(\'admin_post_custom_form_submit\',\'our_custom_form_function\');
所以当有表格提交给admin-post.php
动作值为custom_form_submit
功能our_custom_form_function
将被调用!:Dfunction our_custom_form_function(){
//print_r($_POST);
//you can access $_POST, $GET and $_REQUEST values here.
wp_redirect(admin_url(\'admin.php?page=your_custom_page_where_form_is\'));
//apparently when finished, die(); is required.
}
现在你说你得到了一张白纸。这是因为我们需要重定向回表单。我用了一个简单的wp_redirect()
希望这有所帮助:)我将尝试找出如何进行验证并将错误返回到重定向表单。我想最简单的办法就是$_GET
在我们的页面上找到它的价值,但它不是很好,是吗?
我还发现,一旦提交$_POST
已清除!!DX这可能与重定向有关。我会用谷歌看看我能找到什么:d
希望这有所帮助:)
UPDATE
我做了更多的工作,并意识到返回值的唯一真正方法是使用$\\u GET变量。这样,您可以重新输入任何post值。只是别忘了使用urlencode()
以确保包含特殊字符,如“@”等。我有多个页面包含我正在处理的内容,所以我对不同的页面进行了两次不同的重定向,并包含了错误等等。他们在我的表格上方检查了它们。
另一个方便的功能。http_build_request()
可以将数组转换为“url安全”数组,以便通过$\\u GET请求等发送它们。
在重定向之前,您可以将任何验证错误和post值保存到瞬态中。这些值将在url重定向后保持不变。
这正是WP core在返回错误时为设置API所做的。
因此:
-验证表单数据
-使用set\\u transient()将post数据存储在transient中
-在瞬态中存储任何错误
-重定向到表单输出
-检查瞬态中的错误
-将post值从瞬态加载到表单字段中
您可以使用会话或选项API,而不是瞬态。
现在,我已经在前端和管理员上尝试了各种处理表单提交的方法。我不确定admin\\u post\\uuu{action}是否那么方便,因为需要在重定向过程中保存数据和错误。使用init或admin\\u init钩子检查表单提交可能更容易。您也可以简单地将表单发布回同一页面,并在显示表单之前处理表单提交。
简单的回答是,您必须完成所有工作:将用户输入保存到数据库中,检查错误或成功,并在完成后将其重定向到任何地方。
如果要再次重定向到表单,可以使用wp_nonce()
包含在$_POST
表单发送的数组:$_POST[\'_wp_http_referer\']
最后,您可以使用重定向并发送成功或错误消息wp_safe_redirect()
, esc_url_raw()
和add_query_arg()
.
add_action( \'admin_post_my-action\', \'my_save_form_function\' );
add_action( \'admin_post_nopriv_my-action\', \'my_save_form_function\' );
function my_save_form_function() {
if ( ! empty( $_POST[\'_wp_http_referer\'] ) ) {
$form_url = esc_url_raw( wp_unslash( $_POST[\'_wp_http_referer\'] ) );
} else {
$form_url = home_url( \'/\' );
}
if ( isset( $_POST[\'name\'] )
&& isset( $_POST[\'description\'] )
&& isset( $_POST[\'my-nonce\'] )
&& wp_verify_nonce(
sanitize_text_field( wp_unslash( $_POST[\'my-nonce\'] ) ),
\'my-action\'
)
) {
// Save your form data...
//All works fine ?
wp_safe_redirect(
esc_url_raw(
add_query_arg( \'my_status\', \'success\', $form_url )
)
);
exit();
} else {
wp_safe_redirect(
esc_url_raw(
add_query_arg( \'my_status\', \'error\', $form_url )
)
);
exit();
}
}
我们有一个Wordpress网站,lifering.org, 在戈达迪主持。我们最近升级了虚拟服务器的Linux操作系统,这涉及到从备份重建站点。现在,我们的单篇帖子显示了两个评论回复表单。我相信我们之前每个帖子只有一个评论回复表。我不知道这是怎么发生的-我自己做了备份-或者如何修复它。