通过admin-post.php提交表单并处理错误

时间:2020-03-12 作者:Jon

我有一个使用页面模板添加到页面的自定义表单(由于特定原因,我不想使用插件)。我正在使用提交此表单admin-post.php. 在…内functions.php 我有处理表单的功能,它正在工作。我可以在空白处显示验证错误admin-post.php 但显然那不是我想要的。

So here are my questions.

<我应该只做正常的重定向回到我的表单页面吗?类似于wp_redirect( \'/my-page/\',302);?

如何在包含表单的页面上显示我的错误?

关于成功,如何用成功消息替换表单?

我觉得我错过了拼图的一个关键部分。。。

Here is a stripped down version of the form.

<form action="<?php echo esc_url(admin_url(\'admin-post.php\')); ?>" method="post">
    <label for="tos_agree">
        <input type="checkbox" name="tos_agree" id="tos_agree" <?php if ($_POST[\'tos_agree\']){ echo \'checked="checked"\'; } ?> />
        Some text for the checkbox
    </label>

    <button type="submit" name="agree" value="I Agree">I Agree</button>

    <input name="action" type="hidden" value="updated_tos_agree" />
</form>

And My Function

function updated_tos_agree_submit() {

    function form_submit() {
        $error = new WP_Error();

        if (!$_POST[\'tos_agree\']){
            $error->add(\'notchecked\',\'You must agree to the Terms.\');
        }

        return $error;
    }

    $result = form_submit();

    if (is_wp_error($result)) {
        echo \'<ul>\';
            echo \'<li>\' . implode( \'</li><li>\', $result->get_error_messages() ) . \'</li>\';
        echo \'</ul>\';
    }else{
        // Update User Meta
    }

    die();
}

add_action(\'admin_post_nopriv_updated_tos_agree\', \'updated_tos_agree_submit\');
add_action(\'admin_post_updated_tos_agree\', \'updated_tos_agree_submit\');

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

我是否应该只执行常规重定向回我的表单页?类似于wp_redirect( \'/my-page/\', 302 );?

如何在包含表单的页面上显示错误?

有多种方式,包括:

在重定向URL中将错误代码作为查询字符串传递:example.com/my-page/?my_form_error=tos_agree_empty. 然后在表单/模板中,您可以执行以下操作echo $messages[ $_GET[\'my_form_error\'] ]; 哪里$messages 是错误消息的数组。(注意:在实际实现中,您应该清理查询值。)

将错误保存在transient &mdash;临时数据库选项。

关于成功,如何用成功消息替换表单?

与上述问题大致相同。因此,您可以:

在重定向URL中包含“成功”状态:example.com/my-page/?my_form_success=1. 然后在表单/模板中,可以执行以下操作if ( ! empty( $_GET[\'my_form_success\'] ) ) { echo \'Success.\'; } else { /* Display the form. */ }.

或者再次使用瞬态API保存(并检索)“成功”状态。

阅读这篇文章,你可能会发现它很有用here 这深入解释了如何使用admin-post.php, 此外,它还谈到了AJAX(admin-ajax.php) 这非常好,因为提交表单时不需要重新加载页面。但是,您应该使用REST API来创建custom endpoint 用于您的表单提交。:)

因此,我希望这个(新)答案对您有所帮助,您可以看到here 使用瞬态API持久化表单验证错误和提交的数据的示例,这些数据将在从admin-post.php. 我也希望linked answer 帮助,其中给出了使用template_redirect 在同一页面上启动;这个admin_post_ 钩子在管理中的不同页面上激发(wp-admin) 现场一侧。

相关推荐

为什么<?PHPECHO GET_TEMPLATE_DIRECTORY_URI()?>仍然输出/wp-Content/Themes/twentynineteen?

我开发了一些219个儿童模板。今天,我需要转换my last child-template 进入一个独立的模板中。我从样式中删除了以下行。css文件:Template: twentynineteen 并在我的函数中添加了几行。php文件:if ( ! function_exists( \'oripeau_setup\' ) ) : function oripeau_setup() { load_theme_textdomain( \'oripeau\', get_temp