web-dev-qa-db-fra.com

wp_redirect "en-têtes déjà envoyés" après le formulaire de soumission frontal

J'essaie de mettre en place un formulaire de soumission postérieur. Et j'obtiens cette erreur:

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

annonce-submit.php est mon modèle ci-dessous.

J'ai essayé cette solution , mais non.

De plus, lorsque j'utilise wp_redirect dans mon code ci-dessous, il insère DEUX publications au lieu d'un. Quand je l'enlève, il n'en entre qu'un. Toute aide est la bienvenue!

Juste pour des infos supplémentaires: j'utilise buddypress avec le thème par défaut de 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(); ?>
1
Josh

Comme Otto l'a fait remarquer, vous envoyez des données au navigateur avant d'appeler wp_redirect().

  • get_header() affichera le code HTML de la page <head>
  • Vous imprimez l'intégralité du formulaire sur la page avant de le traiter.

Pour résoudre le problème des "en-têtes déjà envoyés", vous devez déplacer l'intégralité du traitement de votre formulaire du bas de la page vers le haut de la page. Si vous devez appeler wp_redirect(), vous devez effectuer cet appel avant vous imprimez quoi que ce soit - HTML ou autre - sur la page.

En ce qui concerne l’envoi en double, vous avez wp_insert_post() deux fois dans votre code:

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 );

Vous essayez donc d'insérer un post à chaque chargement de page mais si rien n'a été soumis, la variable $post_information ne sera pas définie et rien ne sera inséré. Toutefois, lorsque vous soumettez le formulaire, vous créez un nouveau message à la fois dans le contrôle booléen et en dehors du contrôle booléen.

7
EAMann

en-têtes déjà envoyés par (sortie commencée à /home/sadlight/public_html/members/wp-content/themes/default-child/announcement-submit.php:1)

Le message d'erreur vous dit exactement ce que vous devez savoir.

Le "annonce-submit.php" est où le problème est.

Le "1" est le numéro de ligne du problème.

Donc, vous avez réellement quelque chose avant votre ligne <?php initiale qui provoque la sortie. Une ligne blanche, peut-être. Ou la nomenclature UTF-8, peut-être.

Chargez le fichier dans un éditeur de texte brut. Rien d'extraordinaire. Bloc-notes, peut-être. Ou VIM. Assurez-vous que rien n’existe avant le lancement de la balise PHP. Enregistrez le fichier. Ou, dans l'éditeur de votre choix, vérifiez les options de sauvegarde et assurez-vous qu'il n'est pas configuré pour enregistrer une nomenclature (Byte-Order-Marker) au début du fichier.

2
Otto

Cela peut avoir plusieurs causes. Les en-têtes ne peuvent être envoyés que s'il n'y a pas de sortie avant. Et avec sortie je veux dire any output. Donc, pas d'espaces avant les balises d'ouverture PHP, pas de echos, pas de caractères de nomenclature.

Fondamentalement, ce message d'erreur vous indique exactement à quel endroit la sortie est lancée, c'est pourquoi l'une des choses ci-dessus se produit.

Pour une liste complète des choses que vous devriez vérifier et aussi comment éviter cette erreur, veuillez vous reporter à cette amende message de débordement de pile .

0
PeeHaa