WP_REDIRECT在前端提交表单后“邮件头已发送”

时间:2013-01-14 作者:Josh

我正在尝试设置一个前端帖子提交表单。我得到一个错误:

Warning: Cannot modify header information - headers already sent by (output started at /home/sadlight/public_html/members/wp-content/themes/default-child/announcement-submit.php:1) in /home/sadlight/public_html/members/wp-includes/pluggable.php on line 876
公告提交。php是我下面的模板。

我试过了this solution, 但是不行。

此外,当我在下面的代码中使用wp\\u重定向时,它会插入两篇文章,而不是一篇。当我移除它时,它只进入一个。任何帮助都会很好!

仅供参考:我正在使用buddypress和默认的buddypress主题。

<?php

/*
 * Template Name: Announcement Submit
  */

$postTitleError = \'\';
if ( isset( $_POST[\'submitted\'] ) ) {
    if ( trim( $_POST[\'postTitle\'] ) === \'\' ) {
        $postTitleError = \'Please enter a title.\';
        $hasError = true;
    }
}


get_header(); ?>

    <div id="content">
        <div class="padder">

            <form action="" id="primaryPostForm" method="POST">
                <fieldset>
                    <label for="postTitle"><?php _e(\'Post Title:\', \'framework\') ?></label>
                    <input type="text" name="postTitle" id="postTitle" class="required" value="<?php if ( isset( $_POST[\'postTitle\'] ) ) echo esc_attr( stripslashes( $_POST[\'postTitle\'] ) ); ?>" />
                </fieldset>
                <fieldset>
                    <?php wp_editor( \'Testing some content\', \'postcontent\'); ?>
                </fieldset>
                <fieldset>
                    <?php wp_nonce_field( \'post_nonce\', \'post_nonce_field\' ); ?>
                    <input type="hidden" name="submitted" id="submitted" value="true" />
                    <button type="submit"><?php _e(\'Add Post\', \'framework\') ?></button>
                </fieldset>
            </form>

            <?php if ( $postTitleError != \'\' ) { ?>
                <span class="error"><?php echo $postTitleError; ?></span>
                <div class="clearfix"></div>
            <?php } ?>

            <?php
                if ( isset( $_POST[\'submitted\'] ) && isset( $_POST[\'post_nonce_field\'] ) && wp_verify_nonce( $_POST[\'post_nonce_field\'], \'post_nonce\' ) ) {
                    if ( trim( $_POST[\'postTitle\'] ) === \'\' ) {
                        $postTitleError = \'Please enter a title.\';
                        $hasError = true;
                    }
                    $post_information = array(
                        \'post_title\' => wp_strip_all_tags( $_POST[\'postTitle\'] ),
                        \'post_content\' => wp_kses_post( $_POST[\'postcontent\'] ),
                        \'post_type\' => \'post\',
                        \'post_status\' => \'pending\'                                      
                    );
                    wp_insert_post( $post_information );                    
                }

                $post_id = wp_insert_post( $post_information );

                if ( $post_id ) {
                    wp_redirect( home_url() );
                    exit;                   
                }
            ?>

        </div><!-- .padder -->
    </div><!-- #content -->

    <?php get_sidebar(); ?>

<?php get_footer(); ?>

3 个回复
最合适的回答,由SO网友:EAMann 整理而成

正如奥托所指出的,在调用之前,您正在向浏览器发送数据wp_redirect().

  • get_header() 将输出页面的HTML<head>
  • 您正在将整个表单打印到页面,然后再进行处理
要解决“邮件头已发送”问题,您需要将所有表单处理从页面底部移动到页面顶部。如果你需要打电话wp_redirect() 你必须打那个电话before 您可以在页面上打印任何内容—HTML或其他任何内容。

至于重复的post条目,您有wp_insert_post() 在代码中输入两次:

if ( isset( $_POST[\'submitted\'] ) && isset( $_POST[\'post_nonce_field\'] ) && wp_verify_nonce( $_POST[\'post_nonce_field\'], \'post_nonce\' ) ) {
    if ( trim( $_POST[\'postTitle\'] ) === \'\' ) {
        $postTitleError = \'Please enter a title.\';
        $hasError = true;
    }
    $post_information = array(
        \'post_title\' => wp_strip_all_tags( $_POST[\'postTitle\'] ),
        \'post_content\' => wp_kses_post( $_POST[\'postcontent\'] ),
        \'post_type\' => \'post\',
        \'post_status\' => \'pending\'                                      
    );
    wp_insert_post( $post_information );                    
}

$post_id = wp_insert_post( $post_information );
因此,您试图在每次页面加载时插入帖子,但如果没有提交任何内容,则$post_information 不会设置变量,也不会插入任何内容。然而,当您提交表单时,您正在布尔检查内部和布尔检查外部创建一个新帖子。

SO网友:Otto

标题已由发送(输出开始于/home/sadlight/public\\u html/members/wp-content/themes/default-child/announcement-submit。php:1)

错误消息准确地告诉您需要知道的内容。

“announcement submit.php”就是问题所在。

“1”是问题的行号。

所以,在你的初始<?php 导致输出的线路。也许是空行。或者UTF-8 BOM。

在纯文本编辑器中加载文件。没什么特别的。也许是记事本吧。或VIM。确保在启动PHP标记之前不存在任何内容。保存文件。或者,在您选择的编辑器中,检查保存选项,并确保未将其设置为在文件开头保存BOM表(字节顺序标记)。

SO网友:PeeHaa

这可能有多种原因。只有在前面没有输出时,才能发送标头。对于输出,我指的是任何输出。所以在PHP开始标记之前没有空格,没有echo没有BOM表字符。

基本上,该错误消息会准确地告诉您输出的开始位置,因此这就是发生上述事情的地方。

有关您应该检查的内容的完整列表以及如何防止此错误,请参阅此罚款Stack Overflow post.

结束

相关推荐