wp_redirect "headers already sent" după trimiterea formularului în front-end

14 ian. 2013, 23:24:25
Vizualizări: 16.6K
Voturi: 2

Încerc să practic crearea unui formular de trimitere a postărilor în front-end. Și primesc această eroare:

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

announcement-submit.php este template-ul meu de mai jos.

Am încercat această soluție, dar nu a funcționat.

De asemenea, când folosesc wp_redirect în codul de mai jos, se inserează DOUĂ postări în loc de una. Când îl elimin, se inserează doar una. Orice ajutor ar fi minunat!

Pentru informații suplimentare: folosesc buddypress cu tema implicită buddypress.

<?php

/*
 * Template Name: Trimite Anunț
  */

$eroareTitluPostare = '';
if ( isset( $_POST['submitted'] ) ) {
    if ( trim( $_POST['postTitle'] ) === '' ) {
        $eroareTitluPostare = 'Te rugăm să introduci un titlu.';
        $areEroare = true;
    }
}


get_header(); ?>

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

            <form action="" id="primaryPostForm" method="POST">
                <fieldset>
                    <label for="postTitle"><?php _e('Titlul Postării:', '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( 'Testez ceva conținut', '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('Adaugă Postarea', 'framework') ?></button>
                </fieldset>
            </form>

            <?php if ( $eroareTitluPostare != '' ) { ?>
                <span class="error"><?php echo $eroareTitluPostare; ?></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'] ) === '' ) {
                        $eroareTitluPostare = 'Te rugăm să introduci un titlu.';
                        $areEroare = true;
                    }
                    $informatiiPostare = 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( $informatiiPostare );                    
                }

                $post_id = wp_insert_post( $informatiiPostare );

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

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

    <?php get_sidebar(); ?>

<?php get_footer(); ?>
2
Comentarii

Verifică acest răspuns http://wordpress.stackexchange.com/a/76993/10413

Anagio Anagio
14 ian. 2013 23:33:11

Mulțumesc pentru răspuns. Asta a rezolvat eroarea, dar nu a adăugat postarea. :(

Josh Josh
15 ian. 2013 00:11:21
Toate răspunsurile la întrebare 3
3

După cum a subliniat Otto, trimiteți date către browser înainte de a apela wp_redirect().

  • get_header() va afișa secțiunea <head> a paginii HTML
  • Afișați întregul formular în pagină înainte de a-l procesa.

Pentru a remedia problema "headers already sent", trebuie să mutați toată procesarea formularului de la baza paginii în partea de sus a acesteia. Dacă trebuie să apelați wp_redirect(), trebuie să faceți acest apel înainte de a afișa orice - HTML sau altceva - în pagină.

În ceea ce privește postarea duplicată, aveți wp_insert_post() de două ori în cod:

if ( isset( $_POST['submitted'] ) && isset( $_POST['post_nonce_field'] ) && wp_verify_nonce( $_POST['post_nonce_field'], 'post_nonce' ) ) {
    if ( trim( $_POST['postTitle'] ) === '' ) {
        $postTitleError = 'Vă rugăm să introduceți un titlu.';
        $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 );

Așadar, încercați să inserați un post de fiecare dată când pagina se încarcă, dar dacă nu a fost trimis nimic, variabila $post_information nu va fi setată și nimic nu va fi inserat. Cu toate acestea, când trimiteți formularul, creați un nou post atât în interiorul verificării booleene, cât și în afara acesteia.

15 ian. 2013 00:33:29
Comentarii

În plus, ar fi mai bine să mutați întregul procesare a formularului în fișierul dvs. de funcții și să-l conectați la o acțiune precum template_redirect, unde sunteți sigur că încă nu a fost trimis nimic către browser.

Mateusz Hajdziony Mateusz Hajdziony
15 ian. 2013 00:40:20

Mulțumesc! Aceasta este ceva pe care aș prefera să o fac pentru a ține lucrurile separate. Cu toate acestea, am căutat în ultima oră pentru a înțelege mai bine cum să folosesc template_redirect sau ce face de fapt. Sunt perplex.

Josh Josh
15 ian. 2013 01:59:37

Ei bine, l-am separat. Și a funcționat! Voi face numele $_POST unice, astfel încât să nu intre în conflict cu nimic altceva.

Josh Josh
15 ian. 2013 02:10:53
4

headere deja trimise de (output început la /home/sadlight/public_html/members/wp-content/themes/default-child/announcement-submit.php:1)

Mesajul de eroare îți spune exact ce trebuie să știi.

Fișierul "announcement-submit.php" este locul unde se află problema.

Numărul "1" indică linia cu problema.

Deci, ai ceva înainte de linia inițială <?php care cauzează output. Poate o linie goală. Sau poate BOM-ul UTF-8.

Încarcă fișierul într-un editor de text simplu. Nimic sofisticat. Notepad, poate. Sau VIM. Asigură-te că nu există nimic înainte de acel tag PHP de început. Salvează fișierul. Sau, în editorul tău preferat, verifică opțiunile de salvare și asigură-te că nu este setat să salveze un BOM (Byte-Order-Marker) la începutul fișierului.

14 ian. 2013 23:29:34
Comentarii

problema e mai mult decât spațiul înainte de <?php, ci întreaga funcție get_header și tot markup-ul afișat înainte de linia cu wp_redirect care e la mijlocul template-ului.

Milo Milo
14 ian. 2013 23:32:15

Mulțumesc pentru răspuns. Am încercat sugestia ta folosind doar Notepad. Am verificat și ca Notepad++ (editorul meu de cod) să salveze UTF-8 fără BOM. Am reîncărcat fișierul... și acum primesc această eroare: Warning: Cannot modify header information - headers already sent by (output started at /home/sadlight/public_html/members/wp-content/plugins/buddypress/bp-themes/bp-default/header.php:2) in /home/sadlight/public_html/members/wp-includes/pluggable.php on line 876 .... Linia 2 din header.php este <html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>

Josh Josh
14 ian. 2013 23:59:00

@Milo Am eliminat tot spațiul alb pe care l-am putut identifica și care avea sens... între linii și după linii. Aceeași eroare.

Josh Josh
15 ian. 2013 00:00:34

Nu ar trebui să existe absolut nimic înaintea acelei linii inițiale PHP. Nici spațiu, nici text, nici cod.

Otto Otto
15 ian. 2013 06:36:12
0

Aceasta poate avea multiple cauze. Anteturile pot fi trimise doar atunci când nu există niciun output înainte de ele. Și prin output mă refer la orice output. Deci nu spații albe înainte de tag-urile PHP de deschidere, nici echo, nici caractere BOM.

Practic, mesajul de eroare îți spune exact unde începe output-ul, deci acolo se întâmplă una dintre lucrurile menționate mai sus.

Pentru o listă completă de lucruri pe care ar trebui să le verifici și cum să previi această eroare, te rog să consulți acest post Stack Overflow.

15 ian. 2013 00:15:27