Как избежать повторной отправки формы при обновлении страницы? - PullRequest
0 голосов

Я делаю простую форму обратной связи на 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 голосов
/ 01 июня 2018

Я думаю, что вам нужно добавить токен в скрытое текстовое поле и в форму для отправки, текст в этом текстовом поле будет токеном, и его нужно менять при каждой загрузке страницы.Сохраните этот токен в переменной сеанса.Затем добавьте условие в верхней части страницы, чтобы проверить токен, если токен отличается, завершить процесс загрузки или отобразить сообщение или все, что вы считаете необходимым.Вы также можете добавить срок действия токена, чтобы разрешить отправку страницы в течение определенного периода времени.

Создание токена, проверка токена и срок действия токена обычно являются функцией, которая вызывается по мере необходимости и образует разные страницы.

Редактировать: Если все, что вам нужно, это перенаправить пользователя на другую страницу, выполните:

if(mail succeed) {
        header('location: thankyou.html');
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...