“无法修改页眉信息-页眉”警告显示刷新时如何防止页面重新提交

时间:2018-07-13 作者:J.D.

I know that there are many possible duplicates but i keep receiving this error each time

我目前正在制作WordPress联系人表单,它是作为插件创建的。我需要在提交表单后用新的干净表单重定向到同一页面。问题是,如果我放置标题(“位置…)它向我显示消息

警告:无法修改标题信息-标题已由C:\\xampp\\htdocs\\WP\\WP content\\themes\\group test\\header.php:13)中的C:\\xampp\\htdocs\\WP\\WP content\\plugins\\form example\\form example发送。php在线84

表单工作正常,在我按下提交按钮后它会发送电子邮件,但问题是它会保留旧的输入值,每次重新加载或提交后,即使表单为空,它也会再次发送这些值。。。对我来说,最好的决定不是重新加载页面,而是在我按“提交”后显示一些消息,并将表单中的输入值清空为其他WP表单功能(联系7等),但我知道需要Ajax。。。但首先,如果有人告诉我错在哪里,我会很高兴。

<?php
/*
 Plugin Name: Example Contact Form
 Plugin URI: http://jd.com
 Description: Contact Form
 Version: 1.0
 Author: JD
 Author URI: http://jd.com
 */
function html_form_code() {    
    ?> 
<form action="<?php esc_url( $_SERVER[\'REQUEST_URI\'] )?>" method="post" class="contact-form" id="newsletterform">
    <div class=header-contact>
        <p><h2>Contact Form</h2></p>
        <hr>
    </div>

    <div class=input-containers>
        <input type="text" id="name" name="cf-name" pattern="[a-zA-Z0-9 ]+" value="" size="40" placeholder="Име и фамилия"/>
    </div>
    <div class=input-containers>
        <input type="email" name="cf-email" value="" size="40" placeholder="Поща"/>
    </div>
    <div class=input-containers>
        <input type="text" name="cf-subject" pattern="[a-zA-Z ]+" value="" size="40" placeholder="Относно"/>
    </div>
    <div class=input-containers>
        <textarea rows="10" cols="35" name="cf-message" placeholder="Текст"></textarea>
    </div>
    <div class=input-containers>
        <input type="submit" name="cf-submitted" value="Send" >
    </div>
</form>
<?php
}
//function to generate response

function deliver_mail() {
    require_once "wp-includes/class-phpmailer.php";
    $verificationMessages = array();

    // if the submit button is clicked, send the email
    if ( isset( $_POST[\'cf-submitted\'] ) ) {    
        // sanitize form values
        $name    = sanitize_text_field( $_POST["cf-name"] );
        $email   = sanitize_email( $_POST["cf-email"] );
        $subject = sanitize_text_field( $_POST["cf-subject"] );
        $message = esc_textarea( $_POST["cf-message"] );

        $headers = "From: $name <$email>" . "\\r\\n";
        // Localhost
        $mail = new PHPMailer(true);
        $mail->IsSMTP(); // telling the class to use SMTP
        $mail->CharSet = \'UTF-8\';

        $mail->SMTPDebug = 0;                     // enables SMTP debug information (for testing)
        $mail->SMTPAuth = true;                  // enable SMTP authentication
        $mail->SMTPSecure = "ssl";                 // sets the prefix to the servier
        $mail->Host = "mail.gmx.com";      // sets GMX as the SMTP server for example: mail.gmx.com
        $mail->Port = 465;                 // set the SMTP port for the GMX server


        $mail->Username = $email;
        $mail->Password = \'pass\';

        $mail->SetFrom($email, $name);
        $mail->AddAddress($email);

        $mail->Subject = $subject;
        $mail->MsgHTML($message);

        $headers .= "Content-Type: text/html; charset=utf-8";
        $headers .= "Content-Transfer-Encoding: 8bit";

        try {
            $mail->send();
            $msg = "An email has been sent for verfication.";
            $msgType = "success";
            array_push($verificationMessages, "Check your email to activate your account");
            header("location: http://localhost/wp/");

        } catch (Exception $ex) {
            $msg = $ex->getMessage();
            $msgType = "warning"; 
            array_push($verificationMessages, "Wrong");
            header("location: http://localhost/wp/");
        }      
    }
}

function cf_shortcode() {
    ob_start();

    deliver_mail();
    html_form_code();

    ob_end_flush(); 
    //return ob_get_clean();
}
add_shortcode( \'sitepoint_contact_form\', \'cf_shortcode\' );

1 个回复
最合适的回答,由SO网友:Tom J Nowell 整理而成

所以根本问题是发送头,specifically the timing.

网页有http头,http头位于内容之前。标题告诉浏览器它正在接收什么,必须先发送它们。

当PHP输出内容时,它需要告诉浏览器期望输出,因此在输出字符的那一刻,PHP就会发送HTTP头,告诉浏览器期望输出。

一旦发送,就发送。马出了马厩,猫出了包,它们是无法改变的。

所以当你的站点到达你的短代码时,它已经输出了一个html元素、一个标题和一个标题等等,现在发送重定向标题已经太迟了!

As a result we can conclude, that redirecting inside a shortcode, is not possible. Another solution is required

根本问题是您试图在一个短代码内执行操作。在短代码中显示输出效果很好,但不利于实际处理。

因此,让我们在表单中添加一个隐藏的输入,以便在表单提交时使用:

<input type="hidden" name="form_submitted" value="true" />
然后在init 挂钩:

add_action( \'init\', function() {
    if ( ! empty( $_POST[\'form_submitted\'] ) ) {
        deliver_email();
    }
}
最后,修复直接输出而不是返回HTML字符串的损坏的短代码:

function cf_shortcode() {
    ob_start();

    html_form_code();

    return ob_get_clean();
}
其他注意事项:

为所有内容添加前缀,但选择一个比cfwp_mail 它的过滤器会很好exit 标题重定向后的语句使用wp_safe_redirect 而不是headerhome_url() etc

结束

相关推荐

How to modify admin headers

我正在尝试创建一个主题设置导出脚本,该脚本base\\u 64对主题选项进行编码,并允许用户将其下载为文本文件。我看到一个帖子(What is the best way to export and import theme options?) 这涉及检查查询变量,然后使用“template\\u redirect”操作重定向用户。然而,看起来这个操作只在站点的前端可用(不在管理中)。将操作添加到选项框架的构造函数中并没有任何作用。我可以通过将我的函数绑定到“admin\\u init”来启动它,但到那时,