如何避免页面刷新时重新提交表单?

时间:2018-06-01 00:41:54

标签: wordpress forms

我正在WordPress上做一个简单的反馈表。和很多人一样,我在刷新浏览器页面时遇到了重新发送表单的问题。我知道通过使用“Post / Redirect / Get”模式解决了这个问题。这表示在处理数据$ _POST后需要使用$ _GET方法请求同一页面。但我不能使用wp_mail函数的结果进行重定向。

if(wp_mail($email, $email_subject, $email_message, $headers)) {
    add_action('send_headers', 'simplemail_add_header');
}
function simplemail_add_header() {
    header("Location: http://google.com");
} 

它不起作用。

UPD 这是我的完整代码:

class SimpleMailer {
    private $nonce = 'feedback_nonce';

    public function __construct() {
        add_action('phpmailer_init', array($this, 'simplemail_smtp_config'));
        add_shortcode('simplemail', array($this, 'simplemail_sendmail'));

    }


    public function simplemail_smtp_config($phpmailer) {
        $phpmailer->isSMTP();
        $phpmailer->SetFrom("admin@mail.com");
        $phpmailer->addAddress("sender@mail.com");
        $phpmailer->Host       = "ssl://smtp.mail.com";
        $phpmailer->SMTPAuth   = true;
        $phpmailer->Port       = 465;
        $phpmailer->Username   = "admin@mail.com";
        $phpmailer->Password   = "password";
        $phpmailer->SMTPSecure = 'ssl';
    }   


    public function simplemail_sendmail($shortcode_attributes) {
        global $wp;
        $result = "";
        $error = false;
        $data = array();
        $required_fields = array("feedback_name", "feedback_email", "feedback_message");

        $atts = shortcode_atts(array(
            "email" => get_bloginfo('admin_email'),
            "form_action" => home_url($wp->request),
            "form_cls" => '',
            "mail_subject" => "Feedback message from",
            "pls_name" => 'Your Name',
            "pls_email" => 'Your E-mail Address',
            "pls_message" => 'Your Message',
            "label_submit" => 'Submit',
            "error_common" => 'There was some mistake. Try again, a little later.',
            "error_empty" => 'Please fill in all the required fields.',
            "error_noemail" => 'Please enter a valid e-mail address.',
            "success" => 'Thanks for your e-mail! We\'ll get back to you as soon as we can.'
        ), $shortcode_attributes);

        if ($_SERVER['REQUEST_METHOD'] == 'POST') {
            foreach ($_POST as $field => $value) {
                if (get_magic_quotes_gpc()) {
                    $value = stripslashes($value);
                }
                $data[$field] = trim(strip_tags($value));
            }

            foreach ($required_fields as $required_field) {
                $value = trim($data[$required_field]);
                if(empty($value)) {
                    $error = true;
                    $result = $atts['error_empty'];
                }
            }

            if(!empty($data["feedback_blank"])) {
                $error = true;
                $result = $atts['error_empty'];
            }

            if(!is_email($data['feedback_email'])) {
                $error = true;
                $result = $atts['error_noemail'];
            }

            if(!wp_verify_nonce($data[$this->nonce],'simplemail_nonce')) {
                $error = true;
                $result = $atts['error_common'];
            }

            if ($error == false) {
                $email_subject   = $atts['mail_subject']." [".get_bloginfo('name')."]";
                $email_message   = $data['feedback_message']."\n\n";
                $headers         = "From: ".$data['feedback_name']." <".$data['feedback_email'].">\n";
                $headers        .= "Content-Type: text/plain; charset=UTF-8\n";
                $headers        .= "Content-Transfer-Encoding: 8bit\n";
                if(wp_mail(null, $email_subject, $email_message, $headers)) {
                    add_action('send_headers', array($this, 'simplemail_add_header', 10, $atts['form_action']));
                    // wp_redirect( 'http://google.com', 301 ); 
                    // exit;
                }
                $data = array();
                $result = $atts['success'];
            }
        }
        return $this->simplemail_draw_form($atts, $data, $result);
    }   


    public function simplemail_draw_form($atts, $data, $result) {
        $output = "<form action='".$atts['form_action']."' class='".$atts['form_cls']."' method='post'>".PHP_EOL.
            "<input type='text' name='feedback_name' placeholder='".$atts['pls_name']."' value='".@$data['feedback_name']."'>".PHP_EOL.
            "<input type='text' name='feedback_blank'>".PHP_EOL.
            "<input type='email' name='feedback_email' placeholder='".$atts['pls_email']."' value='".@$data['feedback_email']."'>".PHP_EOL.
            "<textarea name='feedback_message' cols='30' rows='10' placeholder='".$atts['pls_message']."'>".@$data['feedback_message']."</textarea>".PHP_EOL;

        $output .= wp_nonce_field('simplemail_nonce', $this->nonce, false);
        $output .= ($result != "") ? '<div class="feedback-info">'.$result.'</div>' : '<div class="feedback-info"></div>';
        $output .= "<button type='submit'>".$atts['label_submit']."</button>".PHP_EOL."</form>";

        return $output;
    }   

    public function simplemail_add_header($location) {
        header("Location: {$location}");
    }   


}

$simplemailer = new SimpleMailer();

如果我取消注释重定向,我会收到此错误。如果您尝试使用simplemail_add_header

,那就什么都没有了
Warning: Cannot modify header information - headers already sent by (output started at /var/www/vhosts/12/151953/webspace/httpdocs/skgk.kz/wp-includes/nav-menu-template.php:256) in /var/www/vhosts/12/151953/webspace/httpdocs/skgk.kz/wp-includes/pluggable.php on line 1216

1 个答案:

答案 0 :(得分:0)

我认为您需要在隐藏的文本框中添加令牌并在要提交的表单中,此文本框中的文本将是令牌,并且需要在每次加载页面时更改。将此标记保存在会话变量中。然后在页面顶部添加一个条件以验证令牌,如果令牌不同则终止加载过程或显示消息或您认为需要的任何内容。您还可以添加令牌寿命,以允许在一定时间内提交页面。

令牌创建,令牌验证和令牌长寿通常是某个地方根据需要调用并形成不同页面的函数。

编辑: 如果你想要的只是将用户重定向到另一个页面,那么执行:

if(mail succeed) {
        header('location: thankyou.html');
    }