带有管理员POST的$_POST表单请求

时间:2015-02-04 作者:Rubberducker

我尝试使用操作使用具有以下标记的表单admin-post.php

<form method=\'post\' action=\'admin-post.php\'>
我在用动作钩suggested by Wordpress 继续$\\u POST参数,它工作正常。然而,在执行之后,我得到了一个空白页面,没有重定向回插件页面。当然,我可以使用referer设置自定义重定向,但这是正常行为吗?

解决方法是使用action="" 并在我的普通插件代码中获取请求。

3 个回复
最合适的回答,由SO网友:bashleigh 整理而成

也许有点晚了,但我发现这一点时,我遇到了一些问题,所以我想我会把我的发现提供给未来的人。

我发现基本原则是有一个名为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 将被调用!:D

function 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请求等发送它们。

SO网友:mos fetish

在重定向之前,您可以将任何验证错误和post值保存到瞬态中。这些值将在url重定向后保持不变。

这正是WP core在返回错误时为设置API所做的。

因此:

-验证表单数据

-使用set\\u transient()将post数据存储在transient中

-在瞬态中存储任何错误

-重定向到表单输出

-检查瞬态中的错误

-将post值从瞬态加载到表单字段中

您可以使用会话或选项API,而不是瞬态。

现在,我已经在前端和管理员上尝试了各种处理表单提交的方法。我不确定admin\\u post\\uuu{action}是否那么方便,因为需要在重定向过程中保存数据和错误。使用init或admin\\u init钩子检查表单提交可能更容易。您也可以简单地将表单发布回同一页面,并在显示表单之前处理表单提交。

SO网友:juananruiz

简单的回答是,您必须完成所有工作:将用户输入保存到数据库中,检查错误或成功,并在完成后将其重定向到任何地方。

如果要再次重定向到表单,可以使用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();
    }
}

结束

相关推荐

My posts show 2 comment forms

我们有一个Wordpress网站,lifering.org, 在戈达迪主持。我们最近升级了虚拟服务器的Linux操作系统,这涉及到从备份重建站点。现在,我们的单篇帖子显示了两个评论回复表单。我相信我们之前每个帖子只有一个评论回复表。我不知道这是怎么发生的-我自己做了备份-或者如何修复它。