我有一个使用页面模板添加到页面的自定义表单(由于特定原因,我不想使用插件)。我正在使用提交此表单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\');
最合适的回答,由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
) 现场一侧。