我有一个表单,它的输出带有一个短代码。我需要能够有条件地处理表单提交上的重定向,因此表单处理需要在发送任何输出之前进行(我将其放在init
挂钩)。
访问表单验证状态的最佳方式是什么($validate
) 所以我可以输出表单中发现的任何错误(在短代码中)?使用全局变量是唯一的方法吗?如果可能的话,我会尽量避免。我将有多个表单也需要使用相同的流程。
add_action( \'init\', \'wpse_process_my_form\' );
function wpse_process_my_form() {
if ( ! empty( $_POST[\'submit\'] ) && \'myform\' == $_POST[\'submit\'] ) {
if ( $validate = wpse_validate_my_form( $_POST[\'form_data\'] ) ) {
$success = wpse_save_my_form( $_POST[\'form_data\'] );
if ( $success ) {
wp_redirect( \'/success\', 302 );
exit();
}
}
}
}
add_shortcode( \'myform\', \'wpse_my_form_shortcode\' );
function wpse_my_form_shortcode( $atts ) {
// Somehow get the errors ($validate) generated in the function attached to init
// output form (with errors if found)
return $form;
}
function wpse_save_my_form( $form_data ) {
// Run save process here, return true if successful
}
SO网友:cybmeta
一个可能的解决方案,我认为是一个很好的解决方案,就是使用一个具有属性的对象来存储验证状态,这样就可以在init操作挂钩中设置该属性的值,在那里处理表单并在短代码中访问它。例如:
class MyForm {
private $validate;
function __construct() {
add_shortcode( \'myform\', array($this, \'wpse_my_form_shortcode\') );
add_action( \'init\', array($this, \'wpse_process_my_form\') );
}
function wpse_my_form_shortcode( $atts ) {
// Somehow get the errors ($validate) generated in the function attached to init
$output = \'\';
// output form (with errors if found)
if( $this->validate[\'success\'] == \'error\' ){
$output .= \'<div class="error">\'.$this->validate[\'message\'].\'</div>\';
}
$output .= \'<form name="my_form" method="post">\';
$output .= \'<input type="text" name="form_data">\';
$output .= \'<button type="submit">\'.__(\'Submit\').\'</button>\';
$output .= \'</form>\';
return $output;
}
function wpse_process_my_form() {
if( isset($_POST[\'form_data\']) ) {
$this->wpse_validate_my_form( $_POST[\'form_data\'] );
if ( $this->validate[\'success\'] == \'success\' ) {
$success = $this->wpse_save_my_form( $_POST[\'form_data\'] );
if ( $success ) {
wp_redirect( \'/success\', 302 );
exit();
}
}
}
}
function wpse_save_my_form( $form_data ) {
// Run save process here, return true if successful
return true;
}
function wpse_validate_my_form( $data ) {
$validation = array();
if( $data == \'validate_me\' ) {
$validation[\'success\'] = "success";
$validation[\'message\'] = "the success message";
} else {
$validation[\'success\'] = "error";
$validation[\'message\'] = "the error message";
}
$this->validate = $validation;
}
}
new MyForm();
注意:这是一个简单的例子来向您展示这一点。